Create the AHCI branch for Aman's work
[reactos.git] / ntoskrnl / include / internal / io.h
1 /*
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)
7 */
8 #include "ntdddisk.h"
9
10 //
11 // Define this if you want debugging support
12 //
13 #define _IO_DEBUG_ 0x00
14
15 //
16 // These define the Debug Masks Supported
17 //
18 #define IO_IRP_DEBUG 0x01
19 #define IO_FILE_DEBUG 0x02
20 #define IO_API_DEBUG 0x04
21 #define IO_CTL_DEBUG 0x08
22
23 //
24 // Debug/Tracing support
25 //
26 #if _IO_DEBUG_
27 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
28 #define IOTRACE(x, ...) \
29 { \
30 DbgPrintEx("%s [%.16s] - ", \
31 __FUNCTION__, \
32 PsGetCurrentProcess()->ImageFileName); \
33 DbgPrintEx(__VA_ARGS__); \
34 }
35 #else
36 #define IOTRACE(x, ...) \
37 if (x & IopTraceLevel) \
38 { \
39 DbgPrint("%s [%.16s] - ", \
40 __FUNCTION__, \
41 PsGetCurrentProcess()->ImageFileName); \
42 DbgPrint(__VA_ARGS__); \
43 }
44 #endif
45 #else
46 #define IOTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
47 #endif
48
49 //
50 // Registry path to the enumeration root key
51 //
52 #define ENUM_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum"
53
54 //
55 // Returns the type of METHOD_ used in this IOCTL
56 //
57 #define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
58
59 //
60 // Bugcheck codes for RAM disk booting
61 //
62 //
63 // No LoaderXIPRom descriptor was found in the loader memory list
64 //
65 #define RD_NO_XIPROM_DESCRIPTOR 1
66 //
67 // Unable to open the RAM disk driver (ramdisk.sys or \Device\Ramdisk)
68 //
69 #define RD_NO_RAMDISK_DRIVER 2
70 //
71 // FSCTL_CREATE_RAM_DISK failed
72 //
73 #define RD_FSCTL_FAILED 3
74 //
75 // Unable to create GUID string from binary GUID
76 //
77 #define RD_GUID_CONVERT_FAILED 4
78 //
79 // Unable to create symbolic link pointing to the RAM disk device
80 //
81 #define RD_SYMLINK_CREATE_FAILED 5
82
83 //
84 // Max traversal of reparse points for a single open in IoParseDevice
85 //
86 #define IOP_MAX_REPARSE_TRAVERSAL 0x20
87
88 //
89 // We can call the Ob Inlined API, it's the same thing
90 //
91 #define IopAllocateMdlFromLookaside \
92 ObpAllocateObjectCreateInfoBuffer
93 #define IopFreeMdlFromLookaside \
94 ObpFreeCapturedAttributes
95
96 //
97 // Determines if the IRP is Synchronous
98 //
99 #define IsIrpSynchronous(Irp, FileObject) \
100 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
101 (!(FileObject) ? \
102 FALSE : \
103 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
104
105 //
106 // Returns the internal Device Object Extension
107 //
108 #define IoGetDevObjExtension(DeviceObject) \
109 ((PEXTENDED_DEVOBJ_EXTENSION) \
110 (DeviceObject->DeviceObjectExtension)) \
111
112 //
113 // Returns the internal Driver Object Extension
114 //
115 #define IoGetDrvObjExtension(DriverObject) \
116 ((PEXTENDED_DRIVER_EXTENSION) \
117 (DriverObject->DriverExtension)) \
118
119 /*
120 * VOID
121 * IopDeviceNodeSetFlag(
122 * PDEVICE_NODE DeviceNode,
123 * ULONG Flag);
124 */
125 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
126 ((DeviceNode)->Flags |= (Flag))
127
128 /*
129 * VOID
130 * IopDeviceNodeClearFlag(
131 * PDEVICE_NODE DeviceNode,
132 * ULONG Flag);
133 */
134 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
135 ((DeviceNode)->Flags &= ~(Flag))
136
137 /*
138 * BOOLEAN
139 * IopDeviceNodeHasFlag(
140 * PDEVICE_NODE DeviceNode,
141 * ULONG Flag);
142 */
143 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
144 (((DeviceNode)->Flags & (Flag)) > 0)
145
146 /*
147 * VOID
148 * IopDeviceNodeSetUserFlag(
149 * PDEVICE_NODE DeviceNode,
150 * ULONG UserFlag);
151 */
152 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
153 ((DeviceNode)->UserFlags |= (UserFlag))
154
155 /*
156 * VOID
157 * IopDeviceNodeClearUserFlag(
158 * PDEVICE_NODE DeviceNode,
159 * ULONG UserFlag);
160 */
161 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
162 ((DeviceNode)->UserFlags &= ~(UserFlag))
163
164 /*
165 * BOOLEAN
166 * IopDeviceNodeHasUserFlag(
167 * PDEVICE_NODE DeviceNode,
168 * ULONG UserFlag);
169 */
170 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
171 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
172
173 /*
174 * VOID
175 * IopDeviceNodeSetProblem(
176 * PDEVICE_NODE DeviceNode,
177 * ULONG Problem);
178 */
179 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
180 ((DeviceNode)->Problem |= (Problem))
181
182 /*
183 * VOID
184 * IopDeviceNodeClearProblem(
185 * PDEVICE_NODE DeviceNode,
186 * ULONG Problem);
187 */
188 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
189 ((DeviceNode)->Problem &= ~(Problem))
190
191 /*
192 * BOOLEAN
193 * IopDeviceNodeHasProblem(
194 * PDEVICE_NODE DeviceNode,
195 * ULONG Problem);
196 */
197 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
198 (((DeviceNode)->Problem & (Problem)) > 0)
199
200 /*
201 * VOID
202 * IopInitDeviceTreeTraverseContext(
203 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
204 * PDEVICE_NODE DeviceNode,
205 * DEVICETREE_TRAVERSE_ROUTINE Action,
206 * PVOID Context);
207 */
208 #define IopInitDeviceTreeTraverseContext( \
209 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
210 _Context) { \
211 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
212 (_DeviceNode); \
213 (_DeviceTreeTraverseContext)->Action = (_Action); \
214 (_DeviceTreeTraverseContext)->Context = (_Context); }
215
216 /*
217 * BOOLEAN
218 * IopIsValidPhysicalDeviceObject(
219 * IN PDEVICE_OBJECT PhysicalDeviceObject);
220 */
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))
225
226 //
227 // Device List Operations
228 //
229 typedef enum _IOP_DEVICE_LIST_OPERATION
230 {
231 IopRemove,
232 IopAdd
233 } IOP_DEVICE_LIST_OPERATION, *PIOP_DEVICE_LIST_OPERATION;
234
235 //
236 // Transfer statistics
237 //
238 typedef enum _IOP_TRANSFER_TYPE
239 {
240 IopReadTransfer,
241 IopWriteTransfer,
242 IopOtherTransfer
243 } IOP_TRANSFER_TYPE, *PIOP_TRANSFER_TYPE;
244
245 //
246 // Packet Types when piggybacking on the IRP Overlay
247 //
248 typedef enum _COMPLETION_PACKET_TYPE
249 {
250 IopCompletionPacketIrp,
251 IopCompletionPacketMini,
252 IopCompletionPacketQuota
253 } COMPLETION_PACKET_TYPE, *PCOMPLETION_PACKET_TYPE;
254
255 //
256 // Special version of the IRP Overlay used to optimize I/O completion
257 // by not using up a separate structure.
258 //
259 typedef struct _IOP_MINI_COMPLETION_PACKET
260 {
261 struct
262 {
263 LIST_ENTRY ListEntry;
264 union
265 {
266 struct _IO_STACK_LOCATION *CurrentStackLocation;
267 ULONG PacketType;
268 };
269 };
270 PVOID KeyContext;
271 PVOID ApcContext;
272 NTSTATUS IoStatus;
273 ULONG_PTR IoStatusInformation;
274 } IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET;
275
276 //
277 // I/O Completion Context for IoSetIoCompletionRoutineEx
278 //
279 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
280 {
281 PDEVICE_OBJECT DeviceObject;
282 PVOID Context;
283 PIO_COMPLETION_ROUTINE CompletionRoutine;
284 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT;
285
286 //
287 // I/O Wrapper around the Executive Work Item
288 //
289 typedef struct _IO_WORKITEM
290 {
291 WORK_QUEUE_ITEM Item;
292 PDEVICE_OBJECT DeviceObject;
293 PIO_WORKITEM_ROUTINE WorkerRoutine;
294 PVOID Context;
295 } IO_WORKITEM;
296
297 //
298 // I/O Wrapper around the Kernel Interrupt
299 //
300 typedef struct _IO_INTERRUPT
301 {
302 KINTERRUPT FirstInterrupt;
303 PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS];
304 KSPIN_LOCK SpinLock;
305 } IO_INTERRUPT, *PIO_INTERRUPT;
306
307 //
308 // I/O Error Log Packet Header
309 //
310 typedef struct _ERROR_LOG_ENTRY
311 {
312 CSHORT Type;
313 CSHORT Size;
314 LIST_ENTRY ListEntry;
315 PDEVICE_OBJECT DeviceObject;
316 PDRIVER_OBJECT DriverObject;
317 LARGE_INTEGER TimeStamp;
318 } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
319
320 //
321 // Event Log LPC Message
322 //
323 typedef struct _ELF_API_MSG
324 {
325 PORT_MESSAGE h;
326 ULONG Unknown[2];
327 IO_ERROR_LOG_MESSAGE IoErrorMessage;
328 } ELF_API_MSG, *PELF_API_MSG;
329
330 //
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.
334 //
335 typedef struct _EXTENDED_IO_REMOVE_LOCK
336 {
337 IO_REMOVE_LOCK_COMMON_BLOCK Common;
338 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
339 } EXTENDED_IO_REMOVE_LOCK, *PEXTENDED_IO_REMOVE_LOCK;
340
341 //
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.
344 //
345 typedef struct _DUMMY_FILE_OBJECT
346 {
347 OBJECT_HEADER ObjectHeader;
348 CHAR FileObjectBody[sizeof(FILE_OBJECT)];
349 } DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT;
350
351 //
352 // Open packet used as a context for Device/File parsing so that the parse
353 // routine can know what operation is being requested.
354 //
355 typedef struct _OPEN_PACKET
356 {
357 CSHORT Type;
358 CSHORT Size;
359 PFILE_OBJECT FileObject;
360 NTSTATUS FinalStatus;
361 ULONG_PTR Information;
362 ULONG ParseCheck;
363 PFILE_OBJECT RelatedFileObject;
364 OBJECT_ATTRIBUTES OriginalAttributes;
365 LARGE_INTEGER AllocationSize;
366 ULONG CreateOptions;
367 USHORT FileAttributes;
368 USHORT ShareAccess;
369 PVOID EaBuffer;
370 ULONG EaLength;
371 ULONG Options;
372 ULONG Disposition;
373 PFILE_BASIC_INFORMATION BasicInformation;
374 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation;
375 CREATE_FILE_TYPE CreateFileType;
376 PVOID ExtraCreateParameters;
377 BOOLEAN Override;
378 BOOLEAN QueryOnly;
379 BOOLEAN DeleteOnly;
380 BOOLEAN FullAttributes;
381 PDUMMY_FILE_OBJECT LocalFileObject;
382 BOOLEAN TraversedMountPoint;
383 ULONG InternalFlags;
384 PDEVICE_OBJECT TopDeviceObjectHint;
385 } OPEN_PACKET, *POPEN_PACKET;
386
387 //
388 // Parameters packet for Load/Unload work item's context
389 //
390 typedef struct _LOAD_UNLOAD_PARAMS
391 {
392 NTSTATUS Status;
393 PCUNICODE_STRING RegistryPath;
394 WORK_QUEUE_ITEM WorkItem;
395 KEVENT Event;
396 PDRIVER_OBJECT DriverObject;
397 } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS;
398
399 //
400 // Boot Driver List Entry
401 //
402 typedef struct _DRIVER_INFORMATION
403 {
404 LIST_ENTRY Link;
405 PDRIVER_OBJECT DriverObject;
406 PBOOT_DRIVER_LIST_ENTRY DataTableEntry;
407 HANDLE ServiceHandle;
408 USHORT TagPosition;
409 ULONG Failed;
410 ULONG Processed;
411 NTSTATUS Status;
412 } DRIVER_INFORMATION, *PDRIVER_INFORMATION;
413
414 //
415 // Boot Driver Node
416 //
417 typedef struct _BOOT_DRIVER_NODE
418 {
419 BOOT_DRIVER_LIST_ENTRY ListEntry;
420 UNICODE_STRING Group;
421 UNICODE_STRING Name;
422 ULONG Tag;
423 ULONG ErrorControl;
424 } BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE;
425
426 //
427 // List of Bus Type GUIDs
428 //
429 typedef struct _IO_BUS_TYPE_GUID_LIST
430 {
431 ULONG GuidCount;
432 FAST_MUTEX Lock;
433 GUID Guids[1];
434 } IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST;
435 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList;
436
437 //
438 // Shutdown entry for registed devices
439 //
440 typedef struct _SHUTDOWN_ENTRY
441 {
442 LIST_ENTRY ShutdownList;
443 PDEVICE_OBJECT DeviceObject;
444 } SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY;
445
446 //
447 // F/S Notification entry for registered File Systems
448 //
449 typedef struct _FS_CHANGE_NOTIFY_ENTRY
450 {
451 LIST_ENTRY FsChangeNotifyList;
452 PDRIVER_OBJECT DriverObject;
453 PDRIVER_FS_NOTIFICATION FSDNotificationProc;
454 } FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY;
455
456 //
457 // Driver (Boot) Re-Initialization Entry
458 //
459 typedef struct _DRIVER_REINIT_ITEM
460 {
461 LIST_ENTRY ItemEntry;
462 PDRIVER_OBJECT DriverObject;
463 PDRIVER_REINITIALIZE ReinitRoutine;
464 PVOID Context;
465 } DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
466
467 //
468 // Called on every visit of a node during a preorder-traversal of the device
469 // node tree.
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
475 // the caller.
476 //
477 typedef
478 NTSTATUS
479 (*DEVICETREE_TRAVERSE_ROUTINE)(
480 IN PDEVICE_NODE DeviceNode,
481 IN PVOID Context
482 );
483
484 //
485 // Context information for traversing the device tree
486 //
487 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
488 {
489 //
490 // Current device node during a traversal
491 //
492 PDEVICE_NODE DeviceNode;
493
494 //
495 // Initial device node where we start the traversal
496 //
497 PDEVICE_NODE FirstDeviceNode;
498
499 //
500 // Action routine to be called for every device node
501 //
502 DEVICETREE_TRAVERSE_ROUTINE Action;
503
504 //
505 // Context passed to the action routine
506 //
507 PVOID Context;
508 } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
509
510 //
511 // Resource code
512 //
513 ULONG
514 NTAPI
515 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList);
516
517 NTSTATUS
518 NTAPI
519 IopAssignDeviceResources(
520 IN PDEVICE_NODE DeviceNode
521 );
522
523 NTSTATUS
524 NTAPI
525 IopFixupResourceListWithRequirements(
526 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
527 OUT PCM_RESOURCE_LIST *ResourceList
528 );
529
530 NTSTATUS
531 NTAPI
532 IopDetectResourceConflict(
533 IN PCM_RESOURCE_LIST ResourceList,
534 IN BOOLEAN Silent,
535 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
536 );
537
538 //
539 // PNP Routines
540 //
541 NTSTATUS
542 NTAPI
543 PipCallDriverAddDevice(
544 IN PDEVICE_NODE DeviceNode,
545 IN BOOLEAN LoadDriver,
546 IN PDRIVER_OBJECT DriverObject
547 );
548
549 NTSTATUS
550 NTAPI
551 IopInitializePlugPlayServices(
552 VOID
553 );
554
555 BOOLEAN
556 NTAPI
557 PpInitSystem(
558 VOID
559 );
560
561 VOID
562 PnpInit2(
563 VOID
564 );
565
566 VOID
567 IopInitDriverImplementation(
568 VOID
569 );
570
571 VOID
572 IopInitPnpNotificationImplementation(
573 VOID
574 );
575
576 VOID
577 IopNotifyPlugPlayNotification(
578 IN PDEVICE_OBJECT DeviceObject,
579 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
580 IN LPCGUID Event,
581 IN PVOID EventCategoryData1,
582 IN PVOID EventCategoryData2
583 );
584
585 NTSTATUS
586 IopGetSystemPowerDeviceObject(
587 IN PDEVICE_OBJECT *DeviceObject
588 );
589
590 PDEVICE_NODE
591 NTAPI
592 PipAllocateDeviceNode(
593 IN PDEVICE_OBJECT PhysicalDeviceObject
594 );
595
596 NTSTATUS
597 IopCreateDeviceNode(
598 IN PDEVICE_NODE ParentNode,
599 IN PDEVICE_OBJECT PhysicalDeviceObject,
600 IN PUNICODE_STRING ServiceName,
601 OUT PDEVICE_NODE *DeviceNode
602 );
603
604 NTSTATUS
605 IopFreeDeviceNode(
606 IN PDEVICE_NODE DeviceNode
607 );
608
609 NTSTATUS
610 NTAPI
611 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode,
612 PDEVICE_CAPABILITIES DeviceCaps);
613
614 NTSTATUS
615 NTAPI
616 IopSynchronousCall(
617 IN PDEVICE_OBJECT DeviceObject,
618 IN PIO_STACK_LOCATION IoStackLocation,
619 OUT PVOID *Information
620 );
621
622 NTSTATUS
623 NTAPI
624 IopInitiatePnpIrp(
625 IN PDEVICE_OBJECT DeviceObject,
626 IN PIO_STATUS_BLOCK IoStatusBlock,
627 IN UCHAR MinorFunction,
628 IN PIO_STACK_LOCATION Stack
629 );
630
631 PDEVICE_NODE
632 FASTCALL
633 IopGetDeviceNode(
634 IN PDEVICE_OBJECT DeviceObject
635 );
636
637 NTSTATUS
638 IopActionConfigureChildServices(
639 IN PDEVICE_NODE DeviceNode,
640 IN PVOID Context
641 );
642
643 NTSTATUS
644 IopActionInitChildServices(
645 IN PDEVICE_NODE DeviceNode,
646 IN PVOID Context
647 );
648
649 NTSTATUS
650 IopEnumerateDevice(
651 IN PDEVICE_OBJECT DeviceObject
652 );
653
654 NTSTATUS
655 IoCreateDriverList(
656 VOID
657 );
658
659 NTSTATUS
660 IoDestroyDriverList(
661 VOID
662 );
663
664 NTSTATUS
665 IopInitPlugPlayEvents(VOID);
666
667 NTSTATUS
668 IopQueueTargetDeviceEvent(
669 const GUID *Guid,
670 PUNICODE_STRING DeviceIds
671 );
672
673 NTSTATUS
674 IopInitializePnpServices(
675 IN PDEVICE_NODE DeviceNode);
676
677 NTSTATUS
678 NTAPI
679 IopOpenRegistryKeyEx(
680 PHANDLE KeyHandle,
681 HANDLE ParentKey,
682 PUNICODE_STRING Name,
683 ACCESS_MASK DesiredAccess);
684
685 NTSTATUS
686 NTAPI
687 IopGetRegistryValue(
688 IN HANDLE Handle,
689 IN PWSTR ValueName,
690 OUT PKEY_VALUE_FULL_INFORMATION *Information
691 );
692
693 NTSTATUS
694 NTAPI
695 IopCreateRegistryKeyEx(
696 OUT PHANDLE Handle,
697 IN HANDLE BaseHandle OPTIONAL,
698 IN PUNICODE_STRING KeyName,
699 IN ACCESS_MASK DesiredAccess,
700 IN ULONG CreateOptions,
701 OUT PULONG Disposition OPTIONAL
702 );
703
704
705 NTSTATUS
706 IopTraverseDeviceTree(
707 PDEVICETREE_TRAVERSE_CONTEXT Context);
708
709 //
710 // PnP Routines
711 //
712 NTSTATUS
713 NTAPI
714 IopUpdateRootKey(
715 VOID
716 );
717
718 NTSTATUS
719 NTAPI
720 PiInitCacheGroupInformation(
721 VOID
722 );
723
724 USHORT
725 NTAPI
726 PpInitGetGroupOrderIndex(
727 IN HANDLE ServiceHandle
728 );
729
730 USHORT
731 NTAPI
732 PipGetDriverTagPriority(
733 IN HANDLE ServiceHandle
734 );
735
736 NTSTATUS
737 NTAPI
738 PnpRegMultiSzToUnicodeStrings(
739 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation,
740 OUT PUNICODE_STRING *UnicodeStringList,
741 OUT PULONG UnicodeStringCount
742 );
743
744 BOOLEAN
745 NTAPI
746 PnpRegSzToString(
747 IN PWCHAR RegSzData,
748 IN ULONG RegSzLength,
749 OUT PUSHORT StringLength OPTIONAL
750 );
751
752 //
753 // Initialization Routines
754 //
755 NTSTATUS
756 NTAPI
757 IopCreateArcNames(
758 IN PLOADER_PARAMETER_BLOCK LoaderBlock
759 );
760
761 NTSTATUS
762 NTAPI
763 IopReassignSystemRoot(
764 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
765 OUT PANSI_STRING NtBootPath
766 );
767
768 BOOLEAN
769 NTAPI
770 IoInitSystem(
771 IN PLOADER_PARAMETER_BLOCK LoaderBlock
772 );
773
774 BOOLEAN
775 NTAPI
776 IopVerifyDiskSignature(
777 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout,
778 IN PARC_DISK_SIGNATURE ArcDiskSignature,
779 OUT PULONG Signature
780 );
781
782 //
783 // Device/Volume Routines
784 //
785 VOID
786 NTAPI
787 IopReadyDeviceObjects(
788 IN PDRIVER_OBJECT Driver
789 );
790
791 NTSTATUS
792 FASTCALL
793 IopInitializeDevice(
794 IN PDEVICE_NODE DeviceNode,
795 IN PDRIVER_OBJECT DriverObject
796 );
797
798 NTSTATUS
799 IopStartDevice(
800 IN PDEVICE_NODE DeviceNode
801 );
802
803 NTSTATUS
804 IopStopDevice(
805 IN PDEVICE_NODE DeviceNode
806 );
807
808 NTSTATUS
809 IopRemoveDevice(
810 IN PDEVICE_NODE DeviceNode
811 );
812
813 PVPB
814 NTAPI
815 IopCheckVpbMounted(
816 IN POPEN_PACKET OpenPacket,
817 IN PDEVICE_OBJECT DeviceObject,
818 IN PUNICODE_STRING RemainingName,
819 OUT PNTSTATUS Status
820 );
821
822 NTSTATUS
823 NTAPI
824 IopMountVolume(
825 IN PDEVICE_OBJECT DeviceObject,
826 IN BOOLEAN AllowRawMount,
827 IN BOOLEAN DeviceIsLocked,
828 IN BOOLEAN Alertable,
829 OUT PVPB *Vpb
830 );
831
832 PVOID
833 IoOpenSymlink(
834 IN PVOID SymbolicLink
835 );
836
837 PVOID
838 IoOpenFileOnDevice(
839 IN PVOID SymbolicLink,
840 IN PWCHAR Name
841 );
842
843 NTSTATUS
844 NTAPI
845 IopCreateVpb(
846 IN PDEVICE_OBJECT DeviceObject
847 );
848
849 VOID
850 NTAPI
851 IopDereferenceVpbAndFree(
852 IN PVPB Vpb
853 );
854
855 VOID
856 NTAPI
857 IoInitFileSystemImplementation(
858 VOID
859 );
860
861 VOID
862 NTAPI
863 IoInitVpbImplementation(
864 VOID
865 );
866
867 NTSTATUS
868 NTAPI
869 IopReferenceDeviceObject(
870 IN PDEVICE_OBJECT DeviceObject
871 );
872
873 VOID
874 NTAPI
875 IopDereferenceDeviceObject(
876 IN PDEVICE_OBJECT DeviceObject,
877 IN BOOLEAN ForceUnload
878 );
879
880 NTSTATUS
881 NTAPI
882 IoGetRelatedTargetDevice(
883 IN PFILE_OBJECT FileObject,
884 OUT PDEVICE_OBJECT *DeviceObject
885 );
886
887 VOID
888 NTAPI
889 IopUnloadDevice(
890 IN PDEVICE_OBJECT DeviceObject
891 );
892
893 //
894 // IRP Routines
895 //
896 NTSTATUS
897 NTAPI
898 IopCleanupFailedIrp(
899 IN PFILE_OBJECT FileObject,
900 IN PKEVENT EventObject,
901 IN PVOID Buffer OPTIONAL
902 );
903
904 VOID
905 NTAPI
906 IopAbortInterruptedIrp(
907 IN PKEVENT EventObject,
908 IN PIRP Irp
909 );
910
911 PIRP
912 NTAPI
913 IopAllocateIrpMustSucceed(
914 IN CCHAR StackSize
915 );
916
917 //
918 // Shutdown routines
919 //
920 VOID
921 IoInitShutdownNotification(
922 VOID
923 );
924
925 VOID
926 NTAPI
927 IoShutdownSystem(
928 IN ULONG Phase
929 );
930
931 VOID
932 NTAPI
933 IopShutdownBaseFileSystems(
934 IN PLIST_ENTRY ListHead
935 );
936
937 //
938 // Boot logging support
939 //
940 VOID
941 IopInitBootLog(
942 IN BOOLEAN StartBootLog
943 );
944
945 VOID
946 IopStartBootLog(
947 VOID
948 );
949
950 VOID
951 IopStopBootLog(
952 VOID
953 );
954
955 VOID
956 IopBootLog(
957 IN PUNICODE_STRING DriverName,
958 IN BOOLEAN Success
959 );
960
961 VOID
962 IopSaveBootLogToFile(
963 VOID
964 );
965
966 //
967 // I/O Cancellation Routines
968 //
969 VOID
970 NTAPI
971 IoCancelThreadIo(
972 IN PETHREAD Thread
973 );
974
975 VOID
976 IoInitCancelHandling(
977 VOID
978 );
979
980 //
981 // I/O Completion
982 //
983 VOID
984 NTAPI
985 IopCompleteRequest(
986 IN PKAPC Apc,
987 IN PKNORMAL_ROUTINE* NormalRoutine,
988 IN PVOID* NormalContext,
989 IN PVOID* SystemArgument1,
990 IN PVOID* SystemArgument2
991 );
992
993 //
994 // Error Logging Routines
995 //
996 VOID
997 NTAPI
998 IopInitErrorLog(
999 VOID
1000 );
1001
1002 VOID
1003 NTAPI
1004 IopLogWorker(
1005 IN PVOID Parameter
1006 );
1007
1008 //
1009 // Raw File System MiniDriver
1010 //
1011 BOOLEAN
1012 RawFsIsRawFileSystemDeviceObject(
1013 IN PDEVICE_OBJECT DeviceObject
1014 );
1015
1016 NTSTATUS
1017 NTAPI
1018 RawFsDriverEntry(
1019 IN PDRIVER_OBJECT DriverObject,
1020 IN PUNICODE_STRING RegistryPath
1021 );
1022
1023 //
1024 // PnP Root MiniDriver
1025 //
1026 NTSTATUS
1027 NTAPI
1028 PnpRootDriverEntry(
1029 IN PDRIVER_OBJECT DriverObject,
1030 IN PUNICODE_STRING RegistryPath
1031 );
1032
1033 NTSTATUS
1034 PnpRootCreateDevice(
1035 IN PUNICODE_STRING ServiceName,
1036 IN OPTIONAL PDRIVER_OBJECT DriverObject,
1037 OUT PDEVICE_OBJECT *PhysicalDeviceObject,
1038 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1039 );
1040
1041 NTSTATUS
1042 PnpRootRegisterDevice(
1043 IN PDEVICE_OBJECT DeviceObject);
1044
1045 //
1046 // Driver Routines
1047 //
1048 VOID
1049 FASTCALL
1050 IopInitializeBootDrivers(
1051 VOID
1052 );
1053
1054 VOID
1055 FASTCALL
1056 IopInitializeSystemDrivers(
1057 VOID
1058 );
1059
1060 NTSTATUS
1061 NTAPI
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);
1068
1069 VOID
1070 NTAPI
1071 IopDeleteDriver(
1072 IN PVOID ObjectBody
1073 );
1074
1075 NTSTATUS
1076 FASTCALL
1077 IopGetDriverObject(
1078 OUT PDRIVER_OBJECT *DriverObject,
1079 IN PUNICODE_STRING ServiceName,
1080 IN BOOLEAN FileSystem
1081 );
1082
1083 NTSTATUS
1084 FASTCALL
1085 IopLoadServiceModule(
1086 IN PUNICODE_STRING ServiceName,
1087 OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
1088 );
1089
1090 NTSTATUS
1091 NTAPI
1092 IopLoadUnloadDriver(
1093 _In_opt_ PCUNICODE_STRING RegistryPath,
1094 _Inout_ PDRIVER_OBJECT *DriverObject
1095 );
1096
1097 NTSTATUS
1098 FASTCALL
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
1105 );
1106
1107 NTSTATUS
1108 FASTCALL
1109 IopAttachFilterDrivers(
1110 IN PDEVICE_NODE DeviceNode,
1111 IN BOOLEAN Lower
1112 );
1113
1114 VOID
1115 NTAPI
1116 IopReinitializeDrivers(
1117 VOID
1118 );
1119
1120 VOID
1121 NTAPI
1122 IopReinitializeBootDrivers(
1123 VOID
1124 );
1125
1126 //
1127 // File Routines
1128 //
1129 VOID
1130 NTAPI
1131 IopDeleteDevice(IN PVOID ObjectBody);
1132
1133 NTSTATUS
1134 NTAPI
1135 IopParseDevice(
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,
1145 OUT PVOID *Object
1146 );
1147
1148 NTSTATUS
1149 NTAPI
1150 IopParseFile(
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,
1160 OUT PVOID *Object
1161 );
1162
1163 VOID
1164 NTAPI
1165 IopDeleteFile(
1166 IN PVOID ObjectBody
1167 );
1168
1169 NTSTATUS
1170 NTAPI
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
1180 );
1181
1182 NTSTATUS
1183 NTAPI
1184 IopQueryNameFile(
1185 IN PVOID ObjectBody,
1186 IN BOOLEAN HasName,
1187 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
1188 IN ULONG Length,
1189 OUT PULONG ReturnLength,
1190 IN KPROCESSOR_MODE PreviousMode
1191 );
1192
1193 VOID
1194 NTAPI
1195 IopCloseFile(
1196 IN PEPROCESS Process OPTIONAL,
1197 IN PVOID Object,
1198 IN ACCESS_MASK GrantedAccess,
1199 IN ULONG ProcessHandleCount,
1200 IN ULONG SystemHandleCount
1201 );
1202
1203 PVOID
1204 NTAPI
1205 IoGetFileObjectFilterContext(
1206 IN PFILE_OBJECT FileObject
1207 );
1208
1209 NTSTATUS
1210 NTAPI
1211 IoChangeFileObjectFilterContext(
1212 IN PFILE_OBJECT FileObject,
1213 IN PVOID FilterContext,
1214 IN BOOLEAN Define
1215 );
1216
1217 VOID
1218 NTAPI
1219 IopDoNameTransmogrify(
1220 IN PIRP Irp,
1221 IN PFILE_OBJECT FileObject,
1222 IN PREPARSE_DATA_BUFFER DataBuffer
1223 );
1224
1225 //
1226 // I/O Timer Routines
1227 //
1228 VOID
1229 FASTCALL
1230 IopInitTimerImplementation(
1231 VOID
1232 );
1233
1234 VOID
1235 NTAPI
1236 IopRemoveTimerFromTimerList(
1237 IN PIO_TIMER Timer
1238 );
1239
1240 //
1241 // I/O Completion Routines
1242 //
1243 VOID
1244 NTAPI
1245 IopDeleteIoCompletion(
1246 PVOID ObjectBody
1247 );
1248
1249 NTSTATUS
1250 NTAPI
1251 IoSetIoCompletion(
1252 IN PVOID IoCompletion,
1253 IN PVOID KeyContext,
1254 IN PVOID ApcContext,
1255 IN NTSTATUS IoStatus,
1256 IN ULONG_PTR IoStatusInformation,
1257 IN BOOLEAN Quota
1258 );
1259
1260 //
1261 // Ramdisk Routines
1262 //
1263 NTSTATUS
1264 NTAPI
1265 IopStartRamdisk(
1266 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1267 );
1268
1269 //
1270 // Configuration Routines
1271 //
1272 NTSTATUS
1273 NTAPI
1274 IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList,
1275 IN GUID Guid,
1276 IN ULONG ExpectedInterfaces,
1277 IN PULONG Interfaces
1278 );
1279
1280 VOID
1281 NTAPI
1282 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName,
1283 IN PUNICODE_STRING OsLoaderPathName
1284 );
1285
1286 //
1287 // Global I/O Data
1288 //
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;
1305
1306 //
1307 // Inlined Functions
1308 //
1309 #include "io_x.h"