/*++ Copyright (c) 1989-2000 Microsoft Corporation Module Name: iomgr.h Abstract: This module contains the private structure definitions and APIs used by the NT I/O system. Author: Nar Ganapathy (narg) 1-Jan-1999 Revision History: --*/ #ifndef _IOMGR_ #define _IOMGR_ // // Define Information fields values for the return value from popups when a // volume mount is in progress but failed. // #define IOP_ABORT 1 #include "ntos.h" #include "ntdddisk.h" #include "ntddscsi.h" #include "mountmgr.h" #include "ntiolog.h" #include "ntiologc.h" #include "ntseapi.h" #include "fsrtl.h" #include "zwapi.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "safeboot.h" #include "ioverifier.h" #include "iopcmn.h" #ifdef POOL_TAGGING #undef ExAllocatePool #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' oI') #undef ExAllocatePoolWithQuota #define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' oI') #endif typedef struct _DUMP_CONTROL_BLOCK DUMP_CONTROL_BLOCK, *PDUMP_CONTROL_BLOCK; // // Define the type for entries placed on the driver reinitialization queue. // These entries are entered onto the tail when the driver requests that // it be reinitialized, and removed from the head by the code that actually // performs the reinitialization. // typedef struct _REINIT_PACKET { LIST_ENTRY ListEntry; PDRIVER_OBJECT DriverObject; PDRIVER_REINITIALIZE DriverReinitializationRoutine; PVOID Context; } REINIT_PACKET, *PREINIT_PACKET; // // Define transfer types for process counters. // typedef enum _TRANSFER_TYPE { ReadTransfer, WriteTransfer, OtherTransfer } TRANSFER_TYPE, *PTRANSFER_TYPE; // // Define the maximum amount of memory that can be allocated for all // outstanding error log packets. // #define IOP_MAXIMUM_LOG_ALLOCATION PAGE_SIZE // // Define an error log entry. // typedef struct _ERROR_LOG_ENTRY { USHORT Type; USHORT Size; LIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; PDRIVER_OBJECT DriverObject; LARGE_INTEGER TimeStamp; } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY; // // Define both the global IOP_HARD_ERROR_QUEUE and IOP_HARD_ERROR_PACKET // structures. Also set the maximum number of outstanding hard error // packets allowed. // typedef struct _IOP_HARD_ERROR_QUEUE { WORK_QUEUE_ITEM ExWorkItem; LIST_ENTRY WorkQueue; KSPIN_LOCK WorkQueueSpinLock; KSEMAPHORE WorkQueueSemaphore; BOOLEAN ThreadStarted; ULONG NumPendingApcPopups; } IOP_HARD_ERROR_QUEUE, *PIOP_HARD_ERROR_QUEUE; typedef struct _IOP_HARD_ERROR_PACKET { LIST_ENTRY WorkQueueLinks; NTSTATUS ErrorStatus; UNICODE_STRING String; } IOP_HARD_ERROR_PACKET, *PIOP_HARD_ERROR_PACKET; typedef struct _IOP_APC_HARD_ERROR_PACKET { WORK_QUEUE_ITEM Item; PIRP Irp; PVPB Vpb; PDEVICE_OBJECT RealDeviceObject; } IOP_APC_HARD_ERROR_PACKET, *PIOP_APC_HARD_ERROR_PACKET; typedef NTSTATUS (FASTCALL *PIO_CALL_DRIVER) ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); typedef VOID (FASTCALL *PIO_COMPLETE_REQUEST) ( IN PIRP Irp, IN CCHAR PriorityBoost ); typedef VOID (*PIO_FREE_IRP) ( IN struct _IRP *Irp ); typedef PIRP (*PIO_ALLOCATE_IRP) ( IN CCHAR StackSize, IN BOOLEAN ChargeQuota ); extern IOP_HARD_ERROR_QUEUE IopHardError; extern PIOP_HARD_ERROR_PACKET IopCurrentHardError; #define IOP_MAXIMUM_OUTSTANDING_HARD_ERRORS 25 typedef struct _IO_WORKITEM { WORK_QUEUE_ITEM WorkItem; PIO_WORKITEM_ROUTINE Routine; PDEVICE_OBJECT DeviceObject; PVOID Context; #if DBG ULONG Size; #endif } IO_WORKITEM; // // Define the global data for the error logger and I/O system. // extern WORK_QUEUE_ITEM IopErrorLogWorkItem; extern BOOLEAN IopErrorLogPortPending; extern BOOLEAN IopErrorLogDisabledThisBoot; extern KSPIN_LOCK IopErrorLogLock; extern LIST_ENTRY IopErrorLogListHead; extern ULONG IopErrorLogAllocation; extern KSPIN_LOCK IopErrorLogAllocationLock; extern const GENERIC_MAPPING IopFileMapping; // // Define a dummy file object for use on stack for fast open operations. // typedef struct _DUMMY_FILE_OBJECT { OBJECT_HEADER ObjectHeader; CHAR FileObjectBody[ sizeof( FILE_OBJECT ) ]; } DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT; // // Define the structures private to the I/O system. // #define OPEN_PACKET_PATTERN 0xbeaa0251 // // Define an Open Packet (OP). An OP is used to communicate information // between the NtCreateFile service executing in the context of the caller // and the device object parse routine. It is the parse routine who actually // creates the file object for the file. // typedef struct _OPEN_PACKET { CSHORT Type; CSHORT Size; PFILE_OBJECT FileObject; NTSTATUS FinalStatus; ULONG_PTR Information; ULONG ParseCheck; PFILE_OBJECT RelatedFileObject; // // The following are the open-specific parameters. Notice that the desired // access field is passed through to the parse routine via the object // management architecture, so it does not need to be repeated here. Also // note that the same is true for the file name. // LARGE_INTEGER AllocationSize; ULONG CreateOptions; USHORT FileAttributes; USHORT ShareAccess; PVOID EaBuffer; ULONG EaLength; ULONG Options; ULONG Disposition; // // The following is used when performing a fast query during open to get // back the file attributes for a file. // PFILE_BASIC_INFORMATION BasicInformation; // // The following is used when performing a fast network query during open // to get back the network file attributes for a file. // PFILE_NETWORK_OPEN_INFORMATION NetworkInformation; // // The type of file to create. // CREATE_FILE_TYPE CreateFileType; // // The following pointer provides a way of passing the parameters // specific to the file type of the file being created to the parse // routine. // PVOID ExtraCreateParameters; // // The following is used to indicate that an open of a device has been // performed and the access check for the device has already been done, // but because of a reparse, the I/O system has been called again for // the same device. Since the access check has already been made, the // state cannot handle being called again (access was already granted) // and it need not anyway since the check has already been made. // BOOLEAN Override; // // The following is used to indicate that a file is being opened for the // sole purpose of querying its attributes. This causes a considerable // number of shortcuts to be taken in the parse, query, and close paths. // BOOLEAN QueryOnly; // // The following is used to indicate that a file is being opened for the // sole purpose of deleting it. This causes a considerable number of // shortcurs to be taken in the parse and close paths. // BOOLEAN DeleteOnly; // // The following is used to indicate that a file being opened for a query // only is being opened to query its network attributes rather than just // its FAT file attributes. // BOOLEAN FullAttributes; // // The following pointer is used when a fast open operation for a fast // delete or fast query attributes call is being made rather than a // general file open. The dummy file object is actually stored on the // the caller's stack rather than allocated pool to speed things up. // PDUMMY_FILE_OBJECT LocalFileObject; // // The following is used to indicate we passed through a mount point while // parsing the filename. We use this to do an extra check on the device type // for the final file // BOOLEAN TraversedMountPoint; // // Device object where the create should start if present on the stack // Applicable for kernel opens only. // ULONG InternalFlags; // Passed from IopCreateFile PDEVICE_OBJECT TopDeviceObjectHint; } OPEN_PACKET, *POPEN_PACKET; // // Define a Load Packet (LDP). An LDP is used to communicate load and unload // driver information between the appropriate system services and the routine // that actually performs the work. This is implemented using a packet // because various drivers need to be initialized in the context of THE // system process because they create threads within its context which open // handles to objects that henceforth are only valid in the context of that // process. // typedef struct _LOAD_PACKET { WORK_QUEUE_ITEM WorkQueueItem; KEVENT Event; PDRIVER_OBJECT DriverObject; PUNICODE_STRING DriverServiceName; NTSTATUS FinalStatus; } LOAD_PACKET, *PLOAD_PACKET; // // Define a Link Tracking Packet. A link tracking packet is used to open the // user-mode link tracking service's LPC port so that information about objects // which have been moved can be tracked. // typedef struct _LINK_TRACKING_PACKET { WORK_QUEUE_ITEM WorkQueueItem; KEVENT Event; NTSTATUS FinalStatus; } LINK_TRACKING_PACKET, *PLINK_TRACKING_PACKET; // // Define the type for entries placed on the driver shutdown notification queue. // These entries represent those drivers that would like to be notified that the // system is begin shutdown before it actually goes down. // typedef struct _SHUTDOWN_PACKET { LIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; } SHUTDOWN_PACKET, *PSHUTDOWN_PACKET; // // Define the type for entries placed on the file system registration change // notification queue. // typedef struct _NOTIFICATION_PACKET { LIST_ENTRY ListEntry; PDRIVER_OBJECT DriverObject; PDRIVER_FS_NOTIFICATION NotificationRoutine; } NOTIFICATION_PACKET, *PNOTIFICATION_PACKET; // // Define I/O completion packet types. // typedef enum _COMPLETION_PACKET_TYPE { IopCompletionPacketIrp, IopCompletionPacketMini, IopCompletionPacketQuota } COMPLETION_PACKET_TYPE, *PCOMPLETION_PACKET_TYPE; // // Define the type for completion packets inserted onto completion ports when // there is no full I/O request packet that was used to perform the I/O // operation. This occurs when the fast I/O path is used, and when the user // directly inserts a completion message. // typedef struct _IOP_MINI_COMPLETION_PACKET { // // The following unnamed structure must be exactly identical // to the unnamed structure used in the IRP overlay section used // for completion queue entries. // struct { // // List entry - used to queue the packet to completion queue, among // others. // LIST_ENTRY ListEntry; union { // // Current stack location - contains a pointer to the current // IO_STACK_LOCATION structure in the IRP stack. This field // should never be directly accessed by drivers. They should // use the standard functions. // struct _IO_STACK_LOCATION *CurrentStackLocation; // // Minipacket type. // ULONG PacketType; }; }; PVOID KeyContext; PVOID ApcContext; NTSTATUS IoStatus; ULONG_PTR IoStatusInformation; } IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET; typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT { PDEVICE_OBJECT DeviceObject; PVOID Context; PIO_COMPLETION_ROUTINE CompletionRoutine; } IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT; typedef struct _IOP_RESERVE_IRP_ALLOCATOR { PIRP ReserveIrp; LONG IrpAllocated; KEVENT Event; CCHAR ReserveIrpStackSize; } IOP_RESERVE_IRP_ALLOCATOR, *PIOP_RESERVE_IRP_ALLOCATOR; // // This structure is the extension to a fileobject if the flag // FO_FILE_OBJECT_HAS_EXTENSION is set in the fileobject. // typedef struct _IOP_FILE_OBJECT_EXTENSION { ULONG FileObjectExtensionFlags; PDEVICE_OBJECT TopDeviceObjectHint; PVOID FilterContext; // Pointer where filter keeps its context } IOP_FILE_OBJECT_EXTENSION, *PIOP_FILE_OBJECT_EXTENSION; // // Structure to bookkeep stack profiler. // #define MAX_LOOKASIDE_IRP_STACK_COUNT 20 // Highest value for a lookaside stack count typedef struct _IOP_IRP_STACK_PROFILER { ULONG Profile[MAX_LOOKASIDE_IRP_STACK_COUNT]; KTIMER Timer; KDPC Dpc; ULONG Flags; ULONG TriggerCount; ULONG ProfileDuration; } IOP_IRP_STACK_PROFILER, *PIOP_IRP_STACK_PROFILER; #define IOP_CREATE_USE_TOP_DEVICE_OBJECT_HINT 0x1 // Define for internal flags to IopCreateFile #define IOP_CREATE_IGNORE_SHARE_ACCESS_CHECK 0x2 // Extension Flag definitions. #define FO_EXTENSION_IGNORE_SHARE_ACCESS_CHECK 0x1 // Ignore share access check. // // Define the global data for the I/O system. // #define IOP_FIXED_SIZE_MDL_PFNS 0x17 #define MAX_RESERVE_IRP_STACK_SIZE 20 // Define 20 as the number of stacks needed for the reserve IRP #define IOP_PROFILE_TIME_PERIOD 60 // 60 seconds #define NUM_SAMPLE_IRPS 2000 #define MIN_IRP_THRESHOLD 400 // At least 20 % should be allocated from a given stack location // // Define the default number of I/O stack locations a large IRP should // have if not specified by the registry. // #define DEFAULT_LARGE_IRP_LOCATIONS 8 #define BASE_STACK_COUNT DEFAULT_LARGE_IRP_LOCATIONS // // Defines for IopIrpAllocatorFlags. // #define IOP_ENABLE_AUTO_SIZING 0x1 #define IOP_PROFILE_STACK_COUNT 0x2 #define IOP_PROFILE_DURATION 1 // 1*60 seconds #define IOP_PROFILE_TRIGGER_INTERVAL 10 // 10*60 seconds extern ERESOURCE IopDatabaseResource; extern ERESOURCE IopSecurityResource; extern ERESOURCE IopCrashDumpLock; extern LIST_ENTRY IopDiskFileSystemQueueHead; extern LIST_ENTRY IopCdRomFileSystemQueueHead; extern LIST_ENTRY IopNetworkFileSystemQueueHead; extern LIST_ENTRY IopTapeFileSystemQueueHead; extern LIST_ENTRY IopBootDriverReinitializeQueueHead; extern LIST_ENTRY IopNotifyShutdownQueueHead; extern LIST_ENTRY IopNotifyLastChanceShutdownQueueHead; extern LIST_ENTRY IopFsNotifyChangeQueueHead; extern KSPIN_LOCK IoStatisticsLock; extern KSPIN_LOCK IopTimerLock; extern LIST_ENTRY IopTimerQueueHead; extern KDPC IopTimerDpc; extern KTIMER IopTimer; extern ULONG IopTimerCount; extern ULONG IopLargeIrpStackLocations; extern ULONG IopFsRegistrationOps; extern POBJECT_TYPE IoAdapterObjectType; extern POBJECT_TYPE IoCompletionObjectType; extern POBJECT_TYPE IoControllerObjectType; extern POBJECT_TYPE IoDeviceHandlerObjectType; extern GENERAL_LOOKASIDE IopLargeIrpLookasideList; extern GENERAL_LOOKASIDE IopSmallIrpLookasideList; extern GENERAL_LOOKASIDE IopMdlLookasideList; extern GENERAL_LOOKASIDE IopCompletionLookasideList; extern const UCHAR IopQueryOperationLength[]; extern const UCHAR IopSetOperationLength[]; extern const ULONG IopQueryOperationAccess[]; extern const ULONG IopSetOperationAccess[]; extern const UCHAR IopQuerySetAlignmentRequirement[]; extern const UCHAR IopQueryFsOperationLength[]; extern const UCHAR IopSetFsOperationLength[]; extern const ULONG IopQueryFsOperationAccess[]; extern const ULONG IopSetFsOperationAccess[]; extern const UCHAR IopQuerySetFsAlignmentRequirement[]; extern UNICODE_STRING IoArcHalDeviceName; extern PUCHAR IoLoaderArcBootDeviceName; extern LONG IopUniqueDeviceObjectNumber; extern PVOID IopLinkTrackingServiceObject; extern PKEVENT IopLinkTrackingServiceEvent; extern HANDLE IopLinkTrackingServiceEventHandle; extern KEVENT IopLinkTrackingPortObject; extern LINK_TRACKING_PACKET IopLinkTrackingPacket; extern UNICODE_STRING IoArcBootDeviceName; extern PDUMP_CONTROL_BLOCK IopDumpControlBlock; extern ULONG IopDumpControlBlockChecksum; extern LIST_ENTRY IopDriverReinitializeQueueHead; extern BOOLEAN IopVerifierOn; extern PIO_CALL_DRIVER pIofCallDriver; extern PIO_COMPLETE_REQUEST pIofCompleteRequest; extern PIO_FREE_IRP pIoFreeIrp; extern PIO_ALLOCATE_IRP pIoAllocateIrp; extern IOP_RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator; extern IOP_IRP_STACK_PROFILER IopIrpStackProfiler; // // The following declaration cannot go in EX.H since POBJECT_TYPE is not defined // until OB.H, which depends on EX.H. Hence, it is not exported by the EX // component at all. // extern POBJECT_TYPE ExEventObjectType; // // Define routines private to the I/O system. // VOID IopAbortRequest( IN PKAPC Apc ); //+ // // BOOLEAN // IopAcquireFastLock( // IN PFILE_OBJECT FileObject // ) // // Routine Description: // // This routine is invoked to acquire the fast lock for a file object. // This lock protects the busy indicator in the file object resource. // // Arguments: // // FileObject - Pointer to the file object to be locked. // // Return Values: // // FALSE - the fileobject was not locked (it was busy) // TRUE - the fileobject was locked & the busy flag has been set to TRUE // //- #define IopAcquireFastLock( FileObject ) \ ( InterlockedExchange( &FileObject->Busy, (ULONG) TRUE ) == FALSE ) #define IopAcquireCancelSpinLockAtDpcLevel() \ KiAcquireQueuedSpinLock ( &KeGetCurrentPrcb()->LockQueue[LockQueueIoCancelLock] ) #define IopReleaseCancelSpinLockFromDpcLevel() \ KiReleaseQueuedSpinLock ( &KeGetCurrentPrcb()->LockQueue[LockQueueIoCancelLock] ) #define IopAllocateIrp(StackSize, ChargeQuota) \ IoAllocateIrp((StackSize), (ChargeQuota)) #define IsIoVerifierOn() IopVerifierOn static __inline VOID IopProbeAndLockPages( IN OUT PMDL MemoryDescriptorList, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation, IN PDEVICE_OBJECT DeviceObject, IN ULONG MajorFunction ) { extern LOGICAL MmTrackLockedPages; MmProbeAndLockPages(MemoryDescriptorList, AccessMode, Operation); if (MmTrackLockedPages) { PVOID DriverRoutine; DriverRoutine = DeviceObject->DriverObject->MajorFunction[MajorFunction]; MmUpdateMdlTracker(MemoryDescriptorList, DriverRoutine, DeviceObject); } } #define IopIsReserveIrp(Irp) ((Irp) == (IopReserveIrpAllocator.ReserveIrp)) // // Bump the stack profile. // #define IopProfileIrpStackCount(StackSize) \ ((StackSize < MAX_LOOKASIDE_IRP_STACK_COUNT) ? \ IopIrpStackProfiler.Profile[StackSize]++ : 0) // // True if auto sizing is enabled. // #define IopIrpAutoSizingEnabled() ((IopIrpStackProfiler.Flags & IOP_ENABLE_AUTO_SIZING)) // // True if stack profiling is enabled. // #define IopIrpProfileStackCountEnabled() \ ((IopIrpStackProfiler.Flags & (IOP_PROFILE_STACK_COUNT|IOP_ENABLE_AUTO_SIZING)) \ == (IOP_PROFILE_STACK_COUNT|IOP_ENABLE_AUTO_SIZING)) NTSTATUS IopAcquireFileObjectLock( IN PFILE_OBJECT FileObject, IN KPROCESSOR_MODE RequestorMode, IN BOOLEAN Alertable, OUT PBOOLEAN Interrupted ); VOID IopAllocateIrpCleanup( IN PFILE_OBJECT FileObject, IN PKEVENT EventObject OPTIONAL ); PIRP IopAllocateIrpMustSucceed( IN CCHAR StackSize ); VOID IopApcHardError( IN PVOID StartContext ); VOID IopCancelAlertedRequest( IN PKEVENT Event, IN PIRP Irp ); VOID IopCheckBackupRestorePrivilege( IN PACCESS_STATE AccessState, IN OUT PULONG CreateOptions, IN KPROCESSOR_MODE PreviousMode, IN ULONG Disposition ); NTSTATUS IopCheckGetQuotaBufferValidity( IN PFILE_GET_QUOTA_INFORMATION QuotaBuffer, IN ULONG QuotaLength, OUT PULONG_PTR ErrorOffset ); VOID IopCloseFile( IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN ULONG GrantedAccess, IN ULONG ProcessHandleCount, IN ULONG SystemHandleCount ); VOID IopCompleteUnloadOrDelete( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN OnCleanStack, IN KIRQL Irql ); VOID IopCompletePageWrite( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ); VOID IopCompleteRequest( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ); BOOLEAN IopConfigureCrashDump( IN HANDLE HandlePagingFile ); VOID IopConnectLinkTrackingPort( IN PVOID Parameter ); NTSTATUS IopCreateVpb ( IN PDEVICE_OBJECT DeviceObject ); VOID IopDeallocateApc( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ); VOID IopDecrementDeviceObjectRef( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AlwaysUnload, IN BOOLEAN OnCleanStack ); VOID IopDeleteDriver( IN PVOID Object ); VOID IopDeleteDevice( IN PVOID Object ); VOID IopDeleteFile( IN PVOID Object ); VOID IopDeleteIoCompletion( IN PVOID Object ); //+ // // VOID // IopDequeueThreadIrp( // IN PIRP Irp // ) // // Routine Description: // // This routine dequeues the specified I/O Request Packet (IRP) from the // thread IRP queue which it is currently queued. // // In checked we set Flink == Blink so we can assert free's of queue'd IRPs // // Arguments: // // Irp - Specifies the IRP that is dequeued. // // Return Value: // // None. // //- #define IopDequeueThreadIrp( Irp ) \ { \ RemoveEntryList( &Irp->ThreadListEntry ); \ InitializeListHead( &Irp->ThreadListEntry ) ; \ } #ifdef _WIN64 #define IopApcRoutinePresent(ApcRoutine) ARGUMENT_PRESENT((ULONG_PTR)(ApcRoutine) & ~1) #define IopIsIosb32(ApcRoutine) ((ULONG_PTR)(ApcRoutine) & 1) #else #define IopApcRoutinePresent(ApcRoutine) ARGUMENT_PRESENT(ApcRoutine) #endif VOID IopDisassociateThreadIrp( VOID ); BOOLEAN IopDmaDispatch( IN PKINTERRUPT Interrupt, IN PVOID ServiceContext ); VOID IopDropIrp( IN PIRP Irp, IN PFILE_OBJECT FileObject ); LONG IopExceptionFilter( IN PEXCEPTION_POINTERS ExceptionPointers, OUT PNTSTATUS ExceptionCode ); VOID IopExceptionCleanup( IN PFILE_OBJECT FileObject, IN PIRP Irp, IN PKEVENT EventObject OPTIONAL, IN PKEVENT KernelEvent OPTIONAL ); VOID IopErrorLogThread( IN PVOID StartContext ); VOID IopFreeIrpAndMdls( IN PIRP Irp ); PDEVICE_OBJECT IopGetDeviceAttachmentBase( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS IopGetFileInformation( IN PFILE_OBJECT FileObject, IN ULONG Length, IN FILE_INFORMATION_CLASS FileInformationClass, OUT PVOID FileInformation, OUT PULONG ReturnedLength ); BOOLEAN IopGetMountFlag( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS IopGetRegistryValues( IN HANDLE KeyHandle, IN PKEY_VALUE_FULL_INFORMATION *ValueList ); NTSTATUS IopGetSetObjectId( IN PFILE_OBJECT FileObject, IN OUT PVOID Buffer, IN ULONG Length, IN ULONG OperationFlags ); NTSTATUS IopGetSetSecurityObject( IN PVOID Object, IN SECURITY_OPERATION_CODE OperationCode, IN PSECURITY_INFORMATION SecurityInformation, IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG CapturedLength, IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping ); NTSTATUS IopGetVolumeId( IN PFILE_OBJECT FileObject, IN OUT PLINK_TRACKING_INFORMATION ObjectId, IN ULONG Length ); VOID IopHardErrorThread( PVOID StartContext ); VOID IopInsertRemoveDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN Insert ); // // Interlocked list manipulation funtions using queued spin locks. // PLIST_ENTRY FASTCALL IopInterlockedInsertHeadList ( IN PLIST_ENTRY ListHead, IN PLIST_ENTRY ListEntry ); PLIST_ENTRY FASTCALL IopInterlockedInsertTailList ( IN PLIST_ENTRY ListHead, IN PLIST_ENTRY ListEntry ); PLIST_ENTRY FASTCALL IopInterlockedRemoveHeadList ( IN PLIST_ENTRY ListHead ); BOOLEAN IopIsSameMachine( IN PFILE_OBJECT SourceFile, IN HANDLE TargetFile ); VOID IopLoadFileSystemDriver( IN PDEVICE_OBJECT DeviceObject ); VOID IopLoadUnloadDriver( IN PVOID Parameter ); NTSTATUS IopLogErrorEvent( IN ULONG SequenceNumber, IN ULONG UniqueErrorValue, IN NTSTATUS FinalStatus, IN NTSTATUS SpecificIOStatus, IN ULONG LengthOfInsert1, IN PWCHAR Insert1, IN ULONG LengthOfInsert2, IN PWCHAR Insert2 ); NTSTATUS IopLookupBusStringFromID ( IN HANDLE KeyHandle, IN INTERFACE_TYPE InterfaceType, OUT PWCHAR Buffer, IN ULONG Length, OUT PULONG BusFlags OPTIONAL ); NTSTATUS IopMountVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount, IN BOOLEAN DeviceLockAlreadyHeld, IN BOOLEAN Alertable, OUT PVPB *Vpb ); NTSTATUS IopOpenLinkOrRenameTarget( OUT PHANDLE TargetHandle, IN PIRP Irp, IN PVOID RenameBuffer, IN PFILE_OBJECT FileObject ); NTSTATUS IopParseDevice( IN PVOID ParseObject, IN PVOID ObjectType, IN PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object ); NTSTATUS IopParseFile( IN PVOID ParseObject, IN PVOID ObjectType, IN PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object ); BOOLEAN IopProtectSystemPartition( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); NTSTATUS IopQueryName( IN PVOID Object, IN BOOLEAN HasObjectName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength ); NTSTATUS IopQueryNameInternal( IN PVOID Object, IN BOOLEAN HasObjectName, IN BOOLEAN UseDosDeviceName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength ); NTSTATUS IopQueryXxxInformation( IN PFILE_OBJECT FileObject, IN ULONG InformationClass, IN ULONG Length, OUT PVOID Information, OUT PULONG ReturnedLength, IN BOOLEAN FileInformation ); VOID IopQueueWorkRequest( IN PIRP Irp ); VOID IopRaiseHardError( IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID IopRaiseInformationalHardError( IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID IopReadyDeviceObjects( IN PDRIVER_OBJECT DriverObject ); //+ // // VOID // IopReleaseFileObjectLock( // IN PFILE_OBJECT FileObject // ) // // Routine Description: // // This routine is invoked to release ownership of the file object lock. // // Arguments: // // FileObject - Pointer to the file object whose ownership is to be // released. // // Return Value: // // None. // //- #define IopReleaseFileObjectLock( FileObject ) { \ ULONG Result; \ Result = InterlockedExchange( &FileObject->Busy, FALSE ); \ ASSERT(Result != FALSE); \ if (FileObject->Waiters != 0) { \ KeSetEvent( &FileObject->Lock, 0, FALSE ); \ } \ } #if _WIN32_WINNT >= 0x0500 NTSTATUS IopSendMessageToTrackService( IN PLINK_TRACKING_INFORMATION SourceVolumeId, IN PFILE_OBJECTID_BUFFER SourceObjectId, IN PFILE_TRACKING_INFORMATION TargetObjectInformation ); #endif NTSTATUS IopSetEaOrQuotaInformationFile( IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PVOID Buffer, IN ULONG Length, IN BOOLEAN SetEa ); NTSTATUS IopSetRemoteLink( IN PFILE_OBJECT FileObject, IN PFILE_OBJECT DestinationFileObject OPTIONAL, IN PFILE_TRACKING_INFORMATION FileInformation OPTIONAL ); VOID IopStartApcHardError( IN PVOID StartContext ); NTSTATUS IopSynchronousApiServiceTail( IN NTSTATUS ReturnedStatus, IN PKEVENT Event, IN PIRP Irp, IN KPROCESSOR_MODE RequestorMode, IN PIO_STATUS_BLOCK LocalIoStatus, OUT PIO_STATUS_BLOCK IoStatusBlock ); NTSTATUS IopSynchronousServiceTail( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PFILE_OBJECT FileObject, IN BOOLEAN DeferredIoCompletion, IN KPROCESSOR_MODE RequestorMode, IN BOOLEAN SynchronousIo, IN TRANSFER_TYPE TransferType ); VOID IopTimerDispatch( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS IopTrackLink( IN PFILE_OBJECT FileObject, IN OUT PIO_STATUS_BLOCK IoStatusBlock, IN PFILE_TRACKING_INFORMATION FileInformation, IN ULONG Length, IN PKEVENT Event, IN KPROCESSOR_MODE RequestorMode ); VOID IopUserCompletion( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ); NTSTATUS IopXxxControlFile( IN HANDLE FileHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG IoControlCode, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN BOOLEAN DeviceIoControl ); NTSTATUS IopReportResourceUsage( IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PCM_RESOURCE_LIST DriverList OPTIONAL, IN ULONG DriverListSize OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PCM_RESOURCE_LIST DeviceList OPTIONAL, IN ULONG DeviceListSize OPTIONAL, IN BOOLEAN OverrideConflict, OUT PBOOLEAN ConflictDetected ); VOID IopDoNameTransmogrify( IN PIRP Irp, IN PFILE_OBJECT FileObject, IN PREPARSE_DATA_BUFFER ReparseBuffer ); VOID IopUpdateOtherOperationCount( VOID ); VOID IopUpdateReadOperationCount( VOID ); VOID IopUpdateWriteOperationCount( VOID ); VOID IopUpdateOtherTransferCount( IN ULONG TransferCount ); VOID IopUpdateReadTransferCount( IN ULONG TransferCount ); VOID IopUpdateWriteTransferCount( IN ULONG TransferCount ); NTSTATUS FASTCALL IopfCallDriver( PDEVICE_OBJECT DeviceObject, PIRP Irp ); VOID FASTCALL IopfCompleteRequest( IN PIRP Irp, IN CCHAR PriorityBost ); PIRP IopAllocateIrpPrivate( IN CCHAR StackSize, IN BOOLEAN ChargeQuota ); VOID IopFreeIrp( IN PIRP Irp ); PVOID IopAllocateErrorLogEntry( IN PDEVICE_OBJECT deviceObject, IN PDRIVER_OBJECT driverObject, IN UCHAR EntrySize ); VOID IopNotifyAlreadyRegisteredFileSystems( IN PLIST_ENTRY ListHead, IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, IN BOOLEAN SkipRaw ); NTSTATUS IopCheckUnloadDriver( IN PDRIVER_OBJECT driverObject, OUT PBOOLEAN unloadDriver ); // // Interlocked increment/decrement functions using queued spin locks. // ULONG FASTCALL IopInterlockedDecrementUlong ( IN KSPIN_LOCK_QUEUE_NUMBER Number, IN OUT PULONG Addend ); ULONG FASTCALL IopInterlockedIncrementUlong ( IN KSPIN_LOCK_QUEUE_NUMBER Number, IN OUT PULONG Addend ); VOID IopShutdownBaseFileSystems( IN PLIST_ENTRY ListHead ); VOID IopPerfLogFileCreate( IN PFILE_OBJECT FileObject, IN PUNICODE_STRING CompleteName ); BOOLEAN IopInitializeReserveIrp( PIOP_RESERVE_IRP_ALLOCATOR Allocator ); PIRP IopAllocateReserveIrp( IN CCHAR StackSize ); VOID IopFreeReserveIrp( IN PIRP Irp, IN CCHAR PriorityBoost ); NTSTATUS IopGetBasicInformationFile( IN PFILE_OBJECT FileObject, IN PFILE_BASIC_INFORMATION BasicInformationBuffer ); NTSTATUS IopCreateFile( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options, IN ULONG InternalFlags, IN PVOID DeviceObject ); BOOLEAN IopVerifyDeviceObjectOnStack( IN PDEVICE_OBJECT BaseDeviceObject, IN PDEVICE_OBJECT TopDeviceObject ); BOOLEAN IopVerifyDiskSignature( IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, IN PARC_DISK_SIGNATURE LoaderDiskBlock, OUT PULONG DiskSignature ); NTSTATUS IopGetDriverPathInformation( IN PFILE_OBJECT FileObject, IN PFILE_FS_DRIVER_PATH_INFORMATION FsDpInfo, IN ULONG Length ); BOOLEAN IopVerifyDriverObjectOnStack( IN PDEVICE_OBJECT DeviceObject, IN PDRIVER_OBJECT DriverObject ); NTSTATUS IopInitializeIrpStackProfiler( VOID ); VOID IopIrpStackProfilerTimer( IN struct _KDPC *Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID IopProcessIrpStackProfiler( VOID ); PDEVICE_OBJECT IopAttachDeviceToDeviceStackSafe( IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, OUT PDEVICE_OBJECT *AttachedToDeviceObject OPTIONAL ); #endif // _IOMGR_