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)
11 // Define this if you want debugging support
13 #define _IO_DEBUG_ 0x00
16 // These define the Debug Masks Supported
18 #define IO_IRP_DEBUG 0x01
19 #define IO_FILE_DEBUG 0x02
20 #define IO_API_DEBUG 0x04
21 #define IO_CTL_DEBUG 0x08
24 // Debug/Tracing support
27 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
28 #define IOTRACE(x, ...) \
30 DbgPrintEx("%s [%.16s] - ", \
32 PsGetCurrentProcess()->ImageFileName); \
33 DbgPrintEx(__VA_ARGS__); \
36 #define IOTRACE(x, ...) \
37 if (x & IopTraceLevel) \
39 DbgPrint("%s [%.16s] - ", \
41 PsGetCurrentProcess()->ImageFileName); \
42 DbgPrint(__VA_ARGS__); \
46 #define IOTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
50 // Registry path to the enumeration root key
52 #define ENUM_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum"
55 // Returns the type of METHOD_ used in this IOCTL
57 #define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
60 // Bugcheck codes for RAM disk booting
63 // No LoaderXIPRom descriptor was found in the loader memory list
65 #define RD_NO_XIPROM_DESCRIPTOR 1
67 // Unable to open the RAM disk driver (ramdisk.sys or \Device\Ramdisk)
69 #define RD_NO_RAMDISK_DRIVER 2
71 // FSCTL_CREATE_RAM_DISK failed
73 #define RD_FSCTL_FAILED 3
75 // Unable to create GUID string from binary GUID
77 #define RD_GUID_CONVERT_FAILED 4
79 // Unable to create symbolic link pointing to the RAM disk device
81 #define RD_SYMLINK_CREATE_FAILED 5
84 // Max traversal of reparse points for a single open in IoParseDevice
86 #define IOP_MAX_REPARSE_TRAVERSAL 0x20
89 // We can call the Ob Inlined API, it's the same thing
91 #define IopAllocateMdlFromLookaside \
92 ObpAllocateObjectCreateInfoBuffer
93 #define IopFreeMdlFromLookaside \
94 ObpFreeCapturedAttributes
97 // Determines if the IRP is Synchronous
99 #define IsIrpSynchronous(Irp, FileObject) \
100 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
103 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
106 // Returns the internal Device Object Extension
108 #define IoGetDevObjExtension(DeviceObject) \
109 ((PEXTENDED_DEVOBJ_EXTENSION) \
110 (DeviceObject->DeviceObjectExtension)) \
113 // Returns the internal Driver Object Extension
115 #define IoGetDrvObjExtension(DriverObject) \
116 ((PEXTENDED_DRIVER_EXTENSION) \
117 (DriverObject->DriverExtension)) \
121 * IopDeviceNodeSetFlag(
122 * PDEVICE_NODE DeviceNode,
125 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
126 ((DeviceNode)->Flags |= (Flag))
130 * IopDeviceNodeClearFlag(
131 * PDEVICE_NODE DeviceNode,
134 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
135 ((DeviceNode)->Flags &= ~(Flag))
139 * IopDeviceNodeHasFlag(
140 * PDEVICE_NODE DeviceNode,
143 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
144 (((DeviceNode)->Flags & (Flag)) > 0)
148 * IopDeviceNodeSetUserFlag(
149 * PDEVICE_NODE DeviceNode,
152 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
153 ((DeviceNode)->UserFlags |= (UserFlag))
157 * IopDeviceNodeClearUserFlag(
158 * PDEVICE_NODE DeviceNode,
161 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
162 ((DeviceNode)->UserFlags &= ~(UserFlag))
166 * IopDeviceNodeHasUserFlag(
167 * PDEVICE_NODE DeviceNode,
170 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
171 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
175 * IopDeviceNodeSetProblem(
176 * PDEVICE_NODE DeviceNode,
179 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
180 ((DeviceNode)->Problem |= (Problem))
184 * IopDeviceNodeClearProblem(
185 * PDEVICE_NODE DeviceNode,
188 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
189 ((DeviceNode)->Problem &= ~(Problem))
193 * IopDeviceNodeHasProblem(
194 * PDEVICE_NODE DeviceNode,
197 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
198 (((DeviceNode)->Problem & (Problem)) > 0)
202 * IopInitDeviceTreeTraverseContext(
203 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
204 * PDEVICE_NODE DeviceNode,
205 * DEVICETREE_TRAVERSE_ROUTINE Action,
208 #define IopInitDeviceTreeTraverseContext( \
209 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
211 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
213 (_DeviceTreeTraverseContext)->Action = (_Action); \
214 (_DeviceTreeTraverseContext)->Context = (_Context); }
218 * IopIsValidPhysicalDeviceObject(
219 * IN PDEVICE_OBJECT PhysicalDeviceObject);
221 #define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \
222 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \
223 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \
224 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED))
227 // Device List Operations
229 typedef enum _IOP_DEVICE_LIST_OPERATION
233 } IOP_DEVICE_LIST_OPERATION
, *PIOP_DEVICE_LIST_OPERATION
;
236 // Transfer statistics
238 typedef enum _IOP_TRANSFER_TYPE
243 } IOP_TRANSFER_TYPE
, *PIOP_TRANSFER_TYPE
;
246 // Packet Types when piggybacking on the IRP Overlay
248 typedef enum _COMPLETION_PACKET_TYPE
250 IopCompletionPacketIrp
,
251 IopCompletionPacketMini
,
252 IopCompletionPacketQuota
253 } COMPLETION_PACKET_TYPE
, *PCOMPLETION_PACKET_TYPE
;
256 // Special version of the IRP Overlay used to optimize I/O completion
257 // by not using up a separate structure.
259 typedef struct _IOP_MINI_COMPLETION_PACKET
263 LIST_ENTRY ListEntry
;
266 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
273 ULONG_PTR IoStatusInformation
;
274 } IOP_MINI_COMPLETION_PACKET
, *PIOP_MINI_COMPLETION_PACKET
;
277 // I/O Completion Context for IoSetIoCompletionRoutineEx
279 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
281 PDEVICE_OBJECT DeviceObject
;
283 PIO_COMPLETION_ROUTINE CompletionRoutine
;
284 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT
, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT
;
287 // I/O Wrapper around the Executive Work Item
289 typedef struct _IO_WORKITEM
291 WORK_QUEUE_ITEM Item
;
292 PDEVICE_OBJECT DeviceObject
;
293 PIO_WORKITEM_ROUTINE WorkerRoutine
;
298 // I/O Wrapper around the Kernel Interrupt
300 typedef struct _IO_INTERRUPT
302 KINTERRUPT FirstInterrupt
;
303 PKINTERRUPT Interrupt
[MAXIMUM_PROCESSORS
];
305 } IO_INTERRUPT
, *PIO_INTERRUPT
;
308 // I/O Error Log Packet Header
310 typedef struct _ERROR_LOG_ENTRY
314 LIST_ENTRY ListEntry
;
315 PDEVICE_OBJECT DeviceObject
;
316 PDRIVER_OBJECT DriverObject
;
317 LARGE_INTEGER TimeStamp
;
318 } ERROR_LOG_ENTRY
, *PERROR_LOG_ENTRY
;
321 // Event Log LPC Message
323 typedef struct _ELF_API_MSG
327 IO_ERROR_LOG_MESSAGE IoErrorMessage
;
328 } ELF_API_MSG
, *PELF_API_MSG
;
331 // To simplify matters, the kernel is made to support both the checked and free
332 // version of the I/O Remove Lock in the same binary. This structure includes
333 // both, since the DDK has the structure with a compile-time #ifdef.
335 typedef struct _EXTENDED_IO_REMOVE_LOCK
337 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
338 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
339 } EXTENDED_IO_REMOVE_LOCK
, *PEXTENDED_IO_REMOVE_LOCK
;
342 // Dummy File Object used inside the Open Packet so that OB knows how to
343 // deal with the Object Pointer even though it's not a real file.
345 typedef struct _DUMMY_FILE_OBJECT
347 OBJECT_HEADER ObjectHeader
;
348 CHAR FileObjectBody
[sizeof(FILE_OBJECT
)];
349 } DUMMY_FILE_OBJECT
, *PDUMMY_FILE_OBJECT
;
352 // Open packet used as a context for Device/File parsing so that the parse
353 // routine can know what operation is being requested.
355 typedef struct _OPEN_PACKET
359 PFILE_OBJECT FileObject
;
360 NTSTATUS FinalStatus
;
361 ULONG_PTR Information
;
363 PFILE_OBJECT RelatedFileObject
;
364 OBJECT_ATTRIBUTES OriginalAttributes
;
365 LARGE_INTEGER AllocationSize
;
367 USHORT FileAttributes
;
373 PFILE_BASIC_INFORMATION BasicInformation
;
374 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
;
375 CREATE_FILE_TYPE CreateFileType
;
376 PVOID ExtraCreateParameters
;
380 BOOLEAN FullAttributes
;
381 PDUMMY_FILE_OBJECT LocalFileObject
;
382 BOOLEAN TraversedMountPoint
;
384 PDEVICE_OBJECT TopDeviceObjectHint
;
385 } OPEN_PACKET
, *POPEN_PACKET
;
388 // Parameters packet for Load/Unload work item's context
390 typedef struct _LOAD_UNLOAD_PARAMS
393 PCUNICODE_STRING RegistryPath
;
394 WORK_QUEUE_ITEM WorkItem
;
396 PDRIVER_OBJECT DriverObject
;
397 } LOAD_UNLOAD_PARAMS
, *PLOAD_UNLOAD_PARAMS
;
400 // Boot Driver List Entry
402 typedef struct _DRIVER_INFORMATION
405 PDRIVER_OBJECT DriverObject
;
406 PBOOT_DRIVER_LIST_ENTRY DataTableEntry
;
407 HANDLE ServiceHandle
;
412 } DRIVER_INFORMATION
, *PDRIVER_INFORMATION
;
417 typedef struct _BOOT_DRIVER_NODE
419 BOOT_DRIVER_LIST_ENTRY ListEntry
;
420 UNICODE_STRING Group
;
424 } BOOT_DRIVER_NODE
, *PBOOT_DRIVER_NODE
;
427 // List of Bus Type GUIDs
429 typedef struct _IO_BUS_TYPE_GUID_LIST
434 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
435 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
438 // Shutdown entry for registed devices
440 typedef struct _SHUTDOWN_ENTRY
442 LIST_ENTRY ShutdownList
;
443 PDEVICE_OBJECT DeviceObject
;
444 } SHUTDOWN_ENTRY
, *PSHUTDOWN_ENTRY
;
447 // F/S Notification entry for registered File Systems
449 typedef struct _FS_CHANGE_NOTIFY_ENTRY
451 LIST_ENTRY FsChangeNotifyList
;
452 PDRIVER_OBJECT DriverObject
;
453 PDRIVER_FS_NOTIFICATION FSDNotificationProc
;
454 } FS_CHANGE_NOTIFY_ENTRY
, *PFS_CHANGE_NOTIFY_ENTRY
;
457 // Driver (Boot) Re-Initialization Entry
459 typedef struct _DRIVER_REINIT_ITEM
461 LIST_ENTRY ItemEntry
;
462 PDRIVER_OBJECT DriverObject
;
463 PDRIVER_REINITIALIZE ReinitRoutine
;
465 } DRIVER_REINIT_ITEM
, *PDRIVER_REINIT_ITEM
;
468 // Called on every visit of a node during a preorder-traversal of the device
470 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
471 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
472 // Any other returned status code will be returned to the caller. If a status
473 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
474 // the traversal is stopped immediately and the status code is returned to
479 (*DEVICETREE_TRAVERSE_ROUTINE
)(
480 IN PDEVICE_NODE DeviceNode
,
485 // Context information for traversing the device tree
487 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
490 // Current device node during a traversal
492 PDEVICE_NODE DeviceNode
;
495 // Initial device node where we start the traversal
497 PDEVICE_NODE FirstDeviceNode
;
500 // Action routine to be called for every device node
502 DEVICETREE_TRAVERSE_ROUTINE Action
;
505 // Context passed to the action routine
508 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
515 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList
);
519 IopAssignDeviceResources(
520 IN PDEVICE_NODE DeviceNode
525 IopFixupResourceListWithRequirements(
526 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList
,
527 OUT PCM_RESOURCE_LIST
*ResourceList
532 IopDetectResourceConflict(
533 IN PCM_RESOURCE_LIST ResourceList
,
535 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
543 PipCallDriverAddDevice(
544 IN PDEVICE_NODE DeviceNode
,
545 IN BOOLEAN LoadDriver
,
546 IN PDRIVER_OBJECT DriverObject
551 IopInitializePlugPlayServices(
567 IopInitDriverImplementation(
572 IopInitPnpNotificationImplementation(
577 IopNotifyPlugPlayNotification(
578 IN PDEVICE_OBJECT DeviceObject
,
579 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
581 IN PVOID EventCategoryData1
,
582 IN PVOID EventCategoryData2
586 IopGetSystemPowerDeviceObject(
587 IN PDEVICE_OBJECT
*DeviceObject
592 PipAllocateDeviceNode(
593 IN PDEVICE_OBJECT PhysicalDeviceObject
598 IN PDEVICE_NODE ParentNode
,
599 IN PDEVICE_OBJECT PhysicalDeviceObject
,
600 IN PUNICODE_STRING ServiceName
,
601 OUT PDEVICE_NODE
*DeviceNode
606 IN PDEVICE_NODE DeviceNode
611 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode
,
612 PDEVICE_CAPABILITIES DeviceCaps
);
617 IN PDEVICE_OBJECT DeviceObject
,
618 IN PIO_STACK_LOCATION IoStackLocation
,
619 OUT PVOID
*Information
625 IN PDEVICE_OBJECT DeviceObject
,
626 IN PIO_STATUS_BLOCK IoStatusBlock
,
627 IN UCHAR MinorFunction
,
628 IN PIO_STACK_LOCATION Stack
634 IN PDEVICE_OBJECT DeviceObject
638 IopActionConfigureChildServices(
639 IN PDEVICE_NODE DeviceNode
,
644 IopActionInitChildServices(
645 IN PDEVICE_NODE DeviceNode
,
651 IN PDEVICE_OBJECT DeviceObject
665 IopInitPlugPlayEvents(VOID
);
668 IopQueueTargetDeviceEvent(
670 PUNICODE_STRING DeviceIds
674 IopInitializePnpServices(
675 IN PDEVICE_NODE DeviceNode
);
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
);
720 PiInitCacheGroupInformation(
726 PpInitGetGroupOrderIndex(
727 IN HANDLE ServiceHandle
732 PipGetDriverTagPriority(
733 IN HANDLE ServiceHandle
738 PnpRegMultiSzToUnicodeStrings(
739 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation
,
740 OUT PUNICODE_STRING
*UnicodeStringList
,
741 OUT PULONG UnicodeStringCount
748 IN ULONG RegSzLength
,
749 OUT PUSHORT StringLength OPTIONAL
753 // Initialization Routines
758 IN PLOADER_PARAMETER_BLOCK LoaderBlock
763 IopReassignSystemRoot(
764 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
765 OUT PANSI_STRING NtBootPath
771 IN PLOADER_PARAMETER_BLOCK LoaderBlock
776 IopVerifyDiskSignature(
777 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout
,
778 IN PARC_DISK_SIGNATURE ArcDiskSignature
,
783 // Device/Volume Routines
787 IopReadyDeviceObjects(
788 IN PDRIVER_OBJECT Driver
794 IN PDEVICE_NODE DeviceNode
,
795 IN PDRIVER_OBJECT DriverObject
800 IN PDEVICE_NODE DeviceNode
805 IN PDEVICE_NODE DeviceNode
810 IN PDEVICE_NODE DeviceNode
816 IN POPEN_PACKET OpenPacket
,
817 IN PDEVICE_OBJECT DeviceObject
,
818 IN PUNICODE_STRING RemainingName
,
825 IN PDEVICE_OBJECT DeviceObject
,
826 IN BOOLEAN AllowRawMount
,
827 IN BOOLEAN DeviceIsLocked
,
828 IN BOOLEAN Alertable
,
834 IN PVOID SymbolicLink
839 IN PVOID SymbolicLink
,
846 IN PDEVICE_OBJECT DeviceObject
851 IopDereferenceVpbAndFree(
857 IoInitFileSystemImplementation(
863 IoInitVpbImplementation(
869 IopReferenceDeviceObject(
870 IN PDEVICE_OBJECT DeviceObject
875 IopDereferenceDeviceObject(
876 IN PDEVICE_OBJECT DeviceObject
,
877 IN BOOLEAN ForceUnload
882 IoGetRelatedTargetDevice(
883 IN PFILE_OBJECT FileObject
,
884 OUT PDEVICE_OBJECT
*DeviceObject
890 IN PDEVICE_OBJECT DeviceObject
899 IN PFILE_OBJECT FileObject
,
900 IN PKEVENT EventObject
,
901 IN PVOID Buffer OPTIONAL
906 IopAbortInterruptedIrp(
907 IN PKEVENT EventObject
,
913 IopAllocateIrpMustSucceed(
921 IoInitShutdownNotification(
933 IopShutdownBaseFileSystems(
934 IN PLIST_ENTRY ListHead
938 // Boot logging support
942 IN BOOLEAN StartBootLog
957 IN PUNICODE_STRING DriverName
,
962 IopSaveBootLogToFile(
967 // I/O Cancellation Routines
976 IoInitCancelHandling(
987 IN PKNORMAL_ROUTINE
* NormalRoutine
,
988 IN PVOID
* NormalContext
,
989 IN PVOID
* SystemArgument1
,
990 IN PVOID
* SystemArgument2
994 // Error Logging Routines
1009 // Raw File System MiniDriver
1012 RawFsIsRawFileSystemDeviceObject(
1013 IN PDEVICE_OBJECT DeviceObject
1019 IN PDRIVER_OBJECT DriverObject
,
1020 IN PUNICODE_STRING RegistryPath
1024 // PnP Root MiniDriver
1029 IN PDRIVER_OBJECT DriverObject
,
1030 IN PUNICODE_STRING RegistryPath
1034 PnpRootCreateDevice(
1035 IN PUNICODE_STRING ServiceName
,
1036 IN OPTIONAL PDRIVER_OBJECT DriverObject
,
1037 OUT PDEVICE_OBJECT
*PhysicalDeviceObject
,
1038 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1042 PnpRootRegisterDevice(
1043 IN PDEVICE_OBJECT DeviceObject
);
1050 IopInitializeBootDrivers(
1056 IopInitializeSystemDrivers(
1062 IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL
,
1063 IN PDRIVER_INITIALIZE InitializationFunction
,
1064 IN PUNICODE_STRING RegistryPath
,
1065 IN PCUNICODE_STRING ServiceName
,
1066 PLDR_DATA_TABLE_ENTRY ModuleObject
,
1067 OUT PDRIVER_OBJECT
*pDriverObject
);
1078 OUT PDRIVER_OBJECT
*DriverObject
,
1079 IN PUNICODE_STRING ServiceName
,
1080 IN BOOLEAN FileSystem
1085 IopLoadServiceModule(
1086 IN PUNICODE_STRING ServiceName
,
1087 OUT PLDR_DATA_TABLE_ENTRY
*ModuleObject
1092 IopLoadUnloadDriver(
1093 _In_opt_ PCUNICODE_STRING RegistryPath
,
1094 _Inout_ PDRIVER_OBJECT
*DriverObject
1099 IopInitializeDriverModule(
1100 IN PDEVICE_NODE DeviceNode
,
1101 IN PLDR_DATA_TABLE_ENTRY ModuleObject
,
1102 IN PUNICODE_STRING ServiceName
,
1103 IN BOOLEAN FileSystemDriver
,
1104 OUT PDRIVER_OBJECT
*DriverObject
1109 IopAttachFilterDrivers(
1110 IN PDEVICE_NODE DeviceNode
,
1116 IopReinitializeDrivers(
1122 IopReinitializeBootDrivers(
1131 IopDeleteDevice(IN PVOID ObjectBody
);
1136 IN PVOID ParseObject
,
1137 IN PVOID ObjectType
,
1138 IN OUT PACCESS_STATE AccessState
,
1139 IN KPROCESSOR_MODE AccessMode
,
1140 IN ULONG Attributes
,
1141 IN OUT PUNICODE_STRING CompleteName
,
1142 IN OUT PUNICODE_STRING RemainingName
,
1143 IN OUT PVOID Context
,
1144 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1151 IN PVOID ParseObject
,
1152 IN PVOID ObjectType
,
1153 IN OUT PACCESS_STATE AccessState
,
1154 IN KPROCESSOR_MODE AccessMode
,
1155 IN ULONG Attributes
,
1156 IN OUT PUNICODE_STRING CompleteName
,
1157 IN OUT PUNICODE_STRING RemainingName
,
1158 IN OUT PVOID Context OPTIONAL
,
1159 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
1171 IopGetSetSecurityObject(
1172 IN PVOID ObjectBody
,
1173 IN SECURITY_OPERATION_CODE OperationCode
,
1174 IN PSECURITY_INFORMATION SecurityInformation
,
1175 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1176 IN OUT PULONG BufferLength
,
1177 OUT PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
1178 IN POOL_TYPE PoolType
,
1179 IN OUT PGENERIC_MAPPING GenericMapping
1185 IN PVOID ObjectBody
,
1187 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
1189 OUT PULONG ReturnLength
,
1190 IN KPROCESSOR_MODE PreviousMode
1196 IN PEPROCESS Process OPTIONAL
,
1198 IN ACCESS_MASK GrantedAccess
,
1199 IN ULONG ProcessHandleCount
,
1200 IN ULONG SystemHandleCount
1205 IoGetFileObjectFilterContext(
1206 IN PFILE_OBJECT FileObject
1211 IoChangeFileObjectFilterContext(
1212 IN PFILE_OBJECT FileObject
,
1213 IN PVOID FilterContext
,
1219 IopDoNameTransmogrify(
1221 IN PFILE_OBJECT FileObject
,
1222 IN PREPARSE_DATA_BUFFER DataBuffer
1226 // I/O Timer Routines
1230 IopInitTimerImplementation(
1236 IopRemoveTimerFromTimerList(
1241 // I/O Completion Routines
1245 IopDeleteIoCompletion(
1252 IN PVOID IoCompletion
,
1253 IN PVOID KeyContext
,
1254 IN PVOID ApcContext
,
1255 IN NTSTATUS IoStatus
,
1256 IN ULONG_PTR IoStatusInformation
,
1266 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1270 // Configuration Routines
1274 IopFetchConfigurationInformation(OUT PWSTR
* SymbolicLinkList
,
1276 IN ULONG ExpectedInterfaces
,
1277 IN PULONG Interfaces
1282 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName
,
1283 IN PUNICODE_STRING OsLoaderPathName
1289 extern POBJECT_TYPE IoCompletionType
;
1290 extern PDEVICE_NODE IopRootDeviceNode
;
1291 extern KSPIN_LOCK IopDeviceTreeLock
;
1292 extern ULONG IopTraceLevel
;
1293 extern GENERAL_LOOKASIDE IopMdlLookasideList
;
1294 extern GENERIC_MAPPING IopCompletionMapping
;
1295 extern GENERIC_MAPPING IopFileMapping
;
1296 extern POBJECT_TYPE _IoFileObjectType
;
1297 extern HAL_DISPATCH _HalDispatchTable
;
1298 extern LIST_ENTRY IopErrorLogListHead
;
1299 extern ULONG IopNumTriageDumpDataBlocks
;
1300 extern PVOID IopTriageDumpDataBlocks
[64];
1301 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList
;
1302 extern PDRIVER_OBJECT IopRootDriverObject
;
1303 extern KSPIN_LOCK IopDeviceRelationsSpinLock
;
1304 extern LIST_ENTRY IopDeviceRelationsRequestList
;
1307 // Inlined Functions