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