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 AFSReadMountRootName( void);
463 AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
464 IN ULONG SysNameInfoBufferLength);
467 AFSResetSysNameList( IN AFSSysNameCB *SysNameList);
470 AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
472 IN void *InputBuffer,
473 IN ULONG InputBufferLength,
474 IN OUT void *OutputBuffer,
475 IN ULONG OutputBufferLength,
476 OUT ULONG *ResultLength);
479 AFSExAllocatePoolWithTag( IN POOL_TYPE PoolType,
480 IN SIZE_T NumberOfBytes,
484 AFSExFreePoolWithTag( IN void *Buffer, IN ULONG Tag);
487 AFSShutdownRedirector( void);
490 AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
494 AFSReleaseFcbFromLazyWrite( IN PVOID Fcb);
497 AFSAcquireFcbForReadAhead( IN PVOID Fcb,
501 AFSReleaseFcbFromReadAhead( IN PVOID Fcb);
504 AFSGetCallerSID( OUT UNICODE_STRING *SIDString,
505 OUT BOOLEAN *pbImpersonation);
508 AFSGetSessionId( IN HANDLE ProcessId,
509 OUT BOOLEAN *pbImpersonation);
512 AFSCheckThreadDacl( OUT GUID *AuthGroup);
515 AFSProcessSetProcessDacl( IN AFSProcessCB *ProcessCB);
518 // Prototypes in AFSFastIoSupprt.cpp
522 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
523 IN PLARGE_INTEGER FileOffset,
527 IN BOOLEAN CheckForReadOperation,
528 OUT PIO_STATUS_BLOCK IoStatus,
529 IN struct _DEVICE_OBJECT *DeviceObject);
532 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
533 IN PLARGE_INTEGER FileOffset,
538 OUT PIO_STATUS_BLOCK IoStatus,
539 IN struct _DEVICE_OBJECT *DeviceObject);
542 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
543 IN PLARGE_INTEGER FileOffset,
548 OUT PIO_STATUS_BLOCK IoStatus,
549 IN struct _DEVICE_OBJECT *DeviceObject);
552 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
554 OUT PFILE_BASIC_INFORMATION Buffer,
555 OUT PIO_STATUS_BLOCK IoStatus,
556 IN struct _DEVICE_OBJECT *DeviceObject);
559 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
561 OUT PFILE_STANDARD_INFORMATION Buffer,
562 OUT PIO_STATUS_BLOCK IoStatus,
563 IN struct _DEVICE_OBJECT *DeviceObject);
566 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
567 IN PLARGE_INTEGER FileOffset,
568 IN PLARGE_INTEGER Length,
569 IN PEPROCESS ProcessId,
571 IN BOOLEAN FailImmediately,
572 IN BOOLEAN ExclusiveLock,
573 OUT PIO_STATUS_BLOCK IoStatus,
574 IN struct _DEVICE_OBJECT *DeviceObject);
577 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
578 IN PLARGE_INTEGER FileOffset,
579 IN PLARGE_INTEGER Length,
580 IN PEPROCESS ProcessId,
582 OUT PIO_STATUS_BLOCK IoStatus,
583 IN struct _DEVICE_OBJECT *DeviceObject);
586 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
587 IN PEPROCESS ProcessId,
588 OUT PIO_STATUS_BLOCK IoStatus,
589 IN struct _DEVICE_OBJECT *DeviceObject);
592 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
595 OUT PIO_STATUS_BLOCK IoStatus,
596 IN struct _DEVICE_OBJECT *DeviceObject);
599 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
601 IN PVOID InputBuffer OPTIONAL,
602 IN ULONG InputBufferLength,
603 OUT PVOID OutputBuffer OPTIONAL,
604 IN ULONG OutputBufferLength,
605 IN ULONG IoControlCode,
606 OUT PIO_STATUS_BLOCK IoStatus,
607 IN struct _DEVICE_OBJECT *DeviceObject);
610 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject);
613 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject);
616 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
617 IN struct _DEVICE_OBJECT *TargetDevice);
620 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
622 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
623 OUT struct _IO_STATUS_BLOCK *IoStatus,
624 IN struct _DEVICE_OBJECT *DeviceObject);
627 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
628 IN PLARGE_INTEGER FileOffset,
632 OUT PIO_STATUS_BLOCK IoStatus,
633 IN struct _DEVICE_OBJECT *DeviceObject);
636 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
638 IN struct _DEVICE_OBJECT *DeviceObject);
641 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
642 IN PLARGE_INTEGER FileOffset,
646 OUT PIO_STATUS_BLOCK IoStatus,
647 IN struct _DEVICE_OBJECT *DeviceObject);
650 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
651 IN PLARGE_INTEGER FileOffset,
653 IN struct _DEVICE_OBJECT *DeviceObject);
656 AFSFastIoAcquireForModWrite( IN struct _FILE_OBJECT *FileObject,
657 IN PLARGE_INTEGER EndingOffset,
658 OUT struct _ERESOURCE **ResourceToRelease,
659 IN struct _DEVICE_OBJECT *DeviceObject);
662 AFSFastIoReleaseForModWrite( IN struct _FILE_OBJECT *FileObject,
663 IN struct _ERESOURCE *ResourceToRelease,
664 IN struct _DEVICE_OBJECT *DeviceObject);
667 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
668 IN struct _DEVICE_OBJECT *DeviceObject);
671 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
672 IN struct _DEVICE_OBJECT *DeviceObject);
675 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
676 IN PLARGE_INTEGER FileOffset,
681 OUT PIO_STATUS_BLOCK IoStatus,
682 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
683 IN ULONG CompressedDataInfoLength,
684 IN struct _DEVICE_OBJECT *DeviceObject);
687 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
688 IN PLARGE_INTEGER FileOffset,
693 OUT PIO_STATUS_BLOCK IoStatus,
694 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
695 IN ULONG CompressedDataInfoLength,
696 IN struct _DEVICE_OBJECT *DeviceObject);
699 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
701 IN struct _DEVICE_OBJECT *DeviceObject);
704 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
705 IN PLARGE_INTEGER FileOffset,
707 IN struct _DEVICE_OBJECT *DeviceObject);
710 AFSFastIoQueryOpen( IN struct _IRP *Irp,
711 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
712 IN struct _DEVICE_OBJECT *DeviceObject);
715 // AFSLibrarySupport.cpp Prototypes
719 AFSLoadLibrary( IN ULONG Flags,
720 IN UNICODE_STRING *ServicePath);
723 AFSUnloadLibrary( IN BOOLEAN CancelQueue);
726 AFSCheckLibraryState( IN PIRP Irp);
729 AFSClearLibraryRequest( void);
732 AFSQueueLibraryRequest( IN PIRP Irp);
735 AFSProcessQueuedResults( IN BOOLEAN CancelRequest);
738 AFSSubmitLibraryRequest( IN PIRP Irp);
741 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
742 IN BOOLEAN QueueRootEnumeration);
745 // AFSRDRSupport.cpp Prototypes
749 AFSInitRDRDevice( void);
752 AFSRDRDeviceControl( IN PDEVICE_OBJECT DeviceObject,
756 AFSInitializeRedirector( IN AFSRedirectorInitInfo *CacheFileInfo);
759 AFSCloseRedirector( void);
766 AFSDbgLogMsg( IN ULONG Subsystem,
772 AFSInitializeDbgLog( void);
775 AFSTearDownDbgLog( void);
778 AFSConfigureTrace( IN AFSTraceConfigCB *TraceInfo);
781 AFSGetTraceBuffer( IN ULONG TraceBufferLength,
782 OUT void *TraceBuffer,
783 OUT ULONG_PTR *CopiedLength);
786 AFSTagInitialLogEntry( void);
789 AFSDumpTraceFiles( void);
792 AFSInitializeDumpFile( void);
795 // AFSProcessSupport.cpp Prototypes
799 AFSProcessNotify( IN HANDLE ParentId,
804 AFSProcessNotifyEx( IN OUT PEPROCESS Process,
806 IN OUT PPS_CREATE_NOTIFY_INFO CreateInfo);
809 AFSProcessCreate( IN HANDLE ParentId,
811 IN HANDLE CreatingProcessId,
812 IN HANDLE CreatingThreadId);
815 AFSProcessDestroy( IN HANDLE ProcessId);
818 AFSValidateProcessEntry( IN HANDLE ProcessId,
819 IN BOOLEAN bProcessTreeLocked);
822 AFSIs64BitProcess( IN ULONGLONG ProcessId);
825 AFSInitializeProcessCB( IN ULONGLONG ParentProcessId,
826 IN ULONGLONG ProcessId);
829 AFSInitializeThreadCB( IN AFSProcessCB *ProcessCB,
830 IN ULONGLONG ThreadId);
833 AFSIsUser( IN PSID Sid);
836 AFSRegisterService( void);
839 AFSDeregisterService( void);
846 #endif /* _AFS_COMMON_H */