Branching for 0.3.15 release after two days of no response from a certain sphere...
[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/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 MailslotOrPipeParameters;
372 BOOLEAN Override;
373 BOOLEAN QueryOnly;
374 BOOLEAN DeleteOnly;
375 BOOLEAN FullAttributes;
376 PDUMMY_FILE_OBJECT DummyFileObject;
377 ULONG InternalFlags;
378 //PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update
379 } OPEN_PACKET, *POPEN_PACKET;
380
381 //
382 // Parameters packet for Load/Unload work item's context
383 //
384 typedef struct _LOAD_UNLOAD_PARAMS
385 {
386 NTSTATUS Status;
387 PUNICODE_STRING ServiceName;
388 WORK_QUEUE_ITEM WorkItem;
389 KEVENT Event;
390 PDRIVER_OBJECT DriverObject;
391 } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS;
392
393 //
394 // Boot Driver List Entry
395 //
396 typedef struct _DRIVER_INFORMATION
397 {
398 LIST_ENTRY Link;
399 PDRIVER_OBJECT DriverObject;
400 PBOOT_DRIVER_LIST_ENTRY DataTableEntry;
401 HANDLE ServiceHandle;
402 USHORT TagPosition;
403 ULONG Failed;
404 ULONG Processed;
405 NTSTATUS Status;
406 } DRIVER_INFORMATION, *PDRIVER_INFORMATION;
407
408 //
409 // Boot Driver Node
410 //
411 typedef struct _BOOT_DRIVER_NODE
412 {
413 BOOT_DRIVER_LIST_ENTRY ListEntry;
414 UNICODE_STRING Group;
415 UNICODE_STRING Name;
416 ULONG Tag;
417 ULONG ErrorControl;
418 } BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE;
419
420 //
421 // List of Bus Type GUIDs
422 //
423 typedef struct _IO_BUS_TYPE_GUID_LIST
424 {
425 ULONG GuidCount;
426 FAST_MUTEX Lock;
427 GUID Guids[1];
428 } IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST;
429 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList;
430
431 //
432 // Shutdown entry for registed devices
433 //
434 typedef struct _SHUTDOWN_ENTRY
435 {
436 LIST_ENTRY ShutdownList;
437 PDEVICE_OBJECT DeviceObject;
438 } SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY;
439
440 //
441 // F/S Notification entry for registered File Systems
442 //
443 typedef struct _FS_CHANGE_NOTIFY_ENTRY
444 {
445 LIST_ENTRY FsChangeNotifyList;
446 PDRIVER_OBJECT DriverObject;
447 PDRIVER_FS_NOTIFICATION FSDNotificationProc;
448 } FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY;
449
450 //
451 // Driver (Boot) Re-Initialization Entry
452 //
453 typedef struct _DRIVER_REINIT_ITEM
454 {
455 LIST_ENTRY ItemEntry;
456 PDRIVER_OBJECT DriverObject;
457 PDRIVER_REINITIALIZE ReinitRoutine;
458 PVOID Context;
459 } DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
460
461 //
462 // Called on every visit of a node during a preorder-traversal of the device
463 // node tree.
464 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
465 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
466 // Any other returned status code will be returned to the caller. If a status
467 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
468 // the traversal is stopped immediately and the status code is returned to
469 // the caller.
470 //
471 typedef
472 NTSTATUS
473 (*DEVICETREE_TRAVERSE_ROUTINE)(
474 IN PDEVICE_NODE DeviceNode,
475 IN PVOID Context
476 );
477
478 //
479 // Context information for traversing the device tree
480 //
481 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
482 {
483 //
484 // Current device node during a traversal
485 //
486 PDEVICE_NODE DeviceNode;
487
488 //
489 // Initial device node where we start the traversal
490 //
491 PDEVICE_NODE FirstDeviceNode;
492
493 //
494 // Action routine to be called for every device node
495 //
496 DEVICETREE_TRAVERSE_ROUTINE Action;
497
498 //
499 // Context passed to the action routine
500 //
501 PVOID Context;
502 } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
503
504 //
505 // Resource code
506 //
507 ULONG
508 NTAPI
509 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList);
510
511 NTSTATUS
512 NTAPI
513 IopAssignDeviceResources(
514 IN PDEVICE_NODE DeviceNode
515 );
516
517 NTSTATUS
518 NTAPI
519 IopFixupResourceListWithRequirements(
520 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
521 OUT PCM_RESOURCE_LIST *ResourceList
522 );
523
524 NTSTATUS
525 NTAPI
526 IopDetectResourceConflict(
527 IN PCM_RESOURCE_LIST ResourceList,
528 IN BOOLEAN Silent,
529 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
530 );
531
532 //
533 // PNP Routines
534 //
535 NTSTATUS
536 NTAPI
537 PipCallDriverAddDevice(
538 IN PDEVICE_NODE DeviceNode,
539 IN BOOLEAN LoadDriver,
540 IN PDRIVER_OBJECT DriverObject
541 );
542
543 NTSTATUS
544 NTAPI
545 IopInitializePlugPlayServices(
546 VOID
547 );
548
549 BOOLEAN
550 NTAPI
551 PpInitSystem(
552 VOID
553 );
554
555 VOID
556 PnpInit2(
557 VOID
558 );
559
560 VOID
561 IopInitDriverImplementation(
562 VOID
563 );
564
565 VOID
566 IopInitPnpNotificationImplementation(
567 VOID
568 );
569
570 VOID
571 IopNotifyPlugPlayNotification(
572 IN PDEVICE_OBJECT DeviceObject,
573 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
574 IN LPCGUID Event,
575 IN PVOID EventCategoryData1,
576 IN PVOID EventCategoryData2
577 );
578
579 NTSTATUS
580 IopGetSystemPowerDeviceObject(
581 IN PDEVICE_OBJECT *DeviceObject
582 );
583
584 PDEVICE_NODE
585 NTAPI
586 PipAllocateDeviceNode(
587 IN PDEVICE_OBJECT PhysicalDeviceObject
588 );
589
590 NTSTATUS
591 IopCreateDeviceNode(
592 IN PDEVICE_NODE ParentNode,
593 IN PDEVICE_OBJECT PhysicalDeviceObject,
594 IN PUNICODE_STRING ServiceName,
595 OUT PDEVICE_NODE *DeviceNode
596 );
597
598 NTSTATUS
599 IopFreeDeviceNode(
600 IN PDEVICE_NODE DeviceNode
601 );
602
603 NTSTATUS
604 NTAPI
605 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode,
606 PDEVICE_CAPABILITIES DeviceCaps);
607
608 NTSTATUS
609 NTAPI
610 IopSynchronousCall(
611 IN PDEVICE_OBJECT DeviceObject,
612 IN PIO_STACK_LOCATION IoStackLocation,
613 OUT PVOID *Information
614 );
615
616 NTSTATUS
617 NTAPI
618 IopInitiatePnpIrp(
619 IN PDEVICE_OBJECT DeviceObject,
620 IN PIO_STATUS_BLOCK IoStatusBlock,
621 IN UCHAR MinorFunction,
622 IN PIO_STACK_LOCATION Stack
623 );
624
625 PDEVICE_NODE
626 FASTCALL
627 IopGetDeviceNode(
628 IN PDEVICE_OBJECT DeviceObject
629 );
630
631 NTSTATUS
632 IopActionConfigureChildServices(
633 IN PDEVICE_NODE DeviceNode,
634 IN PVOID Context
635 );
636
637 NTSTATUS
638 IopActionInitChildServices(
639 IN PDEVICE_NODE DeviceNode,
640 IN PVOID Context
641 );
642
643 NTSTATUS
644 IopEnumerateDevice(
645 IN PDEVICE_OBJECT DeviceObject
646 );
647
648 NTSTATUS
649 IoCreateDriverList(
650 VOID
651 );
652
653 NTSTATUS
654 IoDestroyDriverList(
655 VOID
656 );
657
658 NTSTATUS
659 INIT_FUNCTION
660 IopInitPlugPlayEvents(VOID);
661
662 NTSTATUS
663 IopQueueTargetDeviceEvent(
664 const GUID *Guid,
665 PUNICODE_STRING DeviceIds
666 );
667
668 NTSTATUS
669 IopInitializePnpServices(
670 IN PDEVICE_NODE DeviceNode);
671
672 NTSTATUS
673 NTAPI
674 IopOpenRegistryKeyEx(
675 PHANDLE KeyHandle,
676 HANDLE ParentKey,
677 PUNICODE_STRING Name,
678 ACCESS_MASK DesiredAccess);
679
680 NTSTATUS
681 NTAPI
682 IopGetRegistryValue(
683 IN HANDLE Handle,
684 IN PWSTR ValueName,
685 OUT PKEY_VALUE_FULL_INFORMATION *Information
686 );
687
688 NTSTATUS
689 NTAPI
690 IopCreateRegistryKeyEx(
691 OUT PHANDLE Handle,
692 IN HANDLE BaseHandle OPTIONAL,
693 IN PUNICODE_STRING KeyName,
694 IN ACCESS_MASK DesiredAccess,
695 IN ULONG CreateOptions,
696 OUT PULONG Disposition OPTIONAL
697 );
698
699
700 NTSTATUS
701 IopTraverseDeviceTree(
702 PDEVICETREE_TRAVERSE_CONTEXT Context);
703
704 //
705 // PnP Routines
706 //
707 NTSTATUS
708 NTAPI
709 IopUpdateRootKey(
710 VOID
711 );
712
713 NTSTATUS
714 NTAPI
715 PiInitCacheGroupInformation(
716 VOID
717 );
718
719 USHORT
720 NTAPI
721 PpInitGetGroupOrderIndex(
722 IN HANDLE ServiceHandle
723 );
724
725 USHORT
726 NTAPI
727 PipGetDriverTagPriority(
728 IN HANDLE ServiceHandle
729 );
730
731 NTSTATUS
732 NTAPI
733 PnpRegMultiSzToUnicodeStrings(
734 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation,
735 OUT PUNICODE_STRING *UnicodeStringList,
736 OUT PULONG UnicodeStringCount
737 );
738
739 BOOLEAN
740 NTAPI
741 PnpRegSzToString(
742 IN PWCHAR RegSzData,
743 IN ULONG RegSzLength,
744 OUT PUSHORT StringLength OPTIONAL
745 );
746
747 //
748 // Initialization Routines
749 //
750 NTSTATUS
751 NTAPI
752 IopCreateArcNames(
753 IN PLOADER_PARAMETER_BLOCK LoaderBlock
754 );
755
756 NTSTATUS
757 NTAPI
758 IopReassignSystemRoot(
759 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
760 OUT PANSI_STRING NtBootPath
761 );
762
763 BOOLEAN
764 NTAPI
765 IoInitSystem(
766 IN PLOADER_PARAMETER_BLOCK LoaderBlock
767 );
768
769 BOOLEAN
770 NTAPI
771 IopVerifyDiskSignature(
772 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout,
773 IN PARC_DISK_SIGNATURE ArcDiskSignature,
774 OUT PULONG Signature
775 );
776
777 //
778 // Device/Volume Routines
779 //
780 VOID
781 NTAPI
782 IopReadyDeviceObjects(
783 IN PDRIVER_OBJECT Driver
784 );
785
786 NTSTATUS
787 FASTCALL
788 IopInitializeDevice(
789 IN PDEVICE_NODE DeviceNode,
790 IN PDRIVER_OBJECT DriverObject
791 );
792
793 NTSTATUS
794 IopStartDevice(
795 IN PDEVICE_NODE DeviceNode
796 );
797
798 NTSTATUS
799 IopStopDevice(
800 IN PDEVICE_NODE DeviceNode
801 );
802
803 NTSTATUS
804 IopRemoveDevice(
805 IN PDEVICE_NODE DeviceNode
806 );
807
808 PVPB
809 NTAPI
810 IopCheckVpbMounted(
811 IN POPEN_PACKET OpenPacket,
812 IN PDEVICE_OBJECT DeviceObject,
813 IN PUNICODE_STRING RemainingName,
814 OUT PNTSTATUS Status
815 );
816
817 NTSTATUS
818 NTAPI
819 IopMountVolume(
820 IN PDEVICE_OBJECT DeviceObject,
821 IN BOOLEAN AllowRawMount,
822 IN BOOLEAN DeviceIsLocked,
823 IN BOOLEAN Alertable,
824 OUT PVPB *Vpb
825 );
826
827 PVOID
828 IoOpenSymlink(
829 IN PVOID SymbolicLink
830 );
831
832 PVOID
833 IoOpenFileOnDevice(
834 IN PVOID SymbolicLink,
835 IN PWCHAR Name
836 );
837
838 NTSTATUS
839 NTAPI
840 IopCreateVpb(
841 IN PDEVICE_OBJECT DeviceObject
842 );
843
844 VOID
845 NTAPI
846 IopDereferenceVpbAndFree(
847 IN PVPB Vpb
848 );
849
850 VOID
851 NTAPI
852 IoInitFileSystemImplementation(
853 VOID
854 );
855
856 VOID
857 NTAPI
858 IoInitVpbImplementation(
859 VOID
860 );
861
862 NTSTATUS
863 NTAPI
864 IopReferenceDeviceObject(
865 IN PDEVICE_OBJECT DeviceObject
866 );
867
868 VOID
869 NTAPI
870 IopDereferenceDeviceObject(
871 IN PDEVICE_OBJECT DeviceObject,
872 IN BOOLEAN ForceUnload
873 );
874
875 NTSTATUS
876 NTAPI
877 IoGetRelatedTargetDevice(
878 IN PFILE_OBJECT FileObject,
879 OUT PDEVICE_OBJECT *DeviceObject
880 );
881
882 VOID
883 NTAPI
884 IopUnloadDevice(
885 IN PDEVICE_OBJECT DeviceObject
886 );
887
888 //
889 // IRP Routines
890 //
891 NTSTATUS
892 NTAPI
893 IopCleanupFailedIrp(
894 IN PFILE_OBJECT FileObject,
895 IN PKEVENT EventObject,
896 IN PVOID Buffer OPTIONAL
897 );
898
899 VOID
900 NTAPI
901 IopAbortInterruptedIrp(
902 IN PKEVENT EventObject,
903 IN PIRP Irp
904 );
905
906 PIRP
907 NTAPI
908 IopAllocateIrpMustSucceed(
909 IN CCHAR StackSize
910 );
911
912 //
913 // Shutdown routines
914 //
915 VOID
916 IoInitShutdownNotification(
917 VOID
918 );
919
920 VOID
921 NTAPI
922 IoShutdownSystem(
923 IN ULONG Phase
924 );
925
926 VOID
927 NTAPI
928 IopShutdownBaseFileSystems(
929 IN PLIST_ENTRY ListHead
930 );
931
932 //
933 // Boot logging support
934 //
935 VOID
936 IopInitBootLog(
937 IN BOOLEAN StartBootLog
938 );
939
940 VOID
941 IopStartBootLog(
942 VOID
943 );
944
945 VOID
946 IopStopBootLog(
947 VOID
948 );
949
950 VOID
951 IopBootLog(
952 IN PUNICODE_STRING DriverName,
953 IN BOOLEAN Success
954 );
955
956 VOID
957 IopSaveBootLogToFile(
958 VOID
959 );
960
961 //
962 // I/O Cancellation Routines
963 //
964 VOID
965 NTAPI
966 IoCancelThreadIo(
967 IN PETHREAD Thread
968 );
969
970 VOID
971 IoInitCancelHandling(
972 VOID
973 );
974
975 //
976 // I/O Completion
977 //
978 VOID
979 NTAPI
980 IopCompleteRequest(
981 IN PKAPC Apc,
982 IN PKNORMAL_ROUTINE* NormalRoutine,
983 IN PVOID* NormalContext,
984 IN PVOID* SystemArgument1,
985 IN PVOID* SystemArgument2
986 );
987
988 //
989 // Error Logging Routines
990 //
991 VOID
992 NTAPI
993 IopInitErrorLog(
994 VOID
995 );
996
997 VOID
998 NTAPI
999 IopLogWorker(
1000 IN PVOID Parameter
1001 );
1002
1003 //
1004 // Raw File System MiniDriver
1005 //
1006 BOOLEAN
1007 RawFsIsRawFileSystemDeviceObject(
1008 IN PDEVICE_OBJECT DeviceObject
1009 );
1010
1011 NTSTATUS
1012 NTAPI
1013 RawFsDriverEntry(
1014 IN PDRIVER_OBJECT DriverObject,
1015 IN PUNICODE_STRING RegistryPath
1016 );
1017
1018 //
1019 // PnP Root MiniDriver
1020 //
1021 NTSTATUS
1022 NTAPI
1023 PnpRootDriverEntry(
1024 IN PDRIVER_OBJECT DriverObject,
1025 IN PUNICODE_STRING RegistryPath
1026 );
1027
1028 NTSTATUS
1029 PnpRootCreateDevice(
1030 IN PUNICODE_STRING ServiceName,
1031 IN OPTIONAL PDRIVER_OBJECT DriverObject,
1032 OUT PDEVICE_OBJECT *PhysicalDeviceObject,
1033 OUT OPTIONAL PUNICODE_STRING FullInstancePath
1034 );
1035
1036 NTSTATUS
1037 PnpRootRegisterDevice(
1038 IN PDEVICE_OBJECT DeviceObject);
1039
1040 //
1041 // Driver Routines
1042 //
1043 VOID
1044 FASTCALL
1045 IopInitializeBootDrivers(
1046 VOID
1047 );
1048
1049 VOID
1050 FASTCALL
1051 IopInitializeSystemDrivers(
1052 VOID
1053 );
1054
1055 NTSTATUS
1056 NTAPI
1057 IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
1058 IN PDRIVER_INITIALIZE InitializationFunction,
1059 IN PUNICODE_STRING RegistryPath,
1060 PLDR_DATA_TABLE_ENTRY ModuleObject,
1061 OUT PDRIVER_OBJECT *pDriverObject);
1062
1063 VOID
1064 NTAPI
1065 IopDeleteDriver(
1066 IN PVOID ObjectBody
1067 );
1068
1069 NTSTATUS
1070 FASTCALL
1071 IopGetDriverObject(
1072 OUT PDRIVER_OBJECT *DriverObject,
1073 IN PUNICODE_STRING ServiceName,
1074 IN BOOLEAN FileSystem
1075 );
1076
1077 NTSTATUS
1078 FASTCALL
1079 IopLoadServiceModule(
1080 IN PUNICODE_STRING ServiceName,
1081 OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
1082 );
1083
1084 VOID
1085 NTAPI
1086 IopLoadUnloadDriver(
1087 IN OUT PLOAD_UNLOAD_PARAMS LoadParams
1088 );
1089
1090 NTSTATUS
1091 FASTCALL
1092 IopInitializeDriverModule(
1093 IN PDEVICE_NODE DeviceNode,
1094 IN PLDR_DATA_TABLE_ENTRY ModuleObject,
1095 IN PUNICODE_STRING ServiceName,
1096 IN BOOLEAN FileSystemDriver,
1097 OUT PDRIVER_OBJECT *DriverObject
1098 );
1099
1100 NTSTATUS
1101 FASTCALL
1102 IopAttachFilterDrivers(
1103 IN PDEVICE_NODE DeviceNode,
1104 IN BOOLEAN Lower
1105 );
1106
1107 VOID
1108 NTAPI
1109 IopReinitializeDrivers(
1110 VOID
1111 );
1112
1113 VOID
1114 NTAPI
1115 IopReinitializeBootDrivers(
1116 VOID
1117 );
1118
1119 //
1120 // File Routines
1121 //
1122 VOID
1123 NTAPI
1124 IopDeleteDevice(IN PVOID ObjectBody);
1125
1126 NTSTATUS
1127 NTAPI
1128 IopParseDevice(
1129 IN PVOID ParseObject,
1130 IN PVOID ObjectType,
1131 IN OUT PACCESS_STATE AccessState,
1132 IN KPROCESSOR_MODE AccessMode,
1133 IN ULONG Attributes,
1134 IN OUT PUNICODE_STRING CompleteName,
1135 IN OUT PUNICODE_STRING RemainingName,
1136 IN OUT PVOID Context,
1137 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
1138 OUT PVOID *Object
1139 );
1140
1141 NTSTATUS
1142 NTAPI
1143 IopParseFile(
1144 IN PVOID ParseObject,
1145 IN PVOID ObjectType,
1146 IN OUT PACCESS_STATE AccessState,
1147 IN KPROCESSOR_MODE AccessMode,
1148 IN ULONG Attributes,
1149 IN OUT PUNICODE_STRING CompleteName,
1150 IN OUT PUNICODE_STRING RemainingName,
1151 IN OUT PVOID Context OPTIONAL,
1152 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
1153 OUT PVOID *Object
1154 );
1155
1156 VOID
1157 NTAPI
1158 IopDeleteFile(
1159 IN PVOID ObjectBody
1160 );
1161
1162 NTSTATUS
1163 NTAPI
1164 IopSecurityFile(
1165 IN PVOID ObjectBody,
1166 IN SECURITY_OPERATION_CODE OperationCode,
1167 IN PSECURITY_INFORMATION SecurityInformation,
1168 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1169 IN OUT PULONG BufferLength,
1170 OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
1171 IN POOL_TYPE PoolType,
1172 IN OUT PGENERIC_MAPPING GenericMapping
1173 );
1174
1175 NTSTATUS
1176 NTAPI
1177 IopQueryNameFile(
1178 IN PVOID ObjectBody,
1179 IN BOOLEAN HasName,
1180 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
1181 IN ULONG Length,
1182 OUT PULONG ReturnLength,
1183 IN KPROCESSOR_MODE PreviousMode
1184 );
1185
1186 VOID
1187 NTAPI
1188 IopCloseFile(
1189 IN PEPROCESS Process OPTIONAL,
1190 IN PVOID Object,
1191 IN ACCESS_MASK GrantedAccess,
1192 IN ULONG ProcessHandleCount,
1193 IN ULONG SystemHandleCount
1194 );
1195
1196 PVOID
1197 NTAPI
1198 IoGetFileObjectFilterContext(
1199 IN PFILE_OBJECT FileObject
1200 );
1201
1202 NTSTATUS
1203 NTAPI
1204 IoChangeFileObjectFilterContext(
1205 IN PFILE_OBJECT FileObject,
1206 IN PVOID FilterContext,
1207 IN BOOLEAN Define
1208 );
1209
1210 //
1211 // I/O Timer Routines
1212 //
1213 VOID
1214 FASTCALL
1215 IopInitTimerImplementation(
1216 VOID
1217 );
1218
1219 VOID
1220 NTAPI
1221 IopRemoveTimerFromTimerList(
1222 IN PIO_TIMER Timer
1223 );
1224
1225 //
1226 // I/O Completion Routines
1227 //
1228 VOID
1229 NTAPI
1230 IopDeleteIoCompletion(
1231 PVOID ObjectBody
1232 );
1233
1234 //
1235 // Ramdisk Routines
1236 //
1237 NTSTATUS
1238 NTAPI
1239 IopStartRamdisk(
1240 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1241 );
1242
1243 //
1244 // Configuration Routines
1245 //
1246 NTSTATUS
1247 NTAPI
1248 IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList,
1249 IN GUID Guid,
1250 IN ULONG ExpectedInterfaces,
1251 IN PULONG Interfaces
1252 );
1253
1254 VOID
1255 NTAPI
1256 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName,
1257 IN PUNICODE_STRING OsLoaderPathName
1258 );
1259
1260 //
1261 // Global I/O Data
1262 //
1263 extern POBJECT_TYPE IoCompletionType;
1264 extern PDEVICE_NODE IopRootDeviceNode;
1265 extern KSPIN_LOCK IopDeviceTreeLock;
1266 extern ULONG IopTraceLevel;
1267 extern GENERAL_LOOKASIDE IopMdlLookasideList;
1268 extern GENERIC_MAPPING IopCompletionMapping;
1269 extern GENERIC_MAPPING IopFileMapping;
1270 extern POBJECT_TYPE _IoFileObjectType;
1271 extern HAL_DISPATCH _HalDispatchTable;
1272 extern LIST_ENTRY IopErrorLogListHead;
1273 extern ULONG IopNumTriageDumpDataBlocks;
1274 extern PVOID IopTriageDumpDataBlocks[64];
1275 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList;
1276 extern PDRIVER_OBJECT IopRootDriverObject;
1277
1278 //
1279 // Inlined Functions
1280 //
1281 #include "io_x.h"