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
84 // Unable to create system root path when creating the RAM disk
86 #define RD_SYSROOT_INIT_FAILED 6
89 // Max traversal of reparse points for a single open in IoParseDevice
91 #define IOP_MAX_REPARSE_TRAVERSAL 0x20
94 // Private flags for IoCreateFile / IoParseDevice
96 #define IOP_USE_TOP_LEVEL_DEVICE_HINT 0x01
97 #define IOP_CREATE_FILE_OBJECT_EXTENSION 0x02
100 typedef struct _FILE_OBJECT_EXTENSION
102 PDEVICE_OBJECT TopDeviceObjectHint
;
105 } FILE_OBJECT_EXTENSION
, *PFILE_OBJECT_EXTENSION
;
110 // We can call the Ob Inlined API, it's the same thing
112 #define IopAllocateMdlFromLookaside \
113 ObpAllocateObjectCreateInfoBuffer
114 #define IopFreeMdlFromLookaside \
115 ObpFreeCapturedAttributes
118 // Determines if the IRP is Synchronous
120 #define IsIrpSynchronous(Irp, FileObject) \
121 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
124 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
127 // Returns the internal Device Object Extension
129 #define IoGetDevObjExtension(DeviceObject) \
130 ((PEXTENDED_DEVOBJ_EXTENSION) \
131 (DeviceObject->DeviceObjectExtension)) \
134 // Returns the internal Driver Object Extension
136 #define IoGetDrvObjExtension(DriverObject) \
137 ((PEXTENDED_DRIVER_EXTENSION) \
138 (DriverObject->DriverExtension)) \
142 * IopDeviceNodeSetFlag(
143 * PDEVICE_NODE DeviceNode,
146 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
147 ((DeviceNode)->Flags |= (Flag))
151 * IopDeviceNodeClearFlag(
152 * PDEVICE_NODE DeviceNode,
155 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
156 ((DeviceNode)->Flags &= ~(Flag))
160 * IopDeviceNodeHasFlag(
161 * PDEVICE_NODE DeviceNode,
164 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
165 (((DeviceNode)->Flags & (Flag)) > 0)
169 * IopDeviceNodeSetUserFlag(
170 * PDEVICE_NODE DeviceNode,
173 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
174 ((DeviceNode)->UserFlags |= (UserFlag))
178 * IopDeviceNodeClearUserFlag(
179 * PDEVICE_NODE DeviceNode,
182 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
183 ((DeviceNode)->UserFlags &= ~(UserFlag))
187 * IopDeviceNodeHasUserFlag(
188 * PDEVICE_NODE DeviceNode,
191 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
192 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
196 * IopDeviceNodeSetProblem(
197 * PDEVICE_NODE DeviceNode,
200 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
201 ((DeviceNode)->Problem |= (Problem))
205 * IopDeviceNodeClearProblem(
206 * PDEVICE_NODE DeviceNode,
209 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
210 ((DeviceNode)->Problem &= ~(Problem))
214 * IopDeviceNodeHasProblem(
215 * PDEVICE_NODE DeviceNode,
218 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
219 (((DeviceNode)->Problem & (Problem)) > 0)
223 * IopInitDeviceTreeTraverseContext(
224 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
225 * PDEVICE_NODE DeviceNode,
226 * DEVICETREE_TRAVERSE_ROUTINE Action,
229 #define IopInitDeviceTreeTraverseContext( \
230 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
232 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
234 (_DeviceTreeTraverseContext)->Action = (_Action); \
235 (_DeviceTreeTraverseContext)->Context = (_Context); }
239 * IopIsValidPhysicalDeviceObject(
240 * IN PDEVICE_OBJECT PhysicalDeviceObject);
242 #define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \
243 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \
244 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \
245 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED))
248 // Device List Operations
250 typedef enum _IOP_DEVICE_LIST_OPERATION
254 } IOP_DEVICE_LIST_OPERATION
, *PIOP_DEVICE_LIST_OPERATION
;
257 // Transfer statistics
259 typedef enum _IOP_TRANSFER_TYPE
264 } IOP_TRANSFER_TYPE
, *PIOP_TRANSFER_TYPE
;
267 // Packet Types when piggybacking on the IRP Overlay
269 typedef enum _COMPLETION_PACKET_TYPE
271 IopCompletionPacketIrp
,
272 IopCompletionPacketMini
,
273 IopCompletionPacketQuota
274 } COMPLETION_PACKET_TYPE
, *PCOMPLETION_PACKET_TYPE
;
277 // Special version of the IRP Overlay used to optimize I/O completion
278 // by not using up a separate structure.
280 typedef struct _IOP_MINI_COMPLETION_PACKET
284 LIST_ENTRY ListEntry
;
287 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
294 ULONG_PTR IoStatusInformation
;
295 } IOP_MINI_COMPLETION_PACKET
, *PIOP_MINI_COMPLETION_PACKET
;
298 // I/O Completion Context for IoSetIoCompletionRoutineEx
300 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
302 PDEVICE_OBJECT DeviceObject
;
304 PIO_COMPLETION_ROUTINE CompletionRoutine
;
305 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT
, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT
;
308 // I/O Wrapper around the Executive Work Item
310 typedef struct _IO_WORKITEM
312 WORK_QUEUE_ITEM Item
;
313 PDEVICE_OBJECT DeviceObject
;
314 PIO_WORKITEM_ROUTINE WorkerRoutine
;
319 // I/O Wrapper around the Kernel Interrupt
321 typedef struct _IO_INTERRUPT
323 KINTERRUPT FirstInterrupt
;
324 PKINTERRUPT Interrupt
[MAXIMUM_PROCESSORS
];
326 } IO_INTERRUPT
, *PIO_INTERRUPT
;
329 // I/O Error Log Packet Header
331 typedef struct _ERROR_LOG_ENTRY
335 LIST_ENTRY ListEntry
;
336 PDEVICE_OBJECT DeviceObject
;
337 PDRIVER_OBJECT DriverObject
;
338 LARGE_INTEGER TimeStamp
;
339 } ERROR_LOG_ENTRY
, *PERROR_LOG_ENTRY
;
342 // To simplify matters, the kernel is made to support both the checked and free
343 // version of the I/O Remove Lock in the same binary. This structure includes
344 // both, since the DDK has the structure with a compile-time #ifdef.
346 typedef struct _EXTENDED_IO_REMOVE_LOCK
348 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
349 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
350 } EXTENDED_IO_REMOVE_LOCK
, *PEXTENDED_IO_REMOVE_LOCK
;
353 // Dummy File Object used inside the Open Packet so that OB knows how to
354 // deal with the Object Pointer even though it's not a real file.
356 typedef struct _DUMMY_FILE_OBJECT
358 OBJECT_HEADER ObjectHeader
;
359 CHAR FileObjectBody
[sizeof(FILE_OBJECT
)];
360 } DUMMY_FILE_OBJECT
, *PDUMMY_FILE_OBJECT
;
363 // Open packet used as a context for Device/File parsing so that the parse
364 // routine can know what operation is being requested.
366 typedef struct _OPEN_PACKET
370 PFILE_OBJECT FileObject
;
371 NTSTATUS FinalStatus
;
372 ULONG_PTR Information
;
374 PFILE_OBJECT RelatedFileObject
;
375 OBJECT_ATTRIBUTES OriginalAttributes
;
376 LARGE_INTEGER AllocationSize
;
378 USHORT FileAttributes
;
384 PFILE_BASIC_INFORMATION BasicInformation
;
385 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
;
386 CREATE_FILE_TYPE CreateFileType
;
387 PVOID ExtraCreateParameters
;
391 BOOLEAN FullAttributes
;
392 PDUMMY_FILE_OBJECT LocalFileObject
;
393 BOOLEAN TraversedMountPoint
;
395 PDEVICE_OBJECT TopDeviceObjectHint
;
396 } OPEN_PACKET
, *POPEN_PACKET
;
399 // Boot Driver List Entry
401 typedef struct _DRIVER_INFORMATION
404 PDRIVER_OBJECT DriverObject
;
405 PBOOT_DRIVER_LIST_ENTRY DataTableEntry
;
406 HANDLE ServiceHandle
;
411 } DRIVER_INFORMATION
, *PDRIVER_INFORMATION
;
414 // List of Bus Type GUIDs
416 typedef struct _IO_BUS_TYPE_GUID_LIST
421 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
422 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
425 // Shutdown entry for registed devices
427 typedef struct _SHUTDOWN_ENTRY
429 LIST_ENTRY ShutdownList
;
430 PDEVICE_OBJECT DeviceObject
;
431 } SHUTDOWN_ENTRY
, *PSHUTDOWN_ENTRY
;
434 // F/S Notification entry for registered File Systems
436 typedef struct _FS_CHANGE_NOTIFY_ENTRY
438 LIST_ENTRY FsChangeNotifyList
;
439 PDRIVER_OBJECT DriverObject
;
440 PDRIVER_FS_NOTIFICATION FSDNotificationProc
;
441 } FS_CHANGE_NOTIFY_ENTRY
, *PFS_CHANGE_NOTIFY_ENTRY
;
444 // Driver (Boot) Re-Initialization Entry
446 typedef struct _DRIVER_REINIT_ITEM
448 LIST_ENTRY ItemEntry
;
449 PDRIVER_OBJECT DriverObject
;
450 PDRIVER_REINITIALIZE ReinitRoutine
;
452 } DRIVER_REINIT_ITEM
, *PDRIVER_REINIT_ITEM
;
455 // Called on every visit of a node during a preorder-traversal of the device
457 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
458 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
459 // Any other returned status code will be returned to the caller. If a status
460 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
461 // the traversal is stopped immediately and the status code is returned to
466 (*DEVICETREE_TRAVERSE_ROUTINE
)(
467 IN PDEVICE_NODE DeviceNode
,
472 // Context information for traversing the device tree
474 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
477 // Current device node during a traversal
479 PDEVICE_NODE DeviceNode
;
482 // Initial device node where we start the traversal
484 PDEVICE_NODE FirstDeviceNode
;
487 // Action routine to be called for every device node
489 DEVICETREE_TRAVERSE_ROUTINE Action
;
492 // Context passed to the action routine
495 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
498 // Reserve IRP allocator
499 // Used for read paging IOs in low-memory situations
501 typedef struct _RESERVE_IRP_ALLOCATOR
504 volatile LONG ReserveIrpInUse
;
507 } RESERVE_IRP_ALLOCATOR
, *PRESERVE_IRP_ALLOCATOR
;
510 // Type selection for IopCreateSecurityDescriptorPerType()
512 typedef enum _SECURITY_DESCRIPTOR_TYPE
514 RestrictedPublic
= 1,
516 RestrictedPublicOpen
,
517 UnrestrictedPublicOpen
,
519 } SECURITY_DESCRIPTOR_TYPE
, *PSECURITY_DESCRIPTOR_TYPE
;
522 // Action types and data for PiQueueDeviceAction()
524 typedef enum _DEVICE_ACTION
526 PiActionEnumDeviceTree
,
527 PiActionEnumRootDevices
,
529 PiActionAddBootDevices
,
539 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList
);
543 IopAssignDeviceResources(
544 IN PDEVICE_NODE DeviceNode
549 IopFixupResourceListWithRequirements(
550 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList
,
551 OUT PCM_RESOURCE_LIST
*ResourceList
556 IopDetectResourceConflict(
557 IN PCM_RESOURCE_LIST ResourceList
,
559 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
567 PipCallDriverAddDevice(
568 IN PDEVICE_NODE DeviceNode
,
569 IN BOOLEAN LoadDriver
,
570 IN PDRIVER_OBJECT DriverObject
576 IopInitializePlugPlayServices(
592 IopInitDriverImplementation(
597 IopGetSystemPowerDeviceObject(
598 IN PDEVICE_OBJECT
*DeviceObject
602 PipAllocateDeviceNode(
603 IN PDEVICE_OBJECT PhysicalDeviceObject
608 _In_ PDEVICE_NODE DeviceNode
,
609 _In_ PDEVICE_NODE ParentNode
);
613 _In_ PDEVICE_NODE DeviceNode
,
614 _In_ PNP_DEVNODE_STATE NewState
);
618 _In_ PDEVICE_NODE DeviceNode
,
619 _In_ UINT32 Problem
);
622 PiClearDevNodeProblem(
623 _In_ PDEVICE_NODE DeviceNode
);
627 IN PDEVICE_NODE DeviceNode
632 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode
,
633 PDEVICE_CAPABILITIES DeviceCaps
);
637 IN PDEVICE_OBJECT DeviceObject
,
638 IN PIO_STACK_LOCATION IoStackLocation
,
639 OUT PVOID
*Information
645 IN PDEVICE_OBJECT DeviceObject
,
646 IN PIO_STATUS_BLOCK IoStatusBlock
,
647 IN UCHAR MinorFunction
,
648 IN PIO_STACK_LOCATION Stack
654 IN PDEVICE_OBJECT DeviceObject
669 IopInitPlugPlayEvents(VOID
);
672 IopQueueTargetDeviceEvent(
674 PUNICODE_STRING DeviceIds
679 IopOpenRegistryKeyEx(
682 PUNICODE_STRING Name
,
683 ACCESS_MASK DesiredAccess
);
690 OUT PKEY_VALUE_FULL_INFORMATION
*Information
695 IopCreateRegistryKeyEx(
697 IN HANDLE BaseHandle OPTIONAL
,
698 IN PUNICODE_STRING KeyName
,
699 IN ACCESS_MASK DesiredAccess
,
700 IN ULONG CreateOptions
,
701 OUT PULONG Disposition OPTIONAL
706 IopTraverseDeviceTree(
707 PDEVICETREE_TRAVERSE_CONTEXT Context
);
711 IopCreateDeviceKeyPath(
712 IN PCUNICODE_STRING RegistryPath
,
713 IN ULONG CreateOptions
,
729 PiInitCacheGroupInformation(
735 PpInitGetGroupOrderIndex(
736 IN HANDLE ServiceHandle
741 PipGetDriverTagPriority(
742 IN HANDLE ServiceHandle
747 PnpRegMultiSzToUnicodeStrings(
748 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation
,
749 OUT PUNICODE_STRING
*UnicodeStringList
,
750 OUT PULONG UnicodeStringCount
757 IN ULONG RegSzLength
,
758 OUT PUSHORT StringLength OPTIONAL
763 _In_ PDEVICE_NODE DeviceNode
,
764 _In_ HANDLE InstanceKey
);
767 // Initialization Routines
773 IN PLOADER_PARAMETER_BLOCK LoaderBlock
779 IopReassignSystemRoot(
780 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
781 OUT PANSI_STRING NtBootPath
788 IN PLOADER_PARAMETER_BLOCK LoaderBlock
793 IopVerifyDiskSignature(
794 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout
,
795 IN PARC_DISK_SIGNATURE ArcDiskSignature
,
801 IoInitializeCrashDump(
802 IN HANDLE PageFileHandle
807 PiInitializeNotifications(
811 // Device/Volume Routines
815 IopReadyDeviceObjects(
816 IN PDRIVER_OBJECT Driver
822 IN POPEN_PACKET OpenPacket
,
823 IN PDEVICE_OBJECT DeviceObject
,
824 IN PUNICODE_STRING RemainingName
,
831 IN PDEVICE_OBJECT DeviceObject
,
832 IN BOOLEAN AllowRawMount
,
833 IN BOOLEAN DeviceIsLocked
,
834 IN BOOLEAN Alertable
,
840 IN PVOID SymbolicLink
845 IN PVOID SymbolicLink
,
852 IN PDEVICE_OBJECT DeviceObject
857 IopDereferenceVpbAndFree(
863 IoInitFileSystemImplementation(
869 IoInitVpbImplementation(
875 IopReferenceDeviceObject(
876 IN PDEVICE_OBJECT DeviceObject
881 IopDereferenceDeviceObject(
882 IN PDEVICE_OBJECT DeviceObject
,
883 IN BOOLEAN ForceUnload
888 IopGetRelatedTargetDevice(
889 IN PFILE_OBJECT FileObject
,
890 OUT PDEVICE_NODE
*DeviceNode
);
894 IoGetRelatedTargetDevice(
895 IN PFILE_OBJECT FileObject
,
896 OUT PDEVICE_OBJECT
*DeviceObject
902 IN PDEVICE_OBJECT DeviceObject
907 IopGetDeviceAttachmentBase(
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
973 IN BOOLEAN StartBootLog
989 IN PUNICODE_STRING DriverName
,
994 IopSaveBootLogToFile(
999 // I/O Cancellation Routines
1008 IoInitCancelHandling(
1019 IN PKNORMAL_ROUTINE
* NormalRoutine
,
1020 IN PVOID
* NormalContext
,
1021 IN PVOID
* SystemArgument1
,
1022 IN PVOID
* SystemArgument2
1026 // Error Logging Routines
1041 // Raw File System MiniDriver
1044 RawFsIsRawFileSystemDeviceObject(
1045 IN PDEVICE_OBJECT DeviceObject
1052 IN PDRIVER_OBJECT DriverObject
,
1053 IN PUNICODE_STRING RegistryPath
1057 // PnP Root MiniDriver
1062 IN PDRIVER_OBJECT DriverObject
,
1063 IN PUNICODE_STRING RegistryPath
1067 PnpRootCreateDevice(
1068 IN PUNICODE_STRING ServiceName
,
1069 IN OPTIONAL PDRIVER_OBJECT DriverObject
,
1070 OUT PDEVICE_OBJECT
*PhysicalDeviceObject
,
1071 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1075 PnpRootRegisterDevice(
1076 IN PDEVICE_OBJECT DeviceObject
);
1084 IopInitializeBootDrivers(
1091 IopInitializeSystemDrivers(
1103 _In_ HANDLE ServiceHandle
,
1104 _Out_ PDRIVER_OBJECT
*DriverObject
);
1108 _In_ HANDLE ServiceHandle
,
1109 _Out_ PUNICODE_STRING DriverName
,
1110 _Out_opt_ PUNICODE_STRING ServiceName
);
1113 IopInitializeDriverModule(
1114 _In_ PLDR_DATA_TABLE_ENTRY ModuleObject
,
1115 _In_ HANDLE ServiceHandle
,
1116 _Out_ PDRIVER_OBJECT
*DriverObject
,
1117 _Out_ NTSTATUS
*DriverEntryStatus
);
1121 IopAttachFilterDrivers(
1122 IN PDEVICE_NODE DeviceNode
,
1123 IN HANDLE EnumSubKey
,
1130 IopReinitializeDrivers(
1136 IopReinitializeBootDrivers(
1145 IopDeleteDevice(IN PVOID ObjectBody
);
1150 IN PVOID ParseObject
,
1151 IN PVOID ObjectType
,
1152 IN OUT PACCESS_STATE AccessState
,
1153 IN KPROCESSOR_MODE AccessMode
,
1154 IN ULONG Attributes
,
1155 IN OUT PUNICODE_STRING CompleteName
,
1156 IN OUT PUNICODE_STRING RemainingName
,
1157 IN OUT PVOID Context
,
1158 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1165 IN PVOID ParseObject
,
1166 IN PVOID ObjectType
,
1167 IN OUT PACCESS_STATE AccessState
,
1168 IN KPROCESSOR_MODE AccessMode
,
1169 IN ULONG Attributes
,
1170 IN OUT PUNICODE_STRING CompleteName
,
1171 IN OUT PUNICODE_STRING RemainingName
,
1172 IN OUT PVOID Context OPTIONAL
,
1173 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1185 IopGetSetSecurityObject(
1186 IN PVOID ObjectBody
,
1187 IN SECURITY_OPERATION_CODE OperationCode
,
1188 IN PSECURITY_INFORMATION SecurityInformation
,
1189 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1190 IN OUT PULONG BufferLength
,
1191 OUT PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
1192 IN POOL_TYPE PoolType
,
1193 IN OUT PGENERIC_MAPPING GenericMapping
1199 IN PVOID ObjectBody
,
1201 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1203 OUT PULONG ReturnLength
,
1204 IN KPROCESSOR_MODE PreviousMode
1209 IopQueryNameInternal(
1210 IN PVOID ObjectBody
,
1212 IN BOOLEAN QueryDosName
,
1213 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1215 OUT PULONG ReturnLength
,
1216 IN KPROCESSOR_MODE PreviousMode
1222 IN PEPROCESS Process OPTIONAL
,
1224 IN ACCESS_MASK GrantedAccess
,
1225 IN ULONG ProcessHandleCount
,
1226 IN ULONG SystemHandleCount
1231 IopAcquireFileObjectLock(
1232 _In_ PFILE_OBJECT FileObject
,
1233 _In_ KPROCESSOR_MODE AccessMode
,
1234 _In_ BOOLEAN Alertable
,
1235 _Out_ PBOOLEAN LockFailed
1240 IoGetFileObjectFilterContext(
1241 IN PFILE_OBJECT FileObject
1246 IoChangeFileObjectFilterContext(
1247 IN PFILE_OBJECT FileObject
,
1248 IN PVOID FilterContext
,
1254 IopDoNameTransmogrify(
1256 IN PFILE_OBJECT FileObject
,
1257 IN PREPARSE_DATA_BUFFER DataBuffer
1262 IoComputeDesiredAccessFileObject(
1263 IN PFILE_OBJECT FileObject
,
1264 IN PACCESS_MASK DesiredAccess
1269 IopGetFileInformation(
1270 IN PFILE_OBJECT FileObject
,
1272 IN FILE_INFORMATION_CLASS FileInfoClass
,
1274 OUT PULONG ReturnedLength
1279 IopVerifyDeviceObjectOnStack(
1280 IN PDEVICE_OBJECT BaseDeviceObject
,
1281 IN PDEVICE_OBJECT TopDeviceObjectHint
1285 // I/O Timer Routines
1289 IopInitTimerImplementation(
1295 IopRemoveTimerFromTimerList(
1300 // I/O Completion Routines
1304 IopDeleteIoCompletion(
1311 IN PVOID IoCompletion
,
1312 IN PVOID KeyContext
,
1313 IN PVOID ApcContext
,
1314 IN NTSTATUS IoStatus
,
1315 IN ULONG_PTR IoStatusInformation
,
1326 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1330 // Configuration Routines
1334 IopFetchConfigurationInformation(OUT PWSTR
* SymbolicLinkList
,
1336 IN ULONG ExpectedInterfaces
,
1337 IN PULONG Interfaces
1342 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName
,
1343 IN PUNICODE_STRING OsLoaderPathName
1350 PiQueueDeviceAction(
1351 _In_ PDEVICE_OBJECT DeviceObject
,
1352 _In_ DEVICE_ACTION Action
,
1353 _In_opt_ PKEVENT CompletionEvent
,
1354 _Out_opt_ NTSTATUS
*CompletionStatus
);
1357 PiPerformSyncDeviceAction(
1358 _In_ PDEVICE_OBJECT DeviceObject
,
1359 _In_ DEVICE_ACTION Action
);
1362 // PnP notifications
1366 PiNotifyDeviceInterfaceChange(
1368 _In_ LPCGUID InterfaceClassGuid
,
1369 _In_ PUNICODE_STRING SymbolicLinkName
);
1373 PiNotifyHardwareProfileChange(
1374 _In_ LPCGUID Event
);
1378 PiNotifyTargetDeviceChange(
1380 _In_ PDEVICE_OBJECT DeviceObject
,
1381 _In_opt_ PTARGET_DEVICE_CUSTOM_NOTIFICATION CustomNotification
);
1388 _In_ PDEVICE_NODE DeviceNode
);
1392 _In_ PDEVICE_NODE DeviceNode
);
1395 PiIrpQueryStopDevice(
1396 _In_ PDEVICE_NODE DeviceNode
);
1399 PiIrpCancelStopDevice(
1400 _In_ PDEVICE_NODE DeviceNode
);
1403 PiIrpQueryDeviceRelations(
1404 _In_ PDEVICE_NODE DeviceNode
,
1405 _In_ DEVICE_RELATION_TYPE Type
);
1408 PiIrpQueryResources(
1409 _In_ PDEVICE_NODE DeviceNode
,
1410 _Out_ PCM_RESOURCE_LIST
*Resources
);
1413 PiIrpQueryResourceRequirements(
1414 _In_ PDEVICE_NODE DeviceNode
,
1415 _Out_ PIO_RESOURCE_REQUIREMENTS_LIST
*Resources
);
1418 PiIrpQueryDeviceText(
1419 _In_ PDEVICE_NODE DeviceNode
,
1421 _In_ DEVICE_TEXT_TYPE Type
,
1422 _Out_ PWSTR
*DeviceText
);
1425 PiIrpQueryPnPDeviceState(
1426 _In_ PDEVICE_NODE DeviceNode
,
1427 _Out_ PPNP_DEVICE_STATE DeviceState
);
1432 extern POBJECT_TYPE IoCompletionType
;
1433 extern PDEVICE_NODE IopRootDeviceNode
;
1434 extern KSPIN_LOCK IopDeviceTreeLock
;
1435 extern ULONG IopTraceLevel
;
1436 extern GENERAL_LOOKASIDE IopMdlLookasideList
;
1437 extern GENERIC_MAPPING IopCompletionMapping
;
1438 extern GENERIC_MAPPING IopFileMapping
;
1439 extern POBJECT_TYPE _IoFileObjectType
;
1440 extern HAL_DISPATCH _HalDispatchTable
;
1441 extern LIST_ENTRY IopErrorLogListHead
;
1442 extern ULONG IopNumTriageDumpDataBlocks
;
1443 extern PVOID IopTriageDumpDataBlocks
[64];
1444 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList
;
1445 extern PDRIVER_OBJECT IopRootDriverObject
;
1446 extern KSPIN_LOCK IopDeviceActionLock
;
1447 extern LIST_ENTRY IopDeviceActionRequestList
;
1448 extern RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator
;
1449 extern BOOLEAN IoRemoteBootClient
;
1452 // Inlined Functions