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,
167 IN OUT void *ResultBuffer,
168 IN OUT PULONG ResultBufferLength);
171 AFSProcessControlRequest( IN PIRP Irp);
174 AFSInitIrpPool( void);
177 AFSCleanupIrpPool( void);
180 AFSProcessIrpRequest( IN PIRP Irp);
183 AFSProcessIrpResult( IN PIRP Irp);
186 AFSInsertRequest( IN AFSCommSrvcCB *CommSrvc,
187 IN AFSPoolEntry *Entry);
190 // AFSCreate.cpp Prototypes
194 AFSCreate( IN PDEVICE_OBJECT DeviceObject,
198 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
202 AFSControlDeviceCreate( IN PIRP Irp);
205 AFSOpenRedirector( IN PIRP Irp);
208 AFSInitRdrFcb( OUT AFSFcb **RdrFcb);
211 AFSRemoveRdrFcb( IN OUT AFSFcb **RdrFcb);
214 // AFSClose.cpp Prototypes
218 AFSClose( IN PDEVICE_OBJECT DeviceObject,
222 AFSCommonClose( IN PDEVICE_OBJECT DeviceObject,
226 // AFSNetworkProviderSupport.cpp
230 AFSAddConnectionEx( IN UNICODE_STRING *RemoteName,
231 IN ULONG DisplayType,
235 AFSInitializeConnectionInfo( IN AFSProviderConnectionCB *Connection,
236 IN ULONG DisplayType);
239 // AFSRead.cpp Prototypes
243 AFSRead( IN PDEVICE_OBJECT DeviceObject,
247 // AFSWrite.cpp Prototypes
251 AFSWrite( IN PDEVICE_OBJECT DeviceObject,
255 // AFSFileInfo.cpp Prototypes
259 AFSQueryFileInfo( IN PDEVICE_OBJECT DeviceObject,
263 AFSSetFileInfo( IN PDEVICE_OBJECT DeviceObject,
267 // AFSEa.cpp Prototypes
271 AFSQueryEA( IN PDEVICE_OBJECT DeviceObject,
275 AFSSetEA( IN PDEVICE_OBJECT DeviceObject,
279 // AFSFlushBuffers.cpp Prototypes
283 AFSFlushBuffers( IN PDEVICE_OBJECT DeviceObject,
287 // AFSVolumeInfo.cpp Prototypes
291 AFSQueryVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
295 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
299 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
303 // AFSDirControl.cpp Prototypes
307 AFSDirControl( IN PDEVICE_OBJECT DeviceObject,
311 // AFSFSControl.cpp Prototypes
315 AFSFSControl( IN PDEVICE_OBJECT DeviceObject,
319 // AFSDevControl.cpp Prototypes
323 AFSDevControl( IN PDEVICE_OBJECT DeviceObject,
327 // AFSInternalDevControl.cpp Prototypes
331 AFSInternalDevControl( IN PDEVICE_OBJECT DeviceObject,
335 // AFSShutdown.cpp Prototypes
339 AFSShutdown( IN PDEVICE_OBJECT DeviceObject,
344 AFSShutdownFilesystem( void);
347 // AFSLockControl.cpp Prototypes
351 AFSLockControl( IN PDEVICE_OBJECT DeviceObject,
355 // AFSCleanup.cpp Prototypes
359 AFSCleanup( IN PDEVICE_OBJECT DeviceObject,
363 AFSCommonCleanup( IN PDEVICE_OBJECT DeviceObject,
367 // AFSSecurity.cpp Prototypes
371 AFSQuerySecurity( IN PDEVICE_OBJECT DeviceObject,
375 AFSSetSecurity( IN PDEVICE_OBJECT DeviceObject,
379 // AFSSystemControl.cpp Prototypes
383 AFSSystemControl( IN PDEVICE_OBJECT DeviceObject,
387 // AFSQuota.cpp Prototypes
391 AFSQueryQuota( IN PDEVICE_OBJECT DeviceObject,
395 AFSSetQuota( IN PDEVICE_OBJECT DeviceObject,
399 // AFSGeneric.cpp Prototypes
403 AFSExceptionFilter( IN CHAR *FunctionString,
405 IN PEXCEPTION_POINTERS ExceptPtrs);
408 AFSAcquireExcl( IN PERESOURCE Resource,
412 AFSAcquireSharedStarveExclusive( IN PERESOURCE Resource,
416 AFSAcquireShared( IN PERESOURCE Resource,
420 AFSReleaseResource( IN PERESOURCE Resource);
423 AFSConvertToShared( IN PERESOURCE Resource);
426 AFSCompleteRequest( IN PIRP Irp,
430 AFSReadRegistry( IN PUNICODE_STRING RegistryPath);
433 AFSUpdateRegistryParameter( IN PUNICODE_STRING ValueName,
436 IN ULONG ValueDataLength);
439 AFSInitializeControlDevice( void);
442 AFSRemoveControlDevice( void);
445 AFSDefaultDispatch( IN PDEVICE_OBJECT DeviceObject,
449 AFSIrpComplete( IN PDEVICE_OBJECT DeviceObject,
454 AFSInitServerStrings( void);
457 AFSReadServerName( void);
460 AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
461 IN ULONG SysNameInfoBufferLength);
464 AFSResetSysNameList( IN AFSSysNameCB *SysNameList);
467 AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
469 IN void *InputBuffer,
470 IN ULONG InputBufferLength,
471 IN OUT void *OutputBuffer,
472 IN ULONG OutputBufferLength,
473 OUT ULONG *ResultLength);
476 AFSExAllocatePoolWithTag( IN POOL_TYPE PoolType,
477 IN SIZE_T NumberOfBytes,
481 AFSExFreePoolWithTag( IN void *Buffer, IN ULONG Tag);
484 AFSShutdownRedirector( void);
487 AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
491 AFSReleaseFcbFromLazyWrite( IN PVOID Fcb);
494 AFSAcquireFcbForReadAhead( IN PVOID Fcb,
498 AFSReleaseFcbFromReadAhead( IN PVOID Fcb);
501 AFSGetCallerSID( OUT UNICODE_STRING *SIDString,
502 OUT BOOLEAN *pbImpersonation);
505 AFSGetSessionId( IN HANDLE ProcessId,
506 OUT BOOLEAN *pbImpersonation);
509 AFSCheckThreadDacl( OUT GUID *AuthGroup);
512 AFSProcessSetProcessDacl( IN AFSProcessCB *ProcessCB);
515 // Prototypes in AFSFastIoSupprt.cpp
519 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
520 IN PLARGE_INTEGER FileOffset,
524 IN BOOLEAN CheckForReadOperation,
525 OUT PIO_STATUS_BLOCK IoStatus,
526 IN struct _DEVICE_OBJECT *DeviceObject);
529 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
530 IN PLARGE_INTEGER FileOffset,
535 OUT PIO_STATUS_BLOCK IoStatus,
536 IN struct _DEVICE_OBJECT *DeviceObject);
539 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
540 IN PLARGE_INTEGER FileOffset,
545 OUT PIO_STATUS_BLOCK IoStatus,
546 IN struct _DEVICE_OBJECT *DeviceObject);
549 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
551 OUT PFILE_BASIC_INFORMATION Buffer,
552 OUT PIO_STATUS_BLOCK IoStatus,
553 IN struct _DEVICE_OBJECT *DeviceObject);
556 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
558 OUT PFILE_STANDARD_INFORMATION Buffer,
559 OUT PIO_STATUS_BLOCK IoStatus,
560 IN struct _DEVICE_OBJECT *DeviceObject);
563 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
564 IN PLARGE_INTEGER FileOffset,
565 IN PLARGE_INTEGER Length,
566 IN PEPROCESS ProcessId,
568 IN BOOLEAN FailImmediately,
569 IN BOOLEAN ExclusiveLock,
570 OUT PIO_STATUS_BLOCK IoStatus,
571 IN struct _DEVICE_OBJECT *DeviceObject);
574 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
575 IN PLARGE_INTEGER FileOffset,
576 IN PLARGE_INTEGER Length,
577 IN PEPROCESS ProcessId,
579 OUT PIO_STATUS_BLOCK IoStatus,
580 IN struct _DEVICE_OBJECT *DeviceObject);
583 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
584 IN PEPROCESS ProcessId,
585 OUT PIO_STATUS_BLOCK IoStatus,
586 IN struct _DEVICE_OBJECT *DeviceObject);
589 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
592 OUT PIO_STATUS_BLOCK IoStatus,
593 IN struct _DEVICE_OBJECT *DeviceObject);
596 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
598 IN PVOID InputBuffer OPTIONAL,
599 IN ULONG InputBufferLength,
600 OUT PVOID OutputBuffer OPTIONAL,
601 IN ULONG OutputBufferLength,
602 IN ULONG IoControlCode,
603 OUT PIO_STATUS_BLOCK IoStatus,
604 IN struct _DEVICE_OBJECT *DeviceObject);
607 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject);
610 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject);
613 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
614 IN struct _DEVICE_OBJECT *TargetDevice);
617 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
619 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
620 OUT struct _IO_STATUS_BLOCK *IoStatus,
621 IN struct _DEVICE_OBJECT *DeviceObject);
624 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
625 IN PLARGE_INTEGER FileOffset,
629 OUT PIO_STATUS_BLOCK IoStatus,
630 IN struct _DEVICE_OBJECT *DeviceObject);
633 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
635 IN struct _DEVICE_OBJECT *DeviceObject);
638 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
639 IN PLARGE_INTEGER FileOffset,
643 OUT PIO_STATUS_BLOCK IoStatus,
644 IN struct _DEVICE_OBJECT *DeviceObject);
647 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
648 IN PLARGE_INTEGER FileOffset,
650 IN struct _DEVICE_OBJECT *DeviceObject);
653 AFSFastIoAcquireForModWrite( IN struct _FILE_OBJECT *FileObject,
654 IN PLARGE_INTEGER EndingOffset,
655 OUT struct _ERESOURCE **ResourceToRelease,
656 IN struct _DEVICE_OBJECT *DeviceObject);
659 AFSFastIoReleaseForModWrite( IN struct _FILE_OBJECT *FileObject,
660 IN struct _ERESOURCE *ResourceToRelease,
661 IN struct _DEVICE_OBJECT *DeviceObject);
664 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
665 IN struct _DEVICE_OBJECT *DeviceObject);
668 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
669 IN struct _DEVICE_OBJECT *DeviceObject);
672 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
673 IN PLARGE_INTEGER FileOffset,
678 OUT PIO_STATUS_BLOCK IoStatus,
679 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
680 IN ULONG CompressedDataInfoLength,
681 IN struct _DEVICE_OBJECT *DeviceObject);
684 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
685 IN PLARGE_INTEGER FileOffset,
690 OUT PIO_STATUS_BLOCK IoStatus,
691 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
692 IN ULONG CompressedDataInfoLength,
693 IN struct _DEVICE_OBJECT *DeviceObject);
696 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
698 IN struct _DEVICE_OBJECT *DeviceObject);
701 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
702 IN PLARGE_INTEGER FileOffset,
704 IN struct _DEVICE_OBJECT *DeviceObject);
707 AFSFastIoQueryOpen( IN struct _IRP *Irp,
708 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
709 IN struct _DEVICE_OBJECT *DeviceObject);
712 // AFSLibrarySupport.cpp Prototypes
716 AFSLoadLibrary( IN ULONG Flags,
717 IN UNICODE_STRING *ServicePath);
720 AFSUnloadLibrary( IN BOOLEAN CancelQueue);
723 AFSCheckLibraryState( IN PIRP Irp);
726 AFSClearLibraryRequest( void);
729 AFSQueueLibraryRequest( IN PIRP Irp);
732 AFSProcessQueuedResults( IN BOOLEAN CancelRequest);
735 AFSSubmitLibraryRequest( IN PIRP Irp);
738 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
739 IN BOOLEAN QueueRootEnumeration);
742 // AFSRDRSupport.cpp Prototypes
746 AFSInitRDRDevice( void);
749 AFSRDRDeviceControl( IN PDEVICE_OBJECT DeviceObject,
753 AFSInitializeRedirector( IN AFSRedirectorInitInfo *CacheFileInfo);
756 AFSCloseRedirector( void);
763 AFSDbgLogMsg( IN ULONG Subsystem,
769 AFSInitializeDbgLog( void);
772 AFSTearDownDbgLog( void);
775 AFSConfigureTrace( IN AFSTraceConfigCB *TraceInfo);
778 AFSGetTraceBuffer( IN ULONG TraceBufferLength,
779 OUT void *TraceBuffer,
780 OUT ULONG_PTR *CopiedLength);
783 AFSTagInitialLogEntry( void);
786 AFSDumpTraceFiles( void);
789 AFSInitializeDumpFile( void);
792 // AFSProcessSupport.cpp Prototypes
796 AFSProcessNotify( IN HANDLE ParentId,
801 AFSProcessNotifyEx( IN OUT PEPROCESS Process,
803 IN OUT PPS_CREATE_NOTIFY_INFO CreateInfo);
806 AFSProcessCreate( IN HANDLE ParentId,
808 IN HANDLE CreatingProcessId,
809 IN HANDLE CreatingThreadId);
812 AFSProcessDestroy( IN HANDLE ProcessId);
815 AFSValidateProcessEntry( IN HANDLE ProcessId);
818 AFSIs64BitProcess( IN ULONGLONG ProcessId);
821 AFSInitializeProcessCB( IN ULONGLONG ParentProcessId,
822 IN ULONGLONG ProcessId);
825 AFSInitializeThreadCB( IN AFSProcessCB *ProcessCB,
826 IN ULONGLONG ThreadId);
830 #endif /* _AFS_COMMON_H */