1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_IO_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_IO_H
6 /* STRUCTURES ***************************************************************/
8 typedef struct _DISKENTRY
14 PDEVICE_OBJECT DeviceObject
;
15 } DISKENTRY
, *PDISKENTRY
;
17 #define PARTITION_TBL_SIZE 4
21 typedef struct _PARTITION
23 unsigned char BootFlags
; /* bootable? 0=no, 128=yes */
24 unsigned char StartingHead
; /* beginning head number */
25 unsigned char StartingSector
; /* beginning sector number */
26 unsigned char StartingCylinder
; /* 10 bit nmbr, with high 2 bits put in begsect */
27 unsigned char PartitionType
; /* Operating System type indicator code */
28 unsigned char EndingHead
; /* ending head number */
29 unsigned char EndingSector
; /* ending sector number */
30 unsigned char EndingCylinder
; /* also a 10 bit nmbr, with same high 2 bit trick */
31 unsigned int StartingBlock
; /* first sector relative to start of disk */
32 unsigned int SectorCount
; /* number of sectors in partition */
33 } PARTITION
, *PPARTITION
;
35 typedef struct _PARTITION_SECTOR
37 UCHAR BootCode
[440]; /* 0x000 */
38 ULONG Signature
; /* 0x1B8 */
39 UCHAR Reserved
[2]; /* 0x1BC */
40 PARTITION Partition
[PARTITION_TBL_SIZE
]; /* 0x1BE */
41 USHORT Magic
; /* 0x1FE */
42 } PARTITION_SECTOR
, *PPARTITION_SECTOR
;
46 #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
48 extern POBJECT_TYPE IoCompletionType
;
49 extern PDEVICE_NODE IopRootDeviceNode
;
51 /* This is like the IRP Overlay so we can optimize its insertion */
52 typedef struct _IO_COMPLETION_PACKET
59 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
65 IO_STATUS_BLOCK IoStatus
;
66 } IO_COMPLETION_PACKET
, *PIO_COMPLETION_PACKET
;
68 /* List of Bus Type GUIDs */
69 typedef struct _IO_BUS_TYPE_GUID_LIST
74 } IO_BUS_TYPE_GUID_LIST
, *PIO_BUS_TYPE_GUID_LIST
;
75 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList
;
78 #define IrpCompletionPacket 0x1
79 #define IrpMiniCompletionPacket 0x2
83 * IopDeviceNodeSetFlag(
84 * PDEVICE_NODE DeviceNode,
87 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
88 ((DeviceNode)->Flags |= (Flag))
92 * IopDeviceNodeClearFlag(
93 * PDEVICE_NODE DeviceNode,
96 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
97 ((DeviceNode)->Flags &= ~(Flag))
101 * IopDeviceNodeHasFlag(
102 * PDEVICE_NODE DeviceNode,
105 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
106 (((DeviceNode)->Flags & (Flag)) > 0)
110 * IopDeviceNodeSetUserFlag(
111 * PDEVICE_NODE DeviceNode,
114 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
115 ((DeviceNode)->UserFlags |= (UserFlag))
119 * IopDeviceNodeClearUserFlag(
120 * PDEVICE_NODE DeviceNode,
123 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag) \
124 ((DeviceNode)->UserFlags &= ~(UserFlag))
128 * IopDeviceNodeHasUserFlag(
129 * PDEVICE_NODE DeviceNode,
132 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
133 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
137 * IopDeviceNodeSetProblem(
138 * PDEVICE_NODE DeviceNode,
141 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
142 ((DeviceNode)->Problem |= (Problem))
146 * IopDeviceNodeClearProblem(
147 * PDEVICE_NODE DeviceNode,
150 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
151 ((DeviceNode)->Problem &= ~(Problem))
155 * IopDeviceNodeHasProblem(
156 * PDEVICE_NODE DeviceNode,
159 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
160 (((DeviceNode)->Problem & (Problem)) > 0)
164 Called on every visit of a node during a preorder-traversal of the device
166 If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
167 STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
168 Any other returned status code will be returned to the caller. If a status
169 code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
170 the traversal is stopped immediately and the status code is returned to
173 typedef NTSTATUS (*DEVICETREE_TRAVERSE_ROUTINE
)(
174 PDEVICE_NODE DeviceNode
,
178 /* Context information for traversing the device tree */
179 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
181 /* Current device node during a traversal */
182 PDEVICE_NODE DeviceNode
;
183 /* Initial device node where we start the traversal */
184 PDEVICE_NODE FirstDeviceNode
;
185 /* Action routine to be called for every device node */
186 DEVICETREE_TRAVERSE_ROUTINE Action
;
187 /* Context passed to the action routine */
189 } DEVICETREE_TRAVERSE_CONTEXT
, *PDEVICETREE_TRAVERSE_CONTEXT
;
193 * IopInitDeviceTreeTraverseContext(
194 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
195 * PDEVICE_NODE DeviceNode,
196 * DEVICETREE_TRAVERSE_ROUTINE Action,
199 #define IopInitDeviceTreeTraverseContext( \
200 _DeviceTreeTraverseContext, _DeviceNode, _Action, _Context) { \
201 (_DeviceTreeTraverseContext)->FirstDeviceNode = (_DeviceNode); \
202 (_DeviceTreeTraverseContext)->Action = (_Action); \
203 (_DeviceTreeTraverseContext)->Context = (_Context); }
212 IopInitDriverImplementation(VOID
);
215 IopInitPnpNotificationImplementation(VOID
);
218 IopNotifyPlugPlayNotification(
219 IN PDEVICE_OBJECT DeviceObject
,
220 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
222 IN PVOID EventCategoryData1
,
223 IN PVOID EventCategoryData2
227 IopGetSystemPowerDeviceObject(PDEVICE_OBJECT
*DeviceObject
);
231 PDEVICE_NODE ParentNode
,
232 PDEVICE_OBJECT PhysicalDeviceObject
,
233 PDEVICE_NODE
*DeviceNode
237 IopFreeDeviceNode(PDEVICE_NODE DeviceNode
);
240 IoInitCancelHandling(VOID
);
243 IoInitFileSystemImplementation(VOID
);
246 IoInitVpbImplementation(VOID
);
250 IN PDEVICE_OBJECT DeviceObject
,
251 IN BOOLEAN AllowRawMount
255 IoOpenSymlink(PVOID SymbolicLink
);
269 POBJECT_ATTRIBUTES ObjectAttributes
274 IopAttachVpb(PDEVICE_OBJECT DeviceObject
);
277 IoInitShutdownNotification(VOID
);
280 IoShutdownRegisteredDevices(VOID
);
283 IoShutdownRegisteredFileSystems(VOID
);
286 IoCreateArcNames(VOID
);
289 IoCreateSystemRootLink(PCHAR ParameterLine
);
293 PDEVICE_OBJECT DeviceObject
,
294 PIO_STATUS_BLOCK IoStatusBlock
,
296 PIO_STACK_LOCATION Stack
300 IoCreateDriverList(VOID
);
303 IoDestroyDriverList(VOID
);
308 IopInitBootLog(BOOLEAN StartBootLog
);
311 IopStartBootLog(VOID
);
314 IopStopBootLog(VOID
);
318 PUNICODE_STRING DriverName
,
323 IopSaveBootLogToFile(VOID
);
329 IoCancelThreadIo(PETHREAD Thread
);
334 IopInitErrorLog(VOID
);
339 RawFsIsRawFileSystemDeviceObject(IN PDEVICE_OBJECT DeviceObject
);
343 RawFsDriverEntry(PDRIVER_OBJECT DriverObject
,
344 PUNICODE_STRING RegistryPath
);
351 IopGetDeviceNode(PDEVICE_OBJECT DeviceObject
);
354 IopActionConfigureChildServices(PDEVICE_NODE DeviceNode
,
358 IopActionInitChildServices(PDEVICE_NODE DeviceNode
,
360 BOOLEAN BootDrivers
);
368 IN PDRIVER_OBJECT DriverObject
,
369 IN PUNICODE_STRING RegistryPath
373 PnpRootCreateDevice(PDEVICE_OBJECT
*PhysicalDeviceObject
);
380 PDEVICE_NODE DeviceNode
,
381 PDRIVER_OBJECT DriverObject
385 IopStartDevice(PDEVICE_NODE DeviceNode
);
391 IopInitializeBootDrivers(VOID
);
395 IopInitializeSystemDrivers(VOID
);
399 IopCreateDriverObject(
400 PDRIVER_OBJECT
*DriverObject
,
401 PUNICODE_STRING ServiceName
,
402 ULONG CreateAttributes
,
403 BOOLEAN FileSystemDriver
,
404 PVOID DriverImageStart
,
405 ULONG DriverImageSize
411 PDRIVER_OBJECT
*DriverObject
,
412 PUNICODE_STRING ServiceName
,
418 IopLoadServiceModule(
419 IN PUNICODE_STRING ServiceName
,
420 OUT PLDR_DATA_TABLE_ENTRY
*ModuleObject
425 IopInitializeDriverModule(
426 IN PDEVICE_NODE DeviceNode
,
427 IN PLDR_DATA_TABLE_ENTRY ModuleObject
,
428 IN PUNICODE_STRING ServiceName
,
429 IN BOOLEAN FileSystemDriver
,
430 OUT PDRIVER_OBJECT
*DriverObject
435 IopAttachFilterDrivers(
436 PDEVICE_NODE DeviceNode
,
442 IopMarkLastReinitializeDriver(VOID
);
446 IopReinitializeDrivers(VOID
);
456 POBJECT_CREATE_INFORMATION ObjectAttributes
461 IopDeleteFile(PVOID ObjectBody
);
467 SECURITY_OPERATION_CODE OperationCode
,
468 SECURITY_INFORMATION SecurityInformation
,
469 PSECURITY_DESCRIPTOR SecurityDescriptor
,
471 PSECURITY_DESCRIPTOR
*OldSecurityDescriptor
,
473 PGENERIC_MAPPING GenericMapping
481 POBJECT_NAME_INFORMATION ObjectNameInfo
,
489 IN PEPROCESS Process OPTIONAL
,
491 IN ACCESS_MASK GrantedAccess
,
492 IN ULONG ProcessHandleCount
,
493 IN ULONG SystemHandleCount
500 IopInitPlugPlayEvents(VOID
);
503 IopQueueTargetDeviceEvent(
505 PUNICODE_STRING DeviceIds
511 IopInitializePnpServices(
512 IN PDEVICE_NODE DeviceNode
,
513 IN BOOLEAN BootDrivers
)
517 IopInvalidateDeviceRelations(
518 IN PDEVICE_NODE DeviceNode
,
519 IN DEVICE_RELATION_TYPE Type
525 IopInitTimerImplementation(VOID
);
529 IopRemoveTimerFromTimerList(IN PIO_TIMER Timer
);
534 IopInitIoCompletionImplementation(VOID
);
536 #define CM_RESOURCE_LIST_SIZE(ResList) \
537 (ResList->Count == 1) ? \
538 FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList. \
539 PartialDescriptors[(ResList)->List[0].PartialResourceList.Count]) \
541 FIELD_OFFSET(CM_RESOURCE_LIST, List)
546 xHalQueryDriveLayout(
547 IN PUNICODE_STRING DeviceName
,
548 OUT PDRIVE_LAYOUT_INFORMATION
*LayoutInfo
555 IN PDEVICE_OBJECT DeviceObject
,
557 IN ULONG MBRTypeIdentifier
,
563 xHalIoAssignDriveLetters(
564 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
,
565 IN PSTRING NtDeviceName
,
566 OUT PUCHAR NtSystemPath
,
567 OUT PSTRING NtSystemPathString
572 xHalIoReadPartitionTable(
573 PDEVICE_OBJECT DeviceObject
,
575 BOOLEAN ReturnRecognizedPartitions
,
576 PDRIVE_LAYOUT_INFORMATION
*PartitionBuffer
581 xHalIoSetPartitionInformation(
582 IN PDEVICE_OBJECT DeviceObject
,
584 IN ULONG PartitionNumber
,
585 IN ULONG PartitionType
590 xHalIoWritePartitionTable(
591 IN PDEVICE_OBJECT DeviceObject
,
593 IN ULONG SectorsPerTrack
,
594 IN ULONG NumberOfHeads
,
595 IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer