2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 #define AFS_KERNEL_MODE
48 #include <wdmsec.h> // for IoCreateDeviceSecure
51 #include "AFSDefines.h"
53 #include "AFSUserDefines.h"
55 #include "AFSUserIoctl.h"
57 #include "AFSUserStructs.h"
59 #include "AFSRedirCommonDefines.h"
61 #include "AFSRedirCommonStructs.h"
63 #include "AFSStructs.h"
65 #include "AFSProvider.h"
68 #include "AFSExtern.h"
72 #include "ntstrsafe.h"
75 ZwQueryInformationProcess(
76 __in HANDLE ProcessHandle,
77 __in PROCESSINFOCLASS ProcessInformationClass,
78 __out PVOID ProcessInformation,
79 __in ULONG ProcessInformationLength,
80 __out_opt PULONG ReturnLength
84 // AFSInit.cpp Prototypes
88 DriverEntry( IN PDRIVER_OBJECT DriverObj,
89 IN PUNICODE_STRING RegPath);
92 AFSUnload( IN PDRIVER_OBJECT DriverObject);
95 // AFSAuthGroupSupport.cpp
99 AFSRetrieveAuthGroup( IN ULONGLONG ProcessId,
100 IN ULONGLONG ThreadId,
101 OUT GUID *AuthGroup);
104 AFSIsLocalSystemAuthGroup( IN GUID *AuthGroup);
107 AFSIsLocalSystemSID( IN UNICODE_STRING *SIDString);
110 AFSIsNoPAGAuthGroup( IN GUID *AuthGroup);
113 AFSCreateSetProcessAuthGroup( AFSAuthGroupRequestCB *CreateSetAuthGroup);
116 AFSQueryProcessAuthGroupList( IN GUID *GUIDList,
117 IN ULONG BufferLength,
118 OUT ULONG_PTR *ReturnLength);
121 AFSSetActiveProcessAuthGroup( IN AFSAuthGroupRequestCB *ActiveAuthGroup);
124 AFSResetActiveProcessAuthGroup( IN AFSAuthGroupRequestCB *ActiveAuthGroup);
127 AFSCreateAuthGroupForSIDorLogonSession( IN AFSAuthGroupRequestCB *AuthGroupRequestCB,
128 IN BOOLEAN bLogonSession);
131 AFSQueryAuthGroup( IN AFSAuthGroupRequestCB *AuthGroupRequestCB,
132 OUT GUID *AuthGroupGUID,
133 OUT ULONG_PTR *ReturnLength);
136 // AFSBTreeSupport.cpp Prototypes
140 AFSLocateHashEntry( IN AFSBTreeEntry *TopNode,
141 IN ULONGLONG HashIndex,
142 IN OUT AFSBTreeEntry **TreeEntry);
145 AFSInsertHashEntry( IN AFSBTreeEntry *TopNode,
146 IN AFSBTreeEntry *FileIDEntry);
149 AFSRemoveHashEntry( IN AFSBTreeEntry **TopNode,
150 IN AFSBTreeEntry *FileIDEntry);
153 // AFSCommSupport.cpp Prototypes
157 AFSReleaseFid( IN AFSFileID *FileId);
160 AFSProcessRequest( IN ULONG RequestType,
161 IN ULONG RequestFlags,
163 IN PUNICODE_STRING FileName,
164 IN AFSFileID *FileId,
169 IN OUT void *ResultBuffer,
170 IN OUT PULONG ResultBufferLength);
173 AFSProcessControlRequest( IN PIRP Irp);
176 AFSInitIrpPool( void);
179 AFSCleanupIrpPool( void);
182 AFSProcessIrpRequest( IN PIRP Irp);
185 AFSProcessIrpResult( IN PIRP Irp);
188 AFSInsertRequest( IN AFSCommSrvcCB *CommSrvc,
189 IN AFSPoolEntry *Entry);
192 // AFSCreate.cpp Prototypes
196 AFSCreate( IN PDEVICE_OBJECT DeviceObject,
200 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
204 AFSControlDeviceCreate( IN PIRP Irp);
207 AFSOpenRedirector( IN PIRP Irp);
210 AFSInitRdrFcb( OUT AFSFcb **RdrFcb);
213 AFSRemoveRdrFcb( IN OUT AFSFcb **RdrFcb);
216 // AFSClose.cpp Prototypes
220 AFSClose( IN PDEVICE_OBJECT DeviceObject,
224 AFSCommonClose( IN PDEVICE_OBJECT DeviceObject,
228 // AFSNetworkProviderSupport.cpp
232 AFSAddConnectionEx( IN UNICODE_STRING *RemoteName,
233 IN ULONG DisplayType,
237 AFSInitializeConnectionInfo( IN AFSProviderConnectionCB *Connection,
238 IN ULONG DisplayType);
241 // AFSRead.cpp Prototypes
245 AFSRead( IN PDEVICE_OBJECT DeviceObject,
249 // AFSWrite.cpp Prototypes
253 AFSWrite( IN PDEVICE_OBJECT DeviceObject,
257 // AFSFileInfo.cpp Prototypes
261 AFSQueryFileInfo( IN PDEVICE_OBJECT DeviceObject,
265 AFSSetFileInfo( IN PDEVICE_OBJECT DeviceObject,
269 // AFSEa.cpp Prototypes
273 AFSQueryEA( IN PDEVICE_OBJECT DeviceObject,
277 AFSSetEA( IN PDEVICE_OBJECT DeviceObject,
281 // AFSFlushBuffers.cpp Prototypes
285 AFSFlushBuffers( IN PDEVICE_OBJECT DeviceObject,
289 // AFSVolumeInfo.cpp Prototypes
293 AFSQueryVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
297 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
301 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
305 // AFSDirControl.cpp Prototypes
309 AFSDirControl( IN PDEVICE_OBJECT DeviceObject,
313 // AFSFSControl.cpp Prototypes
317 AFSFSControl( IN PDEVICE_OBJECT DeviceObject,
321 // AFSDevControl.cpp Prototypes
325 AFSDevControl( IN PDEVICE_OBJECT DeviceObject,
329 // AFSInternalDevControl.cpp Prototypes
333 AFSInternalDevControl( IN PDEVICE_OBJECT DeviceObject,
337 // AFSShutdown.cpp Prototypes
341 AFSShutdown( IN PDEVICE_OBJECT DeviceObject,
346 AFSShutdownFilesystem( void);
349 // AFSLockControl.cpp Prototypes
353 AFSLockControl( IN PDEVICE_OBJECT DeviceObject,
357 // AFSCleanup.cpp Prototypes
361 AFSCleanup( IN PDEVICE_OBJECT DeviceObject,
365 AFSCommonCleanup( IN PDEVICE_OBJECT DeviceObject,
369 // AFSSecurity.cpp Prototypes
373 AFSQuerySecurity( IN PDEVICE_OBJECT DeviceObject,
377 AFSSetSecurity( IN PDEVICE_OBJECT DeviceObject,
381 // AFSSystemControl.cpp Prototypes
385 AFSSystemControl( IN PDEVICE_OBJECT DeviceObject,
389 // AFSQuota.cpp Prototypes
393 AFSQueryQuota( IN PDEVICE_OBJECT DeviceObject,
397 AFSSetQuota( IN PDEVICE_OBJECT DeviceObject,
401 // AFSGeneric.cpp Prototypes
405 AFSExceptionFilter( IN CHAR *FunctionString,
407 IN PEXCEPTION_POINTERS ExceptPtrs);
410 AFSAcquireExcl( IN PERESOURCE Resource,
414 AFSAcquireSharedStarveExclusive( IN PERESOURCE Resource,
418 AFSAcquireShared( IN PERESOURCE Resource,
422 AFSReleaseResource( IN PERESOURCE Resource);
425 AFSConvertToShared( IN PERESOURCE Resource);
428 AFSCompleteRequest( IN PIRP Irp,
432 AFSReadRegistry( IN PUNICODE_STRING RegistryPath);
435 AFSUpdateRegistryParameter( IN PUNICODE_STRING ValueName,
438 IN ULONG ValueDataLength);
441 AFSInitializeControlDevice( void);
444 AFSRemoveControlDevice( void);
447 AFSDefaultDispatch( IN PDEVICE_OBJECT DeviceObject,
451 AFSIrpComplete( IN PDEVICE_OBJECT DeviceObject,
456 AFSInitServerStrings( void);
459 AFSReadServerName( void);
462 AFSReadMountRootName( void);
465 AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
466 IN ULONG SysNameInfoBufferLength);
469 AFSResetSysNameList( IN AFSSysNameCB *SysNameList);
472 AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
474 IN void *InputBuffer,
475 IN ULONG InputBufferLength,
476 IN OUT void *OutputBuffer,
477 IN ULONG OutputBufferLength,
478 OUT ULONG *ResultLength);
481 AFSExAllocatePoolWithTag( IN POOL_TYPE PoolType,
482 IN SIZE_T NumberOfBytes,
486 AFSExFreePoolWithTag( IN void *Buffer, IN ULONG Tag);
489 AFSShutdownRedirector( void);
492 AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
496 AFSReleaseFcbFromLazyWrite( IN PVOID Fcb);
499 AFSAcquireFcbForReadAhead( IN PVOID Fcb,
503 AFSReleaseFcbFromReadAhead( IN PVOID Fcb);
506 AFSGetCallerSID( OUT UNICODE_STRING *SIDString,
507 OUT BOOLEAN *pbImpersonation);
510 AFSGetSessionId( IN HANDLE ProcessId,
511 OUT BOOLEAN *pbImpersonation);
514 AFSCheckThreadDacl( OUT GUID *AuthGroup);
517 AFSProcessSetProcessDacl( IN AFSProcessCB *ProcessCB);
520 AFSSetReparsePointPolicy( IN AFSSetReparsePointPolicyCB *Policy);
523 // Prototypes in AFSFastIoSupprt.cpp
527 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
528 IN PLARGE_INTEGER FileOffset,
532 IN BOOLEAN CheckForReadOperation,
533 OUT PIO_STATUS_BLOCK IoStatus,
534 IN struct _DEVICE_OBJECT *DeviceObject);
537 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
538 IN PLARGE_INTEGER FileOffset,
543 OUT PIO_STATUS_BLOCK IoStatus,
544 IN struct _DEVICE_OBJECT *DeviceObject);
547 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
548 IN PLARGE_INTEGER FileOffset,
553 OUT PIO_STATUS_BLOCK IoStatus,
554 IN struct _DEVICE_OBJECT *DeviceObject);
557 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
559 OUT PFILE_BASIC_INFORMATION Buffer,
560 OUT PIO_STATUS_BLOCK IoStatus,
561 IN struct _DEVICE_OBJECT *DeviceObject);
564 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
566 OUT PFILE_STANDARD_INFORMATION Buffer,
567 OUT PIO_STATUS_BLOCK IoStatus,
568 IN struct _DEVICE_OBJECT *DeviceObject);
571 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
572 IN PLARGE_INTEGER FileOffset,
573 IN PLARGE_INTEGER Length,
574 IN PEPROCESS ProcessId,
576 IN BOOLEAN FailImmediately,
577 IN BOOLEAN ExclusiveLock,
578 OUT PIO_STATUS_BLOCK IoStatus,
579 IN struct _DEVICE_OBJECT *DeviceObject);
582 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
583 IN PLARGE_INTEGER FileOffset,
584 IN PLARGE_INTEGER Length,
585 IN PEPROCESS ProcessId,
587 OUT PIO_STATUS_BLOCK IoStatus,
588 IN struct _DEVICE_OBJECT *DeviceObject);
591 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
592 IN PEPROCESS ProcessId,
593 OUT PIO_STATUS_BLOCK IoStatus,
594 IN struct _DEVICE_OBJECT *DeviceObject);
597 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
600 OUT PIO_STATUS_BLOCK IoStatus,
601 IN struct _DEVICE_OBJECT *DeviceObject);
604 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
606 IN PVOID InputBuffer OPTIONAL,
607 IN ULONG InputBufferLength,
608 OUT PVOID OutputBuffer OPTIONAL,
609 IN ULONG OutputBufferLength,
610 IN ULONG IoControlCode,
611 OUT PIO_STATUS_BLOCK IoStatus,
612 IN struct _DEVICE_OBJECT *DeviceObject);
615 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject);
618 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject);
621 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
622 IN struct _DEVICE_OBJECT *TargetDevice);
625 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
627 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
628 OUT struct _IO_STATUS_BLOCK *IoStatus,
629 IN struct _DEVICE_OBJECT *DeviceObject);
632 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
633 IN PLARGE_INTEGER FileOffset,
637 OUT PIO_STATUS_BLOCK IoStatus,
638 IN struct _DEVICE_OBJECT *DeviceObject);
641 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
643 IN struct _DEVICE_OBJECT *DeviceObject);
646 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
647 IN PLARGE_INTEGER FileOffset,
651 OUT PIO_STATUS_BLOCK IoStatus,
652 IN struct _DEVICE_OBJECT *DeviceObject);
655 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
656 IN PLARGE_INTEGER FileOffset,
658 IN struct _DEVICE_OBJECT *DeviceObject);
661 AFSFastIoAcquireForModWrite( IN struct _FILE_OBJECT *FileObject,
662 IN PLARGE_INTEGER EndingOffset,
663 OUT struct _ERESOURCE **ResourceToRelease,
664 IN struct _DEVICE_OBJECT *DeviceObject);
667 AFSFastIoReleaseForModWrite( IN struct _FILE_OBJECT *FileObject,
668 IN struct _ERESOURCE *ResourceToRelease,
669 IN struct _DEVICE_OBJECT *DeviceObject);
672 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
673 IN struct _DEVICE_OBJECT *DeviceObject);
676 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
677 IN struct _DEVICE_OBJECT *DeviceObject);
680 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
681 IN PLARGE_INTEGER FileOffset,
686 OUT PIO_STATUS_BLOCK IoStatus,
687 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
688 IN ULONG CompressedDataInfoLength,
689 IN struct _DEVICE_OBJECT *DeviceObject);
692 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
693 IN PLARGE_INTEGER FileOffset,
698 OUT PIO_STATUS_BLOCK IoStatus,
699 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
700 IN ULONG CompressedDataInfoLength,
701 IN struct _DEVICE_OBJECT *DeviceObject);
704 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
706 IN struct _DEVICE_OBJECT *DeviceObject);
709 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
710 IN PLARGE_INTEGER FileOffset,
712 IN struct _DEVICE_OBJECT *DeviceObject);
715 AFSFastIoQueryOpen( IN struct _IRP *Irp,
716 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
717 IN struct _DEVICE_OBJECT *DeviceObject);
720 // AFSLibrarySupport.cpp Prototypes
724 AFSLoadLibrary( IN ULONG Flags,
725 IN UNICODE_STRING *ServicePath);
728 AFSUnloadLibrary( IN BOOLEAN CancelQueue);
731 AFSCheckLibraryState( IN PIRP Irp);
734 AFSClearLibraryRequest( void);
737 AFSQueueLibraryRequest( IN PIRP Irp);
740 AFSProcessQueuedResults( IN BOOLEAN CancelRequest);
743 AFSSubmitLibraryRequest( IN PIRP Irp);
746 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
747 IN BOOLEAN QueueRootEnumeration);
750 AFSConfigLibraryDebug( void);
753 // AFSRDRSupport.cpp Prototypes
757 AFSInitRDRDevice( void);
760 AFSRDRDeviceControl( IN PDEVICE_OBJECT DeviceObject,
764 AFSInitializeRedirector( IN AFSRedirectorInitInfo *CacheFileInfo);
767 AFSCloseRedirector( void);
774 AFSDbgLogMsg( IN ULONG Subsystem,
780 AFSInitializeDbgLog( void);
783 AFSTearDownDbgLog( void);
786 AFSConfigureTrace( IN AFSTraceConfigCB *TraceInfo);
789 AFSGetTraceBuffer( IN ULONG TraceBufferLength,
790 OUT void *TraceBuffer,
791 OUT ULONG_PTR *CopiedLength);
794 AFSTagInitialLogEntry( void);
797 AFSDumpTraceFiles( void);
800 AFSInitializeDumpFile( void);
803 // AFSProcessSupport.cpp Prototypes
807 AFSProcessNotify( IN HANDLE ParentId,
812 AFSProcessNotifyEx( IN OUT PEPROCESS Process,
814 IN OUT PPS_CREATE_NOTIFY_INFO CreateInfo);
817 AFSProcessCreate( IN HANDLE ParentId,
819 IN HANDLE CreatingProcessId,
820 IN HANDLE CreatingThreadId);
823 AFSProcessDestroy( IN HANDLE ProcessId);
826 AFSValidateProcessEntry( IN HANDLE ProcessId,
827 IN BOOLEAN bProcessTreeLocked);
830 AFSIs64BitProcess( IN ULONGLONG ProcessId);
833 AFSInitializeProcessCB( IN ULONGLONG ParentProcessId,
834 IN ULONGLONG ProcessId);
837 AFSInitializeThreadCB( IN AFSProcessCB *ProcessCB,
838 IN ULONGLONG ThreadId);
841 AFSIsUser( IN PSID Sid);
844 AFSIsInGroup(IN PSID Sid);
847 AFSRegisterService( void);
850 AFSDeregisterService( void);
857 #endif /* _AFS_COMMON_H */