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
;
101 } FILE_OBJECT_EXTENSION
, *PFILE_OBJECT_EXTENSION
;
106 // We can call the Ob Inlined API, it's the same thing
108 #define IopAllocateMdlFromLookaside \
109 ObpAllocateObjectCreateInfoBuffer
110 #define IopFreeMdlFromLookaside \
111 ObpFreeCapturedAttributes
114 // Determines if the IRP is Synchronous
116 #define IsIrpSynchronous(Irp, FileObject) \
117 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
120 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
123 // Returns the internal Device Object Extension
125 #define IoGetDevObjExtension(DeviceObject) \
126 ((PEXTENDED_DEVOBJ_EXTENSION) \
127 (DeviceObject->DeviceObjectExtension)) \
130 // Returns the internal Driver Object Extension
132 #define IoGetDrvObjExtension(DriverObject) \
133 ((PEXTENDED_DRIVER_EXTENSION) \
134 (DriverObject->DriverExtension)) \
138 * IopDeviceNodeSetFlag(
139 * PDEVICE_NODE DeviceNode,
142 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
143 ((DeviceNode)->Flags |= (Flag))
147 * IopDeviceNodeClearFlag(
148 * PDEVICE_NODE DeviceNode,
151 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
152 ((DeviceNode)->Flags &= ~(Flag))
156 * IopDeviceNodeHasFlag(
157 * PDEVICE_NODE DeviceNode,
160 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
161 (((DeviceNode)->Flags & (Flag)) > 0)
165 * IopDeviceNodeSetUserFlag(
166 * PDEVICE_NODE DeviceNode,
169 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
170 ((DeviceNode)->UserFlags |= (UserFlag))
174 * IopDeviceNodeClearUserFlag(
175 * PDEVICE_NODE DeviceNode,
178 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
179 ((DeviceNode)->UserFlags &= ~(UserFlag))
183 * IopDeviceNodeHasUserFlag(
184 * PDEVICE_NODE DeviceNode,
187 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
188 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
192 * IopDeviceNodeSetProblem(
193 * PDEVICE_NODE DeviceNode,
196 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
197 ((DeviceNode)->Problem |= (Problem))
201 * IopDeviceNodeClearProblem(
202 * PDEVICE_NODE DeviceNode,
205 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
206 ((DeviceNode)->Problem &= ~(Problem))
210 * IopDeviceNodeHasProblem(
211 * PDEVICE_NODE DeviceNode,
214 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
215 (((DeviceNode)->Problem & (Problem)) > 0)
219 * IopInitDeviceTreeTraverseContext(
220 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
221 * PDEVICE_NODE DeviceNode,
222 * DEVICETREE_TRAVERSE_ROUTINE Action,
225 #define IopInitDeviceTreeTraverseContext( \
226 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
228 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
230 (_DeviceTreeTraverseContext)->Action = (_Action); \
231 (_DeviceTreeTraverseContext)->Context = (_Context); }
235 * IopIsValidPhysicalDeviceObject(
236 * IN PDEVICE_OBJECT PhysicalDeviceObject);
238 #define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \
239 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \
240 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \
241 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED))
244 // Device List Operations
246 typedef enum _IOP_DEVICE_LIST_OPERATION
250 } IOP_DEVICE_LIST_OPERATION
, *PIOP_DEVICE_LIST_OPERATION
;
253 // Transfer statistics
255 typedef enum _IOP_TRANSFER_TYPE
260 } IOP_TRANSFER_TYPE
, *PIOP_TRANSFER_TYPE
;
263 // Packet Types when piggybacking on the IRP Overlay
265 typedef enum _COMPLETION_PACKET_TYPE
267 IopCompletionPacketIrp
,
268 IopCompletionPacketMini
,
269 IopCompletionPacketQuota
270 } COMPLETION_PACKET_TYPE
, *PCOMPLETION_PACKET_TYPE
;
273 // Special version of the IRP Overlay used to optimize I/O completion
274 // by not using up a separate structure.
276 typedef struct _IOP_MINI_COMPLETION_PACKET
280 LIST_ENTRY ListEntry
;
283 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
290 ULONG_PTR IoStatusInformation
;
291 } IOP_MINI_COMPLETION_PACKET
, *PIOP_MINI_COMPLETION_PACKET
;
294 // I/O Completion Context for IoSetIoCompletionRoutineEx
296 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
298 PDEVICE_OBJECT DeviceObject
;
300 PIO_COMPLETION_ROUTINE CompletionRoutine
;
301 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT
, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT
;
304 // I/O Wrapper around the Executive Work Item
306 typedef struct _IO_WORKITEM
308 WORK_QUEUE_ITEM Item
;
309 PDEVICE_OBJECT DeviceObject
;
310 PIO_WORKITEM_ROUTINE WorkerRoutine
;
315 // I/O Wrapper around the Kernel Interrupt
317 typedef struct _IO_INTERRUPT
319 KINTERRUPT FirstInterrupt
;
320 PKINTERRUPT Interrupt
[MAXIMUM_PROCESSORS
];
322 } IO_INTERRUPT
, *PIO_INTERRUPT
;
325 // I/O Error Log Packet Header
327 typedef struct _ERROR_LOG_ENTRY
331 LIST_ENTRY ListEntry
;
332 PDEVICE_OBJECT DeviceObject
;
333 PDRIVER_OBJECT DriverObject
;
334 LARGE_INTEGER TimeStamp
;
335 } ERROR_LOG_ENTRY
, *PERROR_LOG_ENTRY
;
338 // To simplify matters, the kernel is made to support both the checked and free
339 // version of the I/O Remove Lock in the same binary. This structure includes
340 // both, since the DDK has the structure with a compile-time #ifdef.
342 typedef struct _EXTENDED_IO_REMOVE_LOCK
344 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
345 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
346 } EXTENDED_IO_REMOVE_LOCK
, *PEXTENDED_IO_REMOVE_LOCK
;
349 // Dummy File Object used inside the Open Packet so that OB knows how to
350 // deal with the Object Pointer even though it's not a real file.
352 typedef struct _DUMMY_FILE_OBJECT
354 OBJECT_HEADER ObjectHeader
;
355 CHAR FileObjectBody
[sizeof(FILE_OBJECT
)];
356 } DUMMY_FILE_OBJECT
, *PDUMMY_FILE_OBJECT
;
359 // Open packet used as a context for Device/File parsing so that the parse
360 // routine can know what operation is being requested.
362 typedef struct _OPEN_PACKET
366 PFILE_OBJECT FileObject
;
367 NTSTATUS FinalStatus
;
368 ULONG_PTR Information
;
370 PFILE_OBJECT RelatedFileObject
;
371 OBJECT_ATTRIBUTES OriginalAttributes
;
372 LARGE_INTEGER AllocationSize
;
374 USHORT FileAttributes
;
380 PFILE_BASIC_INFORMATION BasicInformation
;
381 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
;
382 CREATE_FILE_TYPE CreateFileType
;
383 PVOID ExtraCreateParameters
;
387 BOOLEAN FullAttributes
;
388 PDUMMY_FILE_OBJECT LocalFileObject
;
389 BOOLEAN TraversedMountPoint
;
391 PDEVICE_OBJECT TopDeviceObjectHint
;
392 } OPEN_PACKET
, *POPEN_PACKET
;
395 // Boot Driver List Entry
397 typedef struct _DRIVER_INFORMATION
400 PDRIVER_OBJECT DriverObject
;
401 PBOOT_DRIVER_LIST_ENTRY DataTableEntry
;
402 HANDLE ServiceHandle
;
407 } DRIVER_INFORMATION
, *PDRIVER_INFORMATION
;
412 typedef struct _BOOT_DRIVER_NODE
414 BOOT_DRIVER_LIST_ENTRY ListEntry
;
415 UNICODE_STRING Group
;
419 } BOOT_DRIVER_NODE
, *PBOOT_DRIVER_NODE
;
422 // List of Bus Type GUIDs
424 typedef struct _IO_BUS_TYPE_GUID_LIST
429 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
430 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
433 // Shutdown entry for registed devices
435 typedef struct _SHUTDOWN_ENTRY
437 LIST_ENTRY ShutdownList
;
438 PDEVICE_OBJECT DeviceObject
;
439 } SHUTDOWN_ENTRY
, *PSHUTDOWN_ENTRY
;
442 // F/S Notification entry for registered File Systems
444 typedef struct _FS_CHANGE_NOTIFY_ENTRY
446 LIST_ENTRY FsChangeNotifyList
;
447 PDRIVER_OBJECT DriverObject
;
448 PDRIVER_FS_NOTIFICATION FSDNotificationProc
;
449 } FS_CHANGE_NOTIFY_ENTRY
, *PFS_CHANGE_NOTIFY_ENTRY
;
452 // Driver (Boot) Re-Initialization Entry
454 typedef struct _DRIVER_REINIT_ITEM
456 LIST_ENTRY ItemEntry
;
457 PDRIVER_OBJECT DriverObject
;
458 PDRIVER_REINITIALIZE ReinitRoutine
;
460 } DRIVER_REINIT_ITEM
, *PDRIVER_REINIT_ITEM
;
463 // Called on every visit of a node during a preorder-traversal of the device
465 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
466 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
467 // Any other returned status code will be returned to the caller. If a status
468 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
469 // the traversal is stopped immediately and the status code is returned to
474 (*DEVICETREE_TRAVERSE_ROUTINE
)(
475 IN PDEVICE_NODE DeviceNode
,
480 // Context information for traversing the device tree
482 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
485 // Current device node during a traversal
487 PDEVICE_NODE DeviceNode
;
490 // Initial device node where we start the traversal
492 PDEVICE_NODE FirstDeviceNode
;
495 // Action routine to be called for every device node
497 DEVICETREE_TRAVERSE_ROUTINE Action
;
500 // Context passed to the action routine
503 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
506 // Reserve IRP allocator
507 // Used for read paging IOs in low-memory situations
509 typedef struct _RESERVE_IRP_ALLOCATOR
512 volatile LONG ReserveIrpInUse
;
515 } RESERVE_IRP_ALLOCATOR
, *PRESERVE_IRP_ALLOCATOR
;
518 // Type selection for IopCreateSecurityDescriptorPerType()
520 typedef enum _SECURITY_DESCRIPTOR_TYPE
522 RestrictedPublic
= 1,
524 RestrictedPublicOpen
,
525 UnrestrictedPublicOpen
,
527 } SECURITY_DESCRIPTOR_TYPE
, *PSECURITY_DESCRIPTOR_TYPE
;
530 // Action types and data for PiQueueDeviceAction()
532 typedef enum _DEVICE_ACTION
534 PiActionEnumDeviceTree
,
535 PiActionEnumRootDevices
,
537 PiActionAddBootDevices
,
546 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList
);
550 IopAssignDeviceResources(
551 IN PDEVICE_NODE DeviceNode
556 IopFixupResourceListWithRequirements(
557 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList
,
558 OUT PCM_RESOURCE_LIST
*ResourceList
563 IopDetectResourceConflict(
564 IN PCM_RESOURCE_LIST ResourceList
,
566 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
574 IopInitializePlugPlayServices(
590 IopInitDriverImplementation(
595 IopGetSystemPowerDeviceObject(
596 IN PDEVICE_OBJECT
*DeviceObject
600 PipAllocateDeviceNode(
601 IN PDEVICE_OBJECT PhysicalDeviceObject
606 _In_ PDEVICE_NODE DeviceNode
,
607 _In_ PDEVICE_NODE ParentNode
);
611 _In_ PDEVICE_NODE DeviceNode
,
612 _In_ PNP_DEVNODE_STATE NewState
);
616 _In_ PDEVICE_NODE DeviceNode
,
617 _In_ UINT32 Problem
);
620 PiClearDevNodeProblem(
621 _In_ PDEVICE_NODE DeviceNode
);
625 IN PDEVICE_NODE DeviceNode
630 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode
,
631 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
666 IopInitPlugPlayEvents(VOID
);
669 IopQueueTargetDeviceEvent(
671 PUNICODE_STRING DeviceIds
676 IopOpenRegistryKeyEx(
679 PUNICODE_STRING Name
,
680 ACCESS_MASK DesiredAccess
);
687 OUT PKEY_VALUE_FULL_INFORMATION
*Information
692 IopCreateRegistryKeyEx(
694 IN HANDLE BaseHandle OPTIONAL
,
695 IN PUNICODE_STRING KeyName
,
696 IN ACCESS_MASK DesiredAccess
,
697 IN ULONG CreateOptions
,
698 OUT PULONG Disposition OPTIONAL
703 IopTraverseDeviceTree(
704 PDEVICETREE_TRAVERSE_CONTEXT Context
);
708 IopCreateDeviceKeyPath(
709 IN PCUNICODE_STRING RegistryPath
,
710 IN ULONG CreateOptions
,
724 PiInitCacheGroupInformation(
730 PpInitGetGroupOrderIndex(
731 IN HANDLE ServiceHandle
736 PipGetDriverTagPriority(
737 IN HANDLE ServiceHandle
742 PnpRegMultiSzToUnicodeStrings(
743 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation
,
744 OUT PUNICODE_STRING
*UnicodeStringList
,
745 OUT PULONG UnicodeStringCount
752 IN ULONG RegSzLength
,
753 OUT PUSHORT StringLength OPTIONAL
757 // Initialization Routines
762 IN PLOADER_PARAMETER_BLOCK LoaderBlock
767 IopReassignSystemRoot(
768 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
769 OUT PANSI_STRING NtBootPath
775 IN PLOADER_PARAMETER_BLOCK LoaderBlock
780 IopVerifyDiskSignature(
781 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout
,
782 IN PARC_DISK_SIGNATURE ArcDiskSignature
,
788 IoInitializeCrashDump(
789 IN HANDLE PageFileHandle
793 PiInitializeNotifications(
797 // Device/Volume Routines
801 IopReadyDeviceObjects(
802 IN PDRIVER_OBJECT Driver
808 IN POPEN_PACKET OpenPacket
,
809 IN PDEVICE_OBJECT DeviceObject
,
810 IN PUNICODE_STRING RemainingName
,
817 IN PDEVICE_OBJECT DeviceObject
,
818 IN BOOLEAN AllowRawMount
,
819 IN BOOLEAN DeviceIsLocked
,
820 IN BOOLEAN Alertable
,
826 IN PVOID SymbolicLink
831 IN PVOID SymbolicLink
,
838 IN PDEVICE_OBJECT DeviceObject
843 IopDereferenceVpbAndFree(
849 IoInitFileSystemImplementation(
855 IoInitVpbImplementation(
861 IopReferenceDeviceObject(
862 IN PDEVICE_OBJECT DeviceObject
867 IopDereferenceDeviceObject(
868 IN PDEVICE_OBJECT DeviceObject
,
869 IN BOOLEAN ForceUnload
874 IopGetRelatedTargetDevice(
875 IN PFILE_OBJECT FileObject
,
876 OUT PDEVICE_NODE
*DeviceNode
);
880 IoGetRelatedTargetDevice(
881 IN PFILE_OBJECT FileObject
,
882 OUT PDEVICE_OBJECT
*DeviceObject
888 IN PDEVICE_OBJECT DeviceObject
893 IopGetDeviceAttachmentBase(
894 IN PDEVICE_OBJECT DeviceObject
903 IN PFILE_OBJECT FileObject
,
904 IN PKEVENT EventObject
,
905 IN PVOID Buffer OPTIONAL
910 IopAbortInterruptedIrp(
911 IN PKEVENT EventObject
,
917 IopAllocateIrpMustSucceed(
923 IopInitializeReserveIrp(
924 IN PRESERVE_IRP_ALLOCATOR ReserveIrpAllocator
929 IopAllocateReserveIrp(
937 IoInitShutdownNotification(
949 IopShutdownBaseFileSystems(
950 IN PLIST_ENTRY ListHead
954 // Boot logging support
958 IN BOOLEAN StartBootLog
973 IN PUNICODE_STRING DriverName
,
978 IopSaveBootLogToFile(
983 // I/O Cancellation Routines
992 IoInitCancelHandling(
1003 IN PKNORMAL_ROUTINE
* NormalRoutine
,
1004 IN PVOID
* NormalContext
,
1005 IN PVOID
* SystemArgument1
,
1006 IN PVOID
* SystemArgument2
1010 // Error Logging Routines
1025 // Raw File System MiniDriver
1028 RawFsIsRawFileSystemDeviceObject(
1029 IN PDEVICE_OBJECT DeviceObject
1035 IN PDRIVER_OBJECT DriverObject
,
1036 IN PUNICODE_STRING RegistryPath
1040 // PnP Root MiniDriver
1045 IN PDRIVER_OBJECT DriverObject
,
1046 IN PUNICODE_STRING RegistryPath
1050 PnpRootCreateDevice(
1051 IN PUNICODE_STRING ServiceName
,
1052 IN OPTIONAL PDRIVER_OBJECT DriverObject
,
1053 OUT PDEVICE_OBJECT
*PhysicalDeviceObject
,
1054 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1058 PnpRootRegisterDevice(
1059 IN PDEVICE_OBJECT DeviceObject
);
1066 IopInitializeBootDrivers(
1072 IopInitializeSystemDrivers(
1084 _In_ HANDLE ServiceHandle
,
1085 _Out_ PDRIVER_OBJECT
*DriverObject
);
1089 _In_ HANDLE ServiceHandle
,
1090 _Out_ PUNICODE_STRING DriverName
,
1091 _Out_opt_ PUNICODE_STRING ServiceName
);
1094 IopInitializeDriverModule(
1095 _In_ PLDR_DATA_TABLE_ENTRY ModuleObject
,
1096 _In_ HANDLE ServiceHandle
,
1097 _Out_ PDRIVER_OBJECT
*DriverObject
,
1098 _Out_ NTSTATUS
*DriverEntryStatus
);
1102 IopAttachFilterDrivers(
1103 IN PDEVICE_NODE DeviceNode
,
1104 IN HANDLE EnumSubKey
,
1111 IopReinitializeDrivers(
1117 IopReinitializeBootDrivers(
1126 IopDeleteDevice(IN PVOID ObjectBody
);
1131 IN PVOID ParseObject
,
1132 IN PVOID ObjectType
,
1133 IN OUT PACCESS_STATE AccessState
,
1134 IN KPROCESSOR_MODE AccessMode
,
1135 IN ULONG Attributes
,
1136 IN OUT PUNICODE_STRING CompleteName
,
1137 IN OUT PUNICODE_STRING RemainingName
,
1138 IN OUT PVOID Context
,
1139 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1146 IN PVOID ParseObject
,
1147 IN PVOID ObjectType
,
1148 IN OUT PACCESS_STATE AccessState
,
1149 IN KPROCESSOR_MODE AccessMode
,
1150 IN ULONG Attributes
,
1151 IN OUT PUNICODE_STRING CompleteName
,
1152 IN OUT PUNICODE_STRING RemainingName
,
1153 IN OUT PVOID Context OPTIONAL
,
1154 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1166 IopGetSetSecurityObject(
1167 IN PVOID ObjectBody
,
1168 IN SECURITY_OPERATION_CODE OperationCode
,
1169 IN PSECURITY_INFORMATION SecurityInformation
,
1170 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1171 IN OUT PULONG BufferLength
,
1172 OUT PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
1173 IN POOL_TYPE PoolType
,
1174 IN OUT PGENERIC_MAPPING GenericMapping
1180 IN PVOID ObjectBody
,
1182 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1184 OUT PULONG ReturnLength
,
1185 IN KPROCESSOR_MODE PreviousMode
1190 IopQueryNameInternal(
1191 IN PVOID ObjectBody
,
1193 IN BOOLEAN QueryDosName
,
1194 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1196 OUT PULONG ReturnLength
,
1197 IN KPROCESSOR_MODE PreviousMode
1203 IN PEPROCESS Process OPTIONAL
,
1205 IN ACCESS_MASK GrantedAccess
,
1206 IN ULONG ProcessHandleCount
,
1207 IN ULONG SystemHandleCount
1212 IopAcquireFileObjectLock(
1213 _In_ PFILE_OBJECT FileObject
,
1214 _In_ KPROCESSOR_MODE AccessMode
,
1215 _In_ BOOLEAN Alertable
,
1216 _Out_ PBOOLEAN LockFailed
1221 IoGetFileObjectFilterContext(
1222 IN PFILE_OBJECT FileObject
1227 IoChangeFileObjectFilterContext(
1228 IN PFILE_OBJECT FileObject
,
1229 IN PVOID FilterContext
,
1235 IopDoNameTransmogrify(
1237 IN PFILE_OBJECT FileObject
,
1238 IN PREPARSE_DATA_BUFFER DataBuffer
1243 IoComputeDesiredAccessFileObject(
1244 IN PFILE_OBJECT FileObject
,
1245 IN PACCESS_MASK DesiredAccess
1250 IopGetFileInformation(
1251 IN PFILE_OBJECT FileObject
,
1253 IN FILE_INFORMATION_CLASS FileInfoClass
,
1255 OUT PULONG ReturnedLength
1260 IopVerifyDeviceObjectOnStack(
1261 IN PDEVICE_OBJECT BaseDeviceObject
,
1262 IN PDEVICE_OBJECT TopDeviceObjectHint
1266 // I/O Timer Routines
1270 IopInitTimerImplementation(
1276 IopRemoveTimerFromTimerList(
1281 // I/O Completion Routines
1285 IopDeleteIoCompletion(
1292 IN PVOID IoCompletion
,
1293 IN PVOID KeyContext
,
1294 IN PVOID ApcContext
,
1295 IN NTSTATUS IoStatus
,
1296 IN ULONG_PTR IoStatusInformation
,
1306 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1310 // Configuration Routines
1314 IopFetchConfigurationInformation(OUT PWSTR
* SymbolicLinkList
,
1316 IN ULONG ExpectedInterfaces
,
1317 IN PULONG Interfaces
1322 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName
,
1323 IN PUNICODE_STRING OsLoaderPathName
1330 PiQueueDeviceAction(
1331 _In_ PDEVICE_OBJECT DeviceObject
,
1332 _In_ DEVICE_ACTION Action
,
1333 _In_opt_ PKEVENT CompletionEvent
,
1334 _Out_opt_ NTSTATUS
*CompletionStatus
);
1337 PiPerformSyncDeviceAction(
1338 _In_ PDEVICE_OBJECT DeviceObject
,
1339 _In_ DEVICE_ACTION Action
);
1342 // PnP notifications
1345 PiNotifyDeviceInterfaceChange(
1347 _In_ LPCGUID InterfaceClassGuid
,
1348 _In_ PUNICODE_STRING SymbolicLinkName
);
1351 PiNotifyHardwareProfileChange(
1352 _In_ LPCGUID Event
);
1355 PiNotifyTargetDeviceChange(
1357 _In_ PDEVICE_OBJECT DeviceObject
,
1358 _In_opt_ PTARGET_DEVICE_CUSTOM_NOTIFICATION CustomNotification
);
1365 _In_ PDEVICE_NODE DeviceNode
);
1369 _In_ PDEVICE_NODE DeviceNode
);
1372 PiIrpQueryStopDevice(
1373 _In_ PDEVICE_NODE DeviceNode
);
1376 PiIrpCancelStopDevice(
1377 _In_ PDEVICE_NODE DeviceNode
);
1380 PiIrpQueryDeviceRelations(
1381 _In_ PDEVICE_NODE DeviceNode
,
1382 _In_ DEVICE_RELATION_TYPE Type
);
1385 PiIrpQueryPnPDeviceState(
1386 _In_ PDEVICE_NODE DeviceNode
,
1387 _Out_ PPNP_DEVICE_STATE DeviceState
);
1392 extern POBJECT_TYPE IoCompletionType
;
1393 extern PDEVICE_NODE IopRootDeviceNode
;
1394 extern KSPIN_LOCK IopDeviceTreeLock
;
1395 extern ULONG IopTraceLevel
;
1396 extern GENERAL_LOOKASIDE IopMdlLookasideList
;
1397 extern GENERIC_MAPPING IopCompletionMapping
;
1398 extern GENERIC_MAPPING IopFileMapping
;
1399 extern POBJECT_TYPE _IoFileObjectType
;
1400 extern HAL_DISPATCH _HalDispatchTable
;
1401 extern LIST_ENTRY IopErrorLogListHead
;
1402 extern ULONG IopNumTriageDumpDataBlocks
;
1403 extern PVOID IopTriageDumpDataBlocks
[64];
1404 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList
;
1405 extern PDRIVER_OBJECT IopRootDriverObject
;
1406 extern KSPIN_LOCK IopDeviceActionLock
;
1407 extern LIST_ENTRY IopDeviceActionRequestList
;
1408 extern RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator
;
1409 extern BOOLEAN IoRemoteBootClient
;
1412 // Inlined Functions