2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/internal/io.h
5 * PURPOSE: Internal header for the I/O Manager
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
12 // Define this if you want debugging support
14 #define _IO_DEBUG_ 0x00
17 // These define the Debug Masks Supported
19 #define IO_IRP_DEBUG 0x01
20 #define IO_FILE_DEBUG 0x02
21 #define IO_API_DEBUG 0x04
22 #define IO_CTL_DEBUG 0x08
25 // Debug/Tracing support
28 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
29 #define IOTRACE(x, ...) \
31 DbgPrintEx("%s [%.16s] - ", \
33 PsGetCurrentProcess()->ImageFileName); \
34 DbgPrintEx(__VA_ARGS__); \
37 #define IOTRACE(x, ...) \
38 if (x & IopTraceLevel) \
40 DbgPrint("%s [%.16s] - ", \
42 PsGetCurrentProcess()->ImageFileName); \
43 DbgPrint(__VA_ARGS__); \
47 #define IOTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
51 // Registry path to the enumeration root key
53 #define ENUM_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum"
56 // Returns the type of METHOD_ used in this IOCTL
58 #define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
61 // Bugcheck codes for RAM disk booting
64 // No LoaderXIPRom descriptor was found in the loader memory list
66 #define RD_NO_XIPROM_DESCRIPTOR 1
68 // Unable to open the RAM disk driver (ramdisk.sys or \Device\Ramdisk)
70 #define RD_NO_RAMDISK_DRIVER 2
72 // FSCTL_CREATE_RAM_DISK failed
74 #define RD_FSCTL_FAILED 3
76 // Unable to create GUID string from binary GUID
78 #define RD_GUID_CONVERT_FAILED 4
80 // Unable to create symbolic link pointing to the RAM disk device
82 #define RD_SYMLINK_CREATE_FAILED 5
85 // Max traversal of reparse points for a single open in IoParseDevice
87 #define IOP_MAX_REPARSE_TRAVERSAL 0x20
90 // Private flags for IoCreateFile / IoParseDevice
92 #define IOP_USE_TOP_LEVEL_DEVICE_HINT 0x01
93 #define IOP_CREATE_FILE_OBJECT_EXTENSION 0x02
96 typedef struct _FILE_OBJECT_EXTENSION
98 PDEVICE_OBJECT TopDeviceObjectHint
;
100 } FILE_OBJECT_EXTENSION
, *PFILE_OBJECT_EXTENSION
;
105 // We can call the Ob Inlined API, it's the same thing
107 #define IopAllocateMdlFromLookaside \
108 ObpAllocateObjectCreateInfoBuffer
109 #define IopFreeMdlFromLookaside \
110 ObpFreeCapturedAttributes
113 // Determines if the IRP is Synchronous
115 #define IsIrpSynchronous(Irp, FileObject) \
116 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
119 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
122 // Returns the internal Device Object Extension
124 #define IoGetDevObjExtension(DeviceObject) \
125 ((PEXTENDED_DEVOBJ_EXTENSION) \
126 (DeviceObject->DeviceObjectExtension)) \
129 // Returns the internal Driver Object Extension
131 #define IoGetDrvObjExtension(DriverObject) \
132 ((PEXTENDED_DRIVER_EXTENSION) \
133 (DriverObject->DriverExtension)) \
137 * IopDeviceNodeSetFlag(
138 * PDEVICE_NODE DeviceNode,
141 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
142 ((DeviceNode)->Flags |= (Flag))
146 * IopDeviceNodeClearFlag(
147 * PDEVICE_NODE DeviceNode,
150 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
151 ((DeviceNode)->Flags &= ~(Flag))
155 * IopDeviceNodeHasFlag(
156 * PDEVICE_NODE DeviceNode,
159 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
160 (((DeviceNode)->Flags & (Flag)) > 0)
164 * IopDeviceNodeSetUserFlag(
165 * PDEVICE_NODE DeviceNode,
168 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
169 ((DeviceNode)->UserFlags |= (UserFlag))
173 * IopDeviceNodeClearUserFlag(
174 * PDEVICE_NODE DeviceNode,
177 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
178 ((DeviceNode)->UserFlags &= ~(UserFlag))
182 * IopDeviceNodeHasUserFlag(
183 * PDEVICE_NODE DeviceNode,
186 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
187 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
191 * IopDeviceNodeSetProblem(
192 * PDEVICE_NODE DeviceNode,
195 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
196 ((DeviceNode)->Problem |= (Problem))
200 * IopDeviceNodeClearProblem(
201 * PDEVICE_NODE DeviceNode,
204 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
205 ((DeviceNode)->Problem &= ~(Problem))
209 * IopDeviceNodeHasProblem(
210 * PDEVICE_NODE DeviceNode,
213 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
214 (((DeviceNode)->Problem & (Problem)) > 0)
218 * IopInitDeviceTreeTraverseContext(
219 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
220 * PDEVICE_NODE DeviceNode,
221 * DEVICETREE_TRAVERSE_ROUTINE Action,
224 #define IopInitDeviceTreeTraverseContext( \
225 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
227 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
229 (_DeviceTreeTraverseContext)->Action = (_Action); \
230 (_DeviceTreeTraverseContext)->Context = (_Context); }
234 * IopIsValidPhysicalDeviceObject(
235 * IN PDEVICE_OBJECT PhysicalDeviceObject);
237 #define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \
238 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \
239 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \
240 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED))
243 // Device List Operations
245 typedef enum _IOP_DEVICE_LIST_OPERATION
249 } IOP_DEVICE_LIST_OPERATION
, *PIOP_DEVICE_LIST_OPERATION
;
252 // Transfer statistics
254 typedef enum _IOP_TRANSFER_TYPE
259 } IOP_TRANSFER_TYPE
, *PIOP_TRANSFER_TYPE
;
262 // Packet Types when piggybacking on the IRP Overlay
264 typedef enum _COMPLETION_PACKET_TYPE
266 IopCompletionPacketIrp
,
267 IopCompletionPacketMini
,
268 IopCompletionPacketQuota
269 } COMPLETION_PACKET_TYPE
, *PCOMPLETION_PACKET_TYPE
;
272 // Special version of the IRP Overlay used to optimize I/O completion
273 // by not using up a separate structure.
275 typedef struct _IOP_MINI_COMPLETION_PACKET
279 LIST_ENTRY ListEntry
;
282 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
289 ULONG_PTR IoStatusInformation
;
290 } IOP_MINI_COMPLETION_PACKET
, *PIOP_MINI_COMPLETION_PACKET
;
293 // I/O Completion Context for IoSetIoCompletionRoutineEx
295 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
297 PDEVICE_OBJECT DeviceObject
;
299 PIO_COMPLETION_ROUTINE CompletionRoutine
;
300 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT
, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT
;
303 // I/O Wrapper around the Executive Work Item
305 typedef struct _IO_WORKITEM
307 WORK_QUEUE_ITEM Item
;
308 PDEVICE_OBJECT DeviceObject
;
309 PIO_WORKITEM_ROUTINE WorkerRoutine
;
314 // I/O Wrapper around the Kernel Interrupt
316 typedef struct _IO_INTERRUPT
318 KINTERRUPT FirstInterrupt
;
319 PKINTERRUPT Interrupt
[MAXIMUM_PROCESSORS
];
321 } IO_INTERRUPT
, *PIO_INTERRUPT
;
324 // I/O Error Log Packet Header
326 typedef struct _ERROR_LOG_ENTRY
330 LIST_ENTRY ListEntry
;
331 PDEVICE_OBJECT DeviceObject
;
332 PDRIVER_OBJECT DriverObject
;
333 LARGE_INTEGER TimeStamp
;
334 } ERROR_LOG_ENTRY
, *PERROR_LOG_ENTRY
;
337 // To simplify matters, the kernel is made to support both the checked and free
338 // version of the I/O Remove Lock in the same binary. This structure includes
339 // both, since the DDK has the structure with a compile-time #ifdef.
341 typedef struct _EXTENDED_IO_REMOVE_LOCK
343 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
344 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
345 } EXTENDED_IO_REMOVE_LOCK
, *PEXTENDED_IO_REMOVE_LOCK
;
348 // Dummy File Object used inside the Open Packet so that OB knows how to
349 // deal with the Object Pointer even though it's not a real file.
351 typedef struct _DUMMY_FILE_OBJECT
353 OBJECT_HEADER ObjectHeader
;
354 CHAR FileObjectBody
[sizeof(FILE_OBJECT
)];
355 } DUMMY_FILE_OBJECT
, *PDUMMY_FILE_OBJECT
;
358 // Open packet used as a context for Device/File parsing so that the parse
359 // routine can know what operation is being requested.
361 typedef struct _OPEN_PACKET
365 PFILE_OBJECT FileObject
;
366 NTSTATUS FinalStatus
;
367 ULONG_PTR Information
;
369 PFILE_OBJECT RelatedFileObject
;
370 OBJECT_ATTRIBUTES OriginalAttributes
;
371 LARGE_INTEGER AllocationSize
;
373 USHORT FileAttributes
;
379 PFILE_BASIC_INFORMATION BasicInformation
;
380 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
;
381 CREATE_FILE_TYPE CreateFileType
;
382 PVOID ExtraCreateParameters
;
386 BOOLEAN FullAttributes
;
387 PDUMMY_FILE_OBJECT LocalFileObject
;
388 BOOLEAN TraversedMountPoint
;
390 PDEVICE_OBJECT TopDeviceObjectHint
;
391 } OPEN_PACKET
, *POPEN_PACKET
;
394 // Parameters packet for Load/Unload work item's context
396 typedef struct _LOAD_UNLOAD_PARAMS
399 PCUNICODE_STRING RegistryPath
;
400 WORK_QUEUE_ITEM WorkItem
;
402 PDRIVER_OBJECT DriverObject
;
403 } LOAD_UNLOAD_PARAMS
, *PLOAD_UNLOAD_PARAMS
;
406 // Boot Driver List Entry
408 typedef struct _DRIVER_INFORMATION
411 PDRIVER_OBJECT DriverObject
;
412 PBOOT_DRIVER_LIST_ENTRY DataTableEntry
;
413 HANDLE ServiceHandle
;
418 } DRIVER_INFORMATION
, *PDRIVER_INFORMATION
;
423 typedef struct _BOOT_DRIVER_NODE
425 BOOT_DRIVER_LIST_ENTRY ListEntry
;
426 UNICODE_STRING Group
;
430 } BOOT_DRIVER_NODE
, *PBOOT_DRIVER_NODE
;
433 // List of Bus Type GUIDs
435 typedef struct _IO_BUS_TYPE_GUID_LIST
440 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
441 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
444 // Shutdown entry for registed devices
446 typedef struct _SHUTDOWN_ENTRY
448 LIST_ENTRY ShutdownList
;
449 PDEVICE_OBJECT DeviceObject
;
450 } SHUTDOWN_ENTRY
, *PSHUTDOWN_ENTRY
;
453 // F/S Notification entry for registered File Systems
455 typedef struct _FS_CHANGE_NOTIFY_ENTRY
457 LIST_ENTRY FsChangeNotifyList
;
458 PDRIVER_OBJECT DriverObject
;
459 PDRIVER_FS_NOTIFICATION FSDNotificationProc
;
460 } FS_CHANGE_NOTIFY_ENTRY
, *PFS_CHANGE_NOTIFY_ENTRY
;
463 // Driver (Boot) Re-Initialization Entry
465 typedef struct _DRIVER_REINIT_ITEM
467 LIST_ENTRY ItemEntry
;
468 PDRIVER_OBJECT DriverObject
;
469 PDRIVER_REINITIALIZE ReinitRoutine
;
471 } DRIVER_REINIT_ITEM
, *PDRIVER_REINIT_ITEM
;
474 // Called on every visit of a node during a preorder-traversal of the device
476 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
477 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
478 // Any other returned status code will be returned to the caller. If a status
479 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
480 // the traversal is stopped immediately and the status code is returned to
485 (*DEVICETREE_TRAVERSE_ROUTINE
)(
486 IN PDEVICE_NODE DeviceNode
,
491 // Context information for traversing the device tree
493 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
496 // Current device node during a traversal
498 PDEVICE_NODE DeviceNode
;
501 // Initial device node where we start the traversal
503 PDEVICE_NODE FirstDeviceNode
;
506 // Action routine to be called for every device node
508 DEVICETREE_TRAVERSE_ROUTINE Action
;
511 // Context passed to the action routine
514 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
517 // Reserve IRP allocator
518 // Used for read paging IOs in low-memory situations
520 typedef struct _RESERVE_IRP_ALLOCATOR
523 volatile LONG ReserveIrpInUse
;
526 } RESERVE_IRP_ALLOCATOR
, *PRESERVE_IRP_ALLOCATOR
;
533 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList
);
537 IopAssignDeviceResources(
538 IN PDEVICE_NODE DeviceNode
543 IopFixupResourceListWithRequirements(
544 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList
,
545 OUT PCM_RESOURCE_LIST
*ResourceList
550 IopDetectResourceConflict(
551 IN PCM_RESOURCE_LIST ResourceList
,
553 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
561 PipCallDriverAddDevice(
562 IN PDEVICE_NODE DeviceNode
,
563 IN BOOLEAN LoadDriver
,
564 IN PDRIVER_OBJECT DriverObject
569 IopInitializePlugPlayServices(
585 IopInitDriverImplementation(
590 IopInitPnpNotificationImplementation(
595 IopNotifyPlugPlayNotification(
596 IN PDEVICE_OBJECT DeviceObject
,
597 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
599 IN PVOID EventCategoryData1
,
600 IN PVOID EventCategoryData2
604 IopGetSystemPowerDeviceObject(
605 IN PDEVICE_OBJECT
*DeviceObject
610 PipAllocateDeviceNode(
611 IN PDEVICE_OBJECT PhysicalDeviceObject
616 IN PDEVICE_NODE ParentNode
,
617 IN PDEVICE_OBJECT PhysicalDeviceObject
,
618 IN PUNICODE_STRING ServiceName
,
619 OUT PDEVICE_NODE
*DeviceNode
624 IN PDEVICE_NODE DeviceNode
629 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode
,
630 PDEVICE_CAPABILITIES DeviceCaps
);
635 IN PDEVICE_OBJECT DeviceObject
,
636 IN PIO_STACK_LOCATION IoStackLocation
,
637 OUT PVOID
*Information
643 IN PDEVICE_OBJECT DeviceObject
,
644 IN PIO_STATUS_BLOCK IoStatusBlock
,
645 IN UCHAR MinorFunction
,
646 IN PIO_STACK_LOCATION Stack
652 IN PDEVICE_OBJECT DeviceObject
656 IopActionConfigureChildServices(
657 IN PDEVICE_NODE DeviceNode
,
662 IopActionInitChildServices(
663 IN PDEVICE_NODE DeviceNode
,
669 IN PDEVICE_OBJECT DeviceObject
683 IopInitPlugPlayEvents(VOID
);
686 IopQueueTargetDeviceEvent(
688 PUNICODE_STRING DeviceIds
692 IopInitializePnpServices(
693 IN PDEVICE_NODE DeviceNode
);
697 IopOpenRegistryKeyEx(
700 PUNICODE_STRING Name
,
701 ACCESS_MASK DesiredAccess
);
708 OUT PKEY_VALUE_FULL_INFORMATION
*Information
713 IopCreateRegistryKeyEx(
715 IN HANDLE BaseHandle OPTIONAL
,
716 IN PUNICODE_STRING KeyName
,
717 IN ACCESS_MASK DesiredAccess
,
718 IN ULONG CreateOptions
,
719 OUT PULONG Disposition OPTIONAL
724 IopTraverseDeviceTree(
725 PDEVICETREE_TRAVERSE_CONTEXT Context
);
738 PiInitCacheGroupInformation(
744 PpInitGetGroupOrderIndex(
745 IN HANDLE ServiceHandle
750 PipGetDriverTagPriority(
751 IN HANDLE ServiceHandle
756 PnpRegMultiSzToUnicodeStrings(
757 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation
,
758 OUT PUNICODE_STRING
*UnicodeStringList
,
759 OUT PULONG UnicodeStringCount
766 IN ULONG RegSzLength
,
767 OUT PUSHORT StringLength OPTIONAL
771 // Initialization Routines
776 IN PLOADER_PARAMETER_BLOCK LoaderBlock
781 IopReassignSystemRoot(
782 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
783 OUT PANSI_STRING NtBootPath
789 IN PLOADER_PARAMETER_BLOCK LoaderBlock
794 IopVerifyDiskSignature(
795 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout
,
796 IN PARC_DISK_SIGNATURE ArcDiskSignature
,
801 // Device/Volume Routines
805 IopReadyDeviceObjects(
806 IN PDRIVER_OBJECT Driver
812 IN PDEVICE_NODE DeviceNode
,
813 IN PDRIVER_OBJECT DriverObject
818 IN PDEVICE_NODE DeviceNode
823 IN PDEVICE_NODE DeviceNode
828 IN PDEVICE_NODE DeviceNode
834 IN POPEN_PACKET OpenPacket
,
835 IN PDEVICE_OBJECT DeviceObject
,
836 IN PUNICODE_STRING RemainingName
,
843 IN PDEVICE_OBJECT DeviceObject
,
844 IN BOOLEAN AllowRawMount
,
845 IN BOOLEAN DeviceIsLocked
,
846 IN BOOLEAN Alertable
,
852 IN PVOID SymbolicLink
857 IN PVOID SymbolicLink
,
864 IN PDEVICE_OBJECT DeviceObject
869 IopDereferenceVpbAndFree(
875 IoInitFileSystemImplementation(
881 IoInitVpbImplementation(
887 IopReferenceDeviceObject(
888 IN PDEVICE_OBJECT DeviceObject
893 IopDereferenceDeviceObject(
894 IN PDEVICE_OBJECT DeviceObject
,
895 IN BOOLEAN ForceUnload
900 IoGetRelatedTargetDevice(
901 IN PFILE_OBJECT FileObject
,
902 OUT PDEVICE_OBJECT
*DeviceObject
908 IN PDEVICE_OBJECT DeviceObject
917 IN PFILE_OBJECT FileObject
,
918 IN PKEVENT EventObject
,
919 IN PVOID Buffer OPTIONAL
924 IopAbortInterruptedIrp(
925 IN PKEVENT EventObject
,
931 IopAllocateIrpMustSucceed(
937 IopInitializeReserveIrp(
938 IN PRESERVE_IRP_ALLOCATOR ReserveIrpAllocator
943 IopAllocateReserveIrp(
951 IoInitShutdownNotification(
963 IopShutdownBaseFileSystems(
964 IN PLIST_ENTRY ListHead
968 // Boot logging support
972 IN BOOLEAN StartBootLog
987 IN PUNICODE_STRING DriverName
,
992 IopSaveBootLogToFile(
997 // I/O Cancellation Routines
1006 IoInitCancelHandling(
1017 IN PKNORMAL_ROUTINE
* NormalRoutine
,
1018 IN PVOID
* NormalContext
,
1019 IN PVOID
* SystemArgument1
,
1020 IN PVOID
* SystemArgument2
1024 // Error Logging Routines
1039 // Raw File System MiniDriver
1042 RawFsIsRawFileSystemDeviceObject(
1043 IN PDEVICE_OBJECT DeviceObject
1049 IN PDRIVER_OBJECT DriverObject
,
1050 IN PUNICODE_STRING RegistryPath
1054 // PnP Root MiniDriver
1059 IN PDRIVER_OBJECT DriverObject
,
1060 IN PUNICODE_STRING RegistryPath
1064 PnpRootCreateDevice(
1065 IN PUNICODE_STRING ServiceName
,
1066 IN OPTIONAL PDRIVER_OBJECT DriverObject
,
1067 OUT PDEVICE_OBJECT
*PhysicalDeviceObject
,
1068 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1072 PnpRootRegisterDevice(
1073 IN PDEVICE_OBJECT DeviceObject
);
1080 IopInitializeBootDrivers(
1086 IopInitializeSystemDrivers(
1092 IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL
,
1093 IN PDRIVER_INITIALIZE InitializationFunction
,
1094 IN PUNICODE_STRING RegistryPath OPTIONAL
,
1095 IN PCUNICODE_STRING ServiceName
,
1096 IN PLDR_DATA_TABLE_ENTRY ModuleObject OPTIONAL
,
1097 OUT PDRIVER_OBJECT
*pDriverObject
);
1108 OUT PDRIVER_OBJECT
*DriverObject
,
1109 IN PUNICODE_STRING ServiceName
,
1110 IN BOOLEAN FileSystem
1115 IopLoadServiceModule(
1116 IN PUNICODE_STRING ServiceName
,
1117 OUT PLDR_DATA_TABLE_ENTRY
*ModuleObject
1122 IopLoadUnloadDriver(
1123 _In_opt_ PCUNICODE_STRING RegistryPath
,
1124 _Inout_ PDRIVER_OBJECT
*DriverObject
1129 IopInitializeDriverModule(
1130 IN PDEVICE_NODE DeviceNode
,
1131 IN PLDR_DATA_TABLE_ENTRY ModuleObject
,
1132 IN PUNICODE_STRING ServiceName
,
1133 IN BOOLEAN FileSystemDriver
,
1134 OUT PDRIVER_OBJECT
*DriverObject
1139 IopAttachFilterDrivers(
1140 IN PDEVICE_NODE DeviceNode
,
1141 IN HANDLE EnumSubKey
,
1148 IopReinitializeDrivers(
1154 IopReinitializeBootDrivers(
1163 IopDeleteDevice(IN PVOID ObjectBody
);
1168 IN PVOID ParseObject
,
1169 IN PVOID ObjectType
,
1170 IN OUT PACCESS_STATE AccessState
,
1171 IN KPROCESSOR_MODE AccessMode
,
1172 IN ULONG Attributes
,
1173 IN OUT PUNICODE_STRING CompleteName
,
1174 IN OUT PUNICODE_STRING RemainingName
,
1175 IN OUT PVOID Context
,
1176 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1183 IN PVOID ParseObject
,
1184 IN PVOID ObjectType
,
1185 IN OUT PACCESS_STATE AccessState
,
1186 IN KPROCESSOR_MODE AccessMode
,
1187 IN ULONG Attributes
,
1188 IN OUT PUNICODE_STRING CompleteName
,
1189 IN OUT PUNICODE_STRING RemainingName
,
1190 IN OUT PVOID Context OPTIONAL
,
1191 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1203 IopGetSetSecurityObject(
1204 IN PVOID ObjectBody
,
1205 IN SECURITY_OPERATION_CODE OperationCode
,
1206 IN PSECURITY_INFORMATION SecurityInformation
,
1207 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1208 IN OUT PULONG BufferLength
,
1209 OUT PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
1210 IN POOL_TYPE PoolType
,
1211 IN OUT PGENERIC_MAPPING GenericMapping
1217 IN PVOID ObjectBody
,
1219 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1221 OUT PULONG ReturnLength
,
1222 IN KPROCESSOR_MODE PreviousMode
1228 IN PEPROCESS Process OPTIONAL
,
1230 IN ACCESS_MASK GrantedAccess
,
1231 IN ULONG ProcessHandleCount
,
1232 IN ULONG SystemHandleCount
1237 IoGetFileObjectFilterContext(
1238 IN PFILE_OBJECT FileObject
1243 IoChangeFileObjectFilterContext(
1244 IN PFILE_OBJECT FileObject
,
1245 IN PVOID FilterContext
,
1251 IopDoNameTransmogrify(
1253 IN PFILE_OBJECT FileObject
,
1254 IN PREPARSE_DATA_BUFFER DataBuffer
1259 IoComputeDesiredAccessFileObject(
1260 IN PFILE_OBJECT FileObject
,
1261 IN PACCESS_MASK DesiredAccess
1265 // I/O Timer Routines
1269 IopInitTimerImplementation(
1275 IopRemoveTimerFromTimerList(
1280 // I/O Completion Routines
1284 IopDeleteIoCompletion(
1291 IN PVOID IoCompletion
,
1292 IN PVOID KeyContext
,
1293 IN PVOID ApcContext
,
1294 IN NTSTATUS IoStatus
,
1295 IN ULONG_PTR IoStatusInformation
,
1305 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1309 // Configuration Routines
1313 IopFetchConfigurationInformation(OUT PWSTR
* SymbolicLinkList
,
1315 IN ULONG ExpectedInterfaces
,
1316 IN PULONG Interfaces
1321 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName
,
1322 IN PUNICODE_STRING OsLoaderPathName
1328 extern POBJECT_TYPE IoCompletionType
;
1329 extern PDEVICE_NODE IopRootDeviceNode
;
1330 extern KSPIN_LOCK IopDeviceTreeLock
;
1331 extern ULONG IopTraceLevel
;
1332 extern GENERAL_LOOKASIDE IopMdlLookasideList
;
1333 extern GENERIC_MAPPING IopCompletionMapping
;
1334 extern GENERIC_MAPPING IopFileMapping
;
1335 extern POBJECT_TYPE _IoFileObjectType
;
1336 extern HAL_DISPATCH _HalDispatchTable
;
1337 extern LIST_ENTRY IopErrorLogListHead
;
1338 extern ULONG IopNumTriageDumpDataBlocks
;
1339 extern PVOID IopTriageDumpDataBlocks
[64];
1340 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList
;
1341 extern PDRIVER_OBJECT IopRootDriverObject
;
1342 extern KSPIN_LOCK IopDeviceActionLock
;
1343 extern LIST_ENTRY IopDeviceActionRequestList
;
1344 extern RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator
;
1347 // Inlined Functions