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 ULONG Code,
404 IN PEXCEPTION_POINTERS ExceptPtrs);
407 AFSAcquireExcl( IN PERESOURCE Resource,
411 AFSAcquireSharedStarveExclusive( IN PERESOURCE Resource,
415 AFSAcquireShared( IN PERESOURCE Resource,
419 AFSReleaseResource( IN PERESOURCE Resource);
422 AFSConvertToShared( IN PERESOURCE Resource);
425 AFSCompleteRequest( IN PIRP Irp,
429 AFSReadRegistry( IN PUNICODE_STRING RegistryPath);
432 AFSUpdateRegistryParameter( IN PUNICODE_STRING ValueName,
435 IN ULONG ValueDataLength);
438 AFSInitializeControlDevice( void);
441 AFSRemoveControlDevice( void);
444 AFSDefaultDispatch( IN PDEVICE_OBJECT DeviceObject,
448 AFSIrpComplete( IN PDEVICE_OBJECT DeviceObject,
453 AFSInitServerStrings( void);
456 AFSReadServerName( void);
459 AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
460 IN ULONG SysNameInfoBufferLength);
463 AFSResetSysNameList( IN AFSSysNameCB *SysNameList);
466 AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
468 IN void *InputBuffer,
469 IN ULONG InputBufferLength,
470 IN OUT void *OutputBuffer,
471 IN ULONG OutputBufferLength,
472 OUT ULONG *ResultLength);
475 AFSExAllocatePoolWithTag( IN POOL_TYPE PoolType,
476 IN SIZE_T NumberOfBytes,
480 AFSExFreePool( IN void *Buffer);
483 AFSShutdownRedirector( void);
486 AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
490 AFSReleaseFcbFromLazyWrite( IN PVOID Fcb);
493 AFSAcquireFcbForReadAhead( IN PVOID Fcb,
497 AFSReleaseFcbFromReadAhead( IN PVOID Fcb);
500 AFSGetCallerSID( OUT UNICODE_STRING *SIDString,
501 OUT BOOLEAN *pbImpersonation);
504 AFSGetSessionId( IN HANDLE ProcessId,
505 OUT BOOLEAN *pbImpersonation);
508 AFSCheckThreadDacl( OUT GUID *AuthGroup);
511 AFSProcessSetProcessDacl( IN AFSProcessCB *ProcessCB);
514 // Prototypes in AFSFastIoSupprt.cpp
518 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
519 IN PLARGE_INTEGER FileOffset,
523 IN BOOLEAN CheckForReadOperation,
524 OUT PIO_STATUS_BLOCK IoStatus,
525 IN struct _DEVICE_OBJECT *DeviceObject);
528 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
529 IN PLARGE_INTEGER FileOffset,
534 OUT PIO_STATUS_BLOCK IoStatus,
535 IN struct _DEVICE_OBJECT *DeviceObject);
538 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
539 IN PLARGE_INTEGER FileOffset,
544 OUT PIO_STATUS_BLOCK IoStatus,
545 IN struct _DEVICE_OBJECT *DeviceObject);
548 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
550 OUT PFILE_BASIC_INFORMATION Buffer,
551 OUT PIO_STATUS_BLOCK IoStatus,
552 IN struct _DEVICE_OBJECT *DeviceObject);
555 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
557 OUT PFILE_STANDARD_INFORMATION Buffer,
558 OUT PIO_STATUS_BLOCK IoStatus,
559 IN struct _DEVICE_OBJECT *DeviceObject);
562 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
563 IN PLARGE_INTEGER FileOffset,
564 IN PLARGE_INTEGER Length,
565 IN PEPROCESS ProcessId,
567 IN BOOLEAN FailImmediately,
568 IN BOOLEAN ExclusiveLock,
569 OUT PIO_STATUS_BLOCK IoStatus,
570 IN struct _DEVICE_OBJECT *DeviceObject);
573 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
574 IN PLARGE_INTEGER FileOffset,
575 IN PLARGE_INTEGER Length,
576 IN PEPROCESS ProcessId,
578 OUT PIO_STATUS_BLOCK IoStatus,
579 IN struct _DEVICE_OBJECT *DeviceObject);
582 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
583 IN PEPROCESS ProcessId,
584 OUT PIO_STATUS_BLOCK IoStatus,
585 IN struct _DEVICE_OBJECT *DeviceObject);
588 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
591 OUT PIO_STATUS_BLOCK IoStatus,
592 IN struct _DEVICE_OBJECT *DeviceObject);
595 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
597 IN PVOID InputBuffer OPTIONAL,
598 IN ULONG InputBufferLength,
599 OUT PVOID OutputBuffer OPTIONAL,
600 IN ULONG OutputBufferLength,
601 IN ULONG IoControlCode,
602 OUT PIO_STATUS_BLOCK IoStatus,
603 IN struct _DEVICE_OBJECT *DeviceObject);
606 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject);
609 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject);
612 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
613 IN struct _DEVICE_OBJECT *TargetDevice);
616 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
618 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
619 OUT struct _IO_STATUS_BLOCK *IoStatus,
620 IN struct _DEVICE_OBJECT *DeviceObject);
623 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
624 IN PLARGE_INTEGER FileOffset,
628 OUT PIO_STATUS_BLOCK IoStatus,
629 IN struct _DEVICE_OBJECT *DeviceObject);
632 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
634 IN struct _DEVICE_OBJECT *DeviceObject);
637 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
638 IN PLARGE_INTEGER FileOffset,
642 OUT PIO_STATUS_BLOCK IoStatus,
643 IN struct _DEVICE_OBJECT *DeviceObject);
646 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
647 IN PLARGE_INTEGER FileOffset,
649 IN struct _DEVICE_OBJECT *DeviceObject);
652 AFSFastIoAcquireForModWrite( IN struct _FILE_OBJECT *FileObject,
653 IN PLARGE_INTEGER EndingOffset,
654 OUT struct _ERESOURCE **ResourceToRelease,
655 IN struct _DEVICE_OBJECT *DeviceObject);
658 AFSFastIoReleaseForModWrite( IN struct _FILE_OBJECT *FileObject,
659 IN struct _ERESOURCE *ResourceToRelease,
660 IN struct _DEVICE_OBJECT *DeviceObject);
663 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
664 IN struct _DEVICE_OBJECT *DeviceObject);
667 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
668 IN struct _DEVICE_OBJECT *DeviceObject);
671 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
672 IN PLARGE_INTEGER FileOffset,
677 OUT PIO_STATUS_BLOCK IoStatus,
678 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
679 IN ULONG CompressedDataInfoLength,
680 IN struct _DEVICE_OBJECT *DeviceObject);
683 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
684 IN PLARGE_INTEGER FileOffset,
689 OUT PIO_STATUS_BLOCK IoStatus,
690 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
691 IN ULONG CompressedDataInfoLength,
692 IN struct _DEVICE_OBJECT *DeviceObject);
695 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
697 IN struct _DEVICE_OBJECT *DeviceObject);
700 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
701 IN PLARGE_INTEGER FileOffset,
703 IN struct _DEVICE_OBJECT *DeviceObject);
706 AFSFastIoQueryOpen( IN struct _IRP *Irp,
707 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
708 IN struct _DEVICE_OBJECT *DeviceObject);
711 // AFSLibrarySupport.cpp Prototypes
715 AFSLoadLibrary( IN ULONG Flags,
716 IN UNICODE_STRING *ServicePath);
719 AFSUnloadLibrary( IN BOOLEAN CancelQueue);
722 AFSCheckLibraryState( IN PIRP Irp);
725 AFSClearLibraryRequest( void);
728 AFSQueueLibraryRequest( IN PIRP Irp);
731 AFSProcessQueuedResults( IN BOOLEAN CancelRequest);
734 AFSSubmitLibraryRequest( IN PIRP Irp);
737 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
738 IN BOOLEAN QueueRootEnumeration);
741 // AFSRDRSupport.cpp Prototypes
745 AFSInitRDRDevice( void);
748 AFSRDRDeviceControl( IN PDEVICE_OBJECT DeviceObject,
752 AFSInitializeRedirector( IN AFSRedirectorInitInfo *CacheFileInfo);
755 AFSCloseRedirector( void);
762 AFSDbgLogMsg( IN ULONG Subsystem,
768 AFSInitializeDbgLog( void);
771 AFSTearDownDbgLog( void);
774 AFSConfigureTrace( IN AFSTraceConfigCB *TraceInfo);
777 AFSGetTraceBuffer( IN ULONG TraceBufferLength,
778 OUT void *TraceBuffer,
779 OUT ULONG_PTR *CopiedLength);
782 AFSTagInitialLogEntry( void);
785 AFSDumpTraceFiles( void);
788 AFSInitializeDumpFile( void);
791 // AFSProcessSupport.cpp Prototypes
795 AFSProcessNotify( IN HANDLE ParentId,
800 AFSValidateProcessEntry( void);
803 AFSIs64BitProcess( IN ULONGLONG ProcessId);
806 AFSInitializeProcessCB( IN ULONGLONG ParentProcessId,
807 IN ULONGLONG ProcessId);
810 AFSInitializeThreadCB( IN AFSProcessCB *ProcessCB,
811 IN ULONGLONG ThreadId);
815 #endif /* _AFS_COMMON_H */