2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/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_ 0x01
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, ...) DPRINT(__VA_ARGS__);
50 // Returns the type of METHOD_ used in this IOCTL
52 #define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
55 // Packet Types when piggybacking on the IRP Overlay
57 #define IrpCompletionPacket 0x1
58 #define IrpMiniCompletionPacket 0x2
61 // We can call the Ob Inlined API, it's the same thing
63 #define IopAllocateMdlFromLookaside \
64 ObpAllocateCapturedAttributes
65 #define IopFreeMdlFromLookaside \
66 ObpFreeCapturedAttributes
69 // Returns the size of a CM_RESOURCE_LIST
71 #define CM_RESOURCE_LIST_SIZE(ResList) \
72 (ResList->Count == 1) ? \
75 List[0].PartialResourceList. \
76 PartialDescriptors[(ResList)-> \
78 PartialResourceList. \
81 FIELD_OFFSET(CM_RESOURCE_LIST, List)
84 // Determines if the IRP is Synchronous
86 #define IsIrpSynchronous(Irp, FileObject) \
87 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
90 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
93 // Returns the internal Device Object Extension
95 #define IoGetDevObjExtension(DeviceObject) \
96 ((PEXTENDED_DEVOBJ_EXTENSION) \
97 (DeviceObject->DeviceObjectExtension)) \
100 // Returns the internal Driver Object Extension
102 #define IoGetDrvObjExtension(DriverObject) \
103 ((PEXTENDED_DRIVER_EXTENSION) \
104 (DriverObject->DriverExtension)) \
108 * IopDeviceNodeSetFlag(
109 * PDEVICE_NODE DeviceNode,
112 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
113 ((DeviceNode)->Flags |= (Flag))
117 * IopDeviceNodeClearFlag(
118 * PDEVICE_NODE DeviceNode,
121 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
122 ((DeviceNode)->Flags &= ~(Flag))
126 * IopDeviceNodeHasFlag(
127 * PDEVICE_NODE DeviceNode,
130 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
131 (((DeviceNode)->Flags & (Flag)) > 0)
135 * IopDeviceNodeSetUserFlag(
136 * PDEVICE_NODE DeviceNode,
139 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
140 ((DeviceNode)->UserFlags |= (UserFlag))
144 * IopDeviceNodeClearUserFlag(
145 * PDEVICE_NODE DeviceNode,
148 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
149 ((DeviceNode)->UserFlags &= ~(UserFlag))
153 * IopDeviceNodeHasUserFlag(
154 * PDEVICE_NODE DeviceNode,
157 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
158 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
162 * IopDeviceNodeSetProblem(
163 * PDEVICE_NODE DeviceNode,
166 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
167 ((DeviceNode)->Problem |= (Problem))
171 * IopDeviceNodeClearProblem(
172 * PDEVICE_NODE DeviceNode,
175 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
176 ((DeviceNode)->Problem &= ~(Problem))
180 * IopDeviceNodeHasProblem(
181 * PDEVICE_NODE DeviceNode,
184 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
185 (((DeviceNode)->Problem & (Problem)) > 0)
189 * IopInitDeviceTreeTraverseContext(
190 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
191 * PDEVICE_NODE DeviceNode,
192 * DEVICETREE_TRAVERSE_ROUTINE Action,
195 #define IopInitDeviceTreeTraverseContext( \
196 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
198 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
200 (_DeviceTreeTraverseContext)->Action = (_Action); \
201 (_DeviceTreeTraverseContext)->Context = (_Context); }
204 // Device List Operations
206 typedef enum _IOP_DEVICE_LIST_OPERATION
210 } IOP_DEVICE_LIST_OPERATION
, *PIOP_DEVICE_LIST_OPERATION
;
213 // Transfer statistics
215 typedef enum _IOP_TRANSFER_TYPE
220 } IOP_TRANSFER_TYPE
, *PIOP_TRANSFER_TYPE
;
223 // Special version of the IRP Overlay used to optimize I/O completion
224 // by not using up a separate structure.
226 typedef struct _IO_COMPLETION_PACKET
230 LIST_ENTRY ListEntry
;
233 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
239 IO_STATUS_BLOCK IoStatus
;
240 } IO_COMPLETION_PACKET
, *PIO_COMPLETION_PACKET
;
243 // I/O Completion Context for IoSetIoCompletionRoutineEx
245 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
247 PDEVICE_OBJECT DeviceObject
;
249 PIO_COMPLETION_ROUTINE CompletionRoutine
;
250 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT
, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT
;
253 // I/O Wrapper around the Executive Work Item
255 typedef struct _IO_WORKITEM
257 WORK_QUEUE_ITEM Item
;
258 PDEVICE_OBJECT DeviceObject
;
259 PIO_WORKITEM_ROUTINE WorkerRoutine
;
261 } IO_WORKITEM
, *PIO_WORKITEM
;
264 // I/O Wrapper around the Kernel Interrupt
266 typedef struct _IO_INTERRUPT
268 KINTERRUPT FirstInterrupt
;
269 PKINTERRUPT Interrupt
[MAXIMUM_PROCESSORS
];
271 } IO_INTERRUPT
, *PIO_INTERRUPT
;
274 // I/O Error Log Packet Header
276 typedef struct _ERROR_LOG_ENTRY
280 LIST_ENTRY ListEntry
;
281 PDEVICE_OBJECT DeviceObject
;
282 PDRIVER_OBJECT DriverObject
;
283 LARGE_INTEGER TimeStamp
;
284 } ERROR_LOG_ENTRY
, *PERROR_LOG_ENTRY
;
287 // Event Log LPC Message
289 typedef struct _ELF_API_MSG
293 IO_ERROR_LOG_MESSAGE IoErrorMessage
;
294 } ELF_API_MSG
, *PELF_API_MSG
;
297 // To simplify matters, the kernel is made to support both the checked and free
298 // version of the I/O Remove Lock in the same binary. This structure includes
299 // both, since the DDK has the structure with a compile-time #ifdef.
301 typedef struct _EXTENDED_IO_REMOVE_LOCK
303 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
304 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
305 } EXTENDED_IO_REMOVE_LOCK
, *PEXTENDED_IO_REMOVE_LOCK
;
308 // Dummy File Object used inside the Open Packet so that OB knows how to
309 // deal with the Object Pointer even though it's not a real file.
311 typedef struct _DUMMY_FILE_OBJECT
313 OBJECT_HEADER ObjectHeader
;
314 CHAR FileObjectBody
[sizeof(FILE_OBJECT
)];
315 } DUMMY_FILE_OBJECT
, *PDUMMY_FILE_OBJECT
;
318 // Open packet used as a context for Device/File parsing so that the parse
319 // routine can know what operation is being requested.
321 typedef struct _OPEN_PACKET
325 PFILE_OBJECT FileObject
;
326 NTSTATUS FinalStatus
;
327 ULONG_PTR Information
;
329 PFILE_OBJECT RelatedFileObject
;
330 OBJECT_ATTRIBUTES OriginalAttributes
;
331 LARGE_INTEGER AllocationSize
;
333 USHORT FileAttributes
;
339 PFILE_BASIC_INFORMATION BasicInformation
;
340 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
;
341 CREATE_FILE_TYPE CreateFileType
;
342 PVOID MailslotOrPipeParameters
;
346 BOOLEAN FullAttributes
;
347 PDUMMY_FILE_OBJECT DummyFileObject
;
349 //PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update
350 } OPEN_PACKET
, *POPEN_PACKET
;
353 // List of Bus Type GUIDs
355 typedef struct _IO_BUS_TYPE_GUID_LIST
360 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
361 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
364 // Shutdown entry for registed devices
366 typedef struct _SHUTDOWN_ENTRY
368 LIST_ENTRY ShutdownList
;
369 PDEVICE_OBJECT DeviceObject
;
370 } SHUTDOWN_ENTRY
, *PSHUTDOWN_ENTRY
;
373 // F/S Notification entry for registered File Systems
375 typedef struct _FS_CHANGE_NOTIFY_ENTRY
377 LIST_ENTRY FsChangeNotifyList
;
378 PDRIVER_OBJECT DriverObject
;
379 PDRIVER_FS_NOTIFICATION FSDNotificationProc
;
380 } FS_CHANGE_NOTIFY_ENTRY
, *PFS_CHANGE_NOTIFY_ENTRY
;
383 // Driver (Boot) Re-Initialization Entry
385 typedef struct _DRIVER_REINIT_ITEM
387 LIST_ENTRY ItemEntry
;
388 PDRIVER_OBJECT DriverObject
;
389 PDRIVER_REINITIALIZE ReinitRoutine
;
391 } DRIVER_REINIT_ITEM
, *PDRIVER_REINIT_ITEM
;
394 // Called on every visit of a node during a preorder-traversal of the device
396 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
397 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
398 // Any other returned status code will be returned to the caller. If a status
399 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
400 // the traversal is stopped immediately and the status code is returned to
405 (*DEVICETREE_TRAVERSE_ROUTINE
)(
406 IN PDEVICE_NODE DeviceNode
,
411 // Context information for traversing the device tree
413 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
416 // Current device node during a traversal
418 PDEVICE_NODE DeviceNode
;
421 // Initial device node where we start the traversal
423 PDEVICE_NODE FirstDeviceNode
;
426 // Action routine to be called for every device node
428 DEVICETREE_TRAVERSE_ROUTINE Action
;
431 // Context passed to the action routine
434 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
456 IopInitDriverImplementation(
461 IopInitPnpNotificationImplementation(
466 IopNotifyPlugPlayNotification(
467 IN PDEVICE_OBJECT DeviceObject
,
468 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
470 IN PVOID EventCategoryData1
,
471 IN PVOID EventCategoryData2
475 IopGetSystemPowerDeviceObject(
476 IN PDEVICE_OBJECT
*DeviceObject
481 IN PDEVICE_NODE ParentNode
,
482 IN PDEVICE_OBJECT PhysicalDeviceObject
,
483 OUT PDEVICE_NODE
*DeviceNode
488 IN PDEVICE_NODE DeviceNode
493 IN PDEVICE_OBJECT DeviceObject
,
494 IN PIO_STATUS_BLOCK IoStatusBlock
,
495 IN ULONG MinorFunction
,
496 IN PIO_STACK_LOCATION Stack
502 IN PDEVICE_OBJECT DeviceObject
506 IopActionConfigureChildServices(
507 IN PDEVICE_NODE DeviceNode
,
512 IopActionInitChildServices(
513 IN PDEVICE_NODE DeviceNode
,
515 IN BOOLEAN BootDrivers
530 IopInitPlugPlayEvents(VOID
);
533 IopQueueTargetDeviceEvent(
535 PUNICODE_STRING DeviceIds
539 IopInitializePnpServices(
540 IN PDEVICE_NODE DeviceNode
,
541 IN BOOLEAN BootDrivers
)
545 // Initialization Routines
550 IN PLOADER_PARAMETER_BLOCK LoaderBlock
555 IopReassignSystemRoot(
556 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
557 OUT PANSI_STRING NtBootPath
563 IN PLOADER_PARAMETER_BLOCK LoaderBlock
567 // Device/Volume Routines
572 IN PDEVICE_NODE DeviceNode
,
573 IN PDRIVER_OBJECT DriverObject
578 IN PDEVICE_NODE DeviceNode
584 IN POPEN_PACKET OpenPacket
,
585 IN PDEVICE_OBJECT DeviceObject
,
586 IN PUNICODE_STRING RemainingName
,
593 IN PDEVICE_OBJECT DeviceObject
,
594 IN BOOLEAN AllowRawMount
,
595 IN BOOLEAN DeviceIsLocked
,
596 IN BOOLEAN Alertable
,
602 IN PVOID SymbolicLink
607 IN PVOID SymbolicLink
,
614 IN PDEVICE_OBJECT DeviceObject
625 IoInitFileSystemImplementation(
631 IoInitVpbImplementation(
637 IopReferenceDeviceObject(
638 IN PDEVICE_OBJECT DeviceObject
643 IopDereferenceDeviceObject(
644 IN PDEVICE_OBJECT DeviceObject
,
645 IN BOOLEAN ForceUnload
654 IN PFILE_OBJECT FileObject
,
655 IN PKEVENT EventObject
,
656 IN PVOID Buffer OPTIONAL
661 IopAbortInterruptedIrp(
662 IN PKEVENT EventObject
,
670 IoInitShutdownNotification(
676 IoShutdownRegisteredDevices(
682 IoShutdownRegisteredFileSystems(
687 // Boot logging support
691 IN BOOLEAN StartBootLog
706 IN PUNICODE_STRING DriverName
,
711 IopSaveBootLogToFile(
716 // I/O Cancellation Routines
725 IoInitCancelHandling(
736 IN PKNORMAL_ROUTINE
* NormalRoutine
,
737 IN PVOID
* NormalContext
,
738 IN PVOID
* SystemArgument1
,
739 IN PVOID
* SystemArgument2
743 // Error Logging Routines
758 // Raw File System MiniDriver
761 RawFsIsRawFileSystemDeviceObject(
762 IN PDEVICE_OBJECT DeviceObject
768 IN PDRIVER_OBJECT DriverObject
,
769 IN PUNICODE_STRING RegistryPath
773 // PnP Root MiniDriver
778 IN PDRIVER_OBJECT DriverObject
,
779 IN PUNICODE_STRING RegistryPath
784 IN OUT PDEVICE_OBJECT
*PhysicalDeviceObject
792 IopInitializeBootDrivers(
798 IopInitializeSystemDrivers(
810 IopCreateDriverObject(
811 OUT PDRIVER_OBJECT
*DriverObject
,
812 IN PUNICODE_STRING ServiceName
,
813 IN ULONG CreateAttributes
,
814 IN BOOLEAN FileSystemDriver
,
815 IN PVOID DriverImageStart
,
816 IN ULONG DriverImageSize
822 OUT PDRIVER_OBJECT
*DriverObject
,
823 IN PUNICODE_STRING ServiceName
,
824 IN BOOLEAN FileSystem
829 IopLoadServiceModule(
830 IN PUNICODE_STRING ServiceName
,
831 OUT PLDR_DATA_TABLE_ENTRY
*ModuleObject
836 IopInitializeDriverModule(
837 IN PDEVICE_NODE DeviceNode
,
838 IN PLDR_DATA_TABLE_ENTRY ModuleObject
,
839 IN PUNICODE_STRING ServiceName
,
840 IN BOOLEAN FileSystemDriver
,
841 OUT PDRIVER_OBJECT
*DriverObject
846 IopAttachFilterDrivers(
847 IN PDEVICE_NODE DeviceNode
,
853 IopReinitializeDrivers(
859 IopReinitializeBootDrivers(
869 IN PVOID ParseObject
,
871 IN OUT PACCESS_STATE AccessState
,
872 IN KPROCESSOR_MODE AccessMode
,
874 IN OUT PUNICODE_STRING CompleteName
,
875 IN OUT PUNICODE_STRING RemainingName
,
876 IN OUT PVOID Context OPTIONAL
,
877 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
884 IN PVOID ParseObject
,
886 IN OUT PACCESS_STATE AccessState
,
887 IN KPROCESSOR_MODE AccessMode
,
889 IN OUT PUNICODE_STRING CompleteName
,
890 IN OUT PUNICODE_STRING RemainingName
,
891 IN OUT PVOID Context OPTIONAL
,
892 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
906 IN SECURITY_OPERATION_CODE OperationCode
,
907 IN PSECURITY_INFORMATION SecurityInformation
,
908 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
909 IN OUT PULONG BufferLength
,
910 OUT PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
911 IN POOL_TYPE PoolType
,
912 IN OUT PGENERIC_MAPPING GenericMapping
920 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
922 OUT PULONG ReturnLength
,
923 IN KPROCESSOR_MODE PreviousMode
929 IN PEPROCESS Process OPTIONAL
,
931 IN ACCESS_MASK GrantedAccess
,
932 IN ULONG ProcessHandleCount
,
933 IN ULONG SystemHandleCount
937 // I/O Timer Routines
941 IopInitTimerImplementation(
947 IopRemoveTimerFromTimerList(
952 // I/O Completion Routines
956 IopDeleteIoCompletion(
963 extern POBJECT_TYPE IoCompletionType
;
964 extern PDEVICE_NODE IopRootDeviceNode
;
965 extern ULONG IopTraceLevel
;
966 extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList
;
967 extern GENERIC_MAPPING IopCompletionMapping
;
968 extern GENERIC_MAPPING IopFileMapping
;
969 extern POBJECT_TYPE _IoFileObjectType
;
970 extern HAL_DISPATCH _HalDispatchTable
;
971 extern LIST_ENTRY IopErrorLogListHead
;