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 // Prototypes in AFSFastIoSupprt.cpp
524 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
525 IN PLARGE_INTEGER FileOffset,
529 IN BOOLEAN CheckForReadOperation,
530 OUT PIO_STATUS_BLOCK IoStatus,
531 IN struct _DEVICE_OBJECT *DeviceObject);
534 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
535 IN PLARGE_INTEGER FileOffset,
540 OUT PIO_STATUS_BLOCK IoStatus,
541 IN struct _DEVICE_OBJECT *DeviceObject);
544 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
545 IN PLARGE_INTEGER FileOffset,
550 OUT PIO_STATUS_BLOCK IoStatus,
551 IN struct _DEVICE_OBJECT *DeviceObject);
554 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
556 OUT PFILE_BASIC_INFORMATION Buffer,
557 OUT PIO_STATUS_BLOCK IoStatus,
558 IN struct _DEVICE_OBJECT *DeviceObject);
561 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
563 OUT PFILE_STANDARD_INFORMATION Buffer,
564 OUT PIO_STATUS_BLOCK IoStatus,
565 IN struct _DEVICE_OBJECT *DeviceObject);
568 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
569 IN PLARGE_INTEGER FileOffset,
570 IN PLARGE_INTEGER Length,
571 IN PEPROCESS ProcessId,
573 IN BOOLEAN FailImmediately,
574 IN BOOLEAN ExclusiveLock,
575 OUT PIO_STATUS_BLOCK IoStatus,
576 IN struct _DEVICE_OBJECT *DeviceObject);
579 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
580 IN PLARGE_INTEGER FileOffset,
581 IN PLARGE_INTEGER Length,
582 IN PEPROCESS ProcessId,
584 OUT PIO_STATUS_BLOCK IoStatus,
585 IN struct _DEVICE_OBJECT *DeviceObject);
588 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
589 IN PEPROCESS ProcessId,
590 OUT PIO_STATUS_BLOCK IoStatus,
591 IN struct _DEVICE_OBJECT *DeviceObject);
594 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
597 OUT PIO_STATUS_BLOCK IoStatus,
598 IN struct _DEVICE_OBJECT *DeviceObject);
601 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
603 IN PVOID InputBuffer OPTIONAL,
604 IN ULONG InputBufferLength,
605 OUT PVOID OutputBuffer OPTIONAL,
606 IN ULONG OutputBufferLength,
607 IN ULONG IoControlCode,
608 OUT PIO_STATUS_BLOCK IoStatus,
609 IN struct _DEVICE_OBJECT *DeviceObject);
612 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject);
615 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject);
618 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
619 IN struct _DEVICE_OBJECT *TargetDevice);
622 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
624 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
625 OUT struct _IO_STATUS_BLOCK *IoStatus,
626 IN struct _DEVICE_OBJECT *DeviceObject);
629 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
630 IN PLARGE_INTEGER FileOffset,
634 OUT PIO_STATUS_BLOCK IoStatus,
635 IN struct _DEVICE_OBJECT *DeviceObject);
638 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
640 IN struct _DEVICE_OBJECT *DeviceObject);
643 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
644 IN PLARGE_INTEGER FileOffset,
648 OUT PIO_STATUS_BLOCK IoStatus,
649 IN struct _DEVICE_OBJECT *DeviceObject);
652 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
653 IN PLARGE_INTEGER FileOffset,
655 IN struct _DEVICE_OBJECT *DeviceObject);
658 AFSFastIoAcquireForModWrite( IN struct _FILE_OBJECT *FileObject,
659 IN PLARGE_INTEGER EndingOffset,
660 OUT struct _ERESOURCE **ResourceToRelease,
661 IN struct _DEVICE_OBJECT *DeviceObject);
664 AFSFastIoReleaseForModWrite( IN struct _FILE_OBJECT *FileObject,
665 IN struct _ERESOURCE *ResourceToRelease,
666 IN struct _DEVICE_OBJECT *DeviceObject);
669 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
670 IN struct _DEVICE_OBJECT *DeviceObject);
673 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
674 IN struct _DEVICE_OBJECT *DeviceObject);
677 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
678 IN PLARGE_INTEGER FileOffset,
683 OUT PIO_STATUS_BLOCK IoStatus,
684 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
685 IN ULONG CompressedDataInfoLength,
686 IN struct _DEVICE_OBJECT *DeviceObject);
689 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
690 IN PLARGE_INTEGER FileOffset,
695 OUT PIO_STATUS_BLOCK IoStatus,
696 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
697 IN ULONG CompressedDataInfoLength,
698 IN struct _DEVICE_OBJECT *DeviceObject);
701 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
703 IN struct _DEVICE_OBJECT *DeviceObject);
706 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
707 IN PLARGE_INTEGER FileOffset,
709 IN struct _DEVICE_OBJECT *DeviceObject);
712 AFSFastIoQueryOpen( IN struct _IRP *Irp,
713 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
714 IN struct _DEVICE_OBJECT *DeviceObject);
717 // AFSLibrarySupport.cpp Prototypes
721 AFSLoadLibrary( IN ULONG Flags,
722 IN UNICODE_STRING *ServicePath);
725 AFSUnloadLibrary( IN BOOLEAN CancelQueue);
728 AFSCheckLibraryState( IN PIRP Irp);
731 AFSClearLibraryRequest( void);
734 AFSQueueLibraryRequest( IN PIRP Irp);
737 AFSProcessQueuedResults( IN BOOLEAN CancelRequest);
740 AFSSubmitLibraryRequest( IN PIRP Irp);
743 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
744 IN BOOLEAN QueueRootEnumeration);
747 // AFSRDRSupport.cpp Prototypes
751 AFSInitRDRDevice( void);
754 AFSRDRDeviceControl( IN PDEVICE_OBJECT DeviceObject,
758 AFSInitializeRedirector( IN AFSRedirectorInitInfo *CacheFileInfo);
761 AFSCloseRedirector( void);
768 AFSDbgLogMsg( IN ULONG Subsystem,
774 AFSInitializeDbgLog( void);
777 AFSTearDownDbgLog( void);
780 AFSConfigureTrace( IN AFSTraceConfigCB *TraceInfo);
783 AFSGetTraceBuffer( IN ULONG TraceBufferLength,
784 OUT void *TraceBuffer,
785 OUT ULONG_PTR *CopiedLength);
788 AFSTagInitialLogEntry( void);
791 AFSDumpTraceFiles( void);
794 AFSInitializeDumpFile( void);
797 // AFSProcessSupport.cpp Prototypes
801 AFSProcessNotify( IN HANDLE ParentId,
806 AFSProcessNotifyEx( IN OUT PEPROCESS Process,
808 IN OUT PPS_CREATE_NOTIFY_INFO CreateInfo);
811 AFSProcessCreate( IN HANDLE ParentId,
813 IN HANDLE CreatingProcessId,
814 IN HANDLE CreatingThreadId);
817 AFSProcessDestroy( IN HANDLE ProcessId);
820 AFSValidateProcessEntry( IN HANDLE ProcessId,
821 IN BOOLEAN bProcessTreeLocked);
824 AFSIs64BitProcess( IN ULONGLONG ProcessId);
827 AFSInitializeProcessCB( IN ULONGLONG ParentProcessId,
828 IN ULONGLONG ProcessId);
831 AFSInitializeThreadCB( IN AFSProcessCB *ProcessCB,
832 IN ULONGLONG ThreadId);
835 AFSIsUser( IN PSID Sid);
838 AFSIsInGroup(IN PSID Sid);
841 AFSRegisterService( void);
844 AFSDeregisterService( void);
851 #endif /* _AFS_COMMON_H */