- Sync up Mm interface with WinLdr branch (introduce the concept of a memory type...
[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, ...) DPRINT(__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 // Packet Types when piggybacking on the IRP Overlay
61 //
62 #define IrpCompletionPacket 0x1
63 #define IrpMiniCompletionPacket 0x2
64
65 //
66 // We can call the Ob Inlined API, it's the same thing
67 //
68 #define IopAllocateMdlFromLookaside \
69 ObpAllocateCapturedAttributes
70 #define IopFreeMdlFromLookaside \
71 ObpFreeCapturedAttributes
72
73 //
74 // Returns the size of a CM_RESOURCE_LIST
75 //
76 #define CM_RESOURCE_LIST_SIZE(ResList) \
77 (ResList->Count == 1) ? \
78 FIELD_OFFSET( \
79 CM_RESOURCE_LIST, \
80 List[0].PartialResourceList. \
81 PartialDescriptors[(ResList)-> \
82 List[0]. \
83 PartialResourceList. \
84 Count]) \
85 : \
86 FIELD_OFFSET(CM_RESOURCE_LIST, List)
87
88 //
89 // Determines if the IRP is Synchronous
90 //
91 #define IsIrpSynchronous(Irp, FileObject) \
92 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \
93 (!(FileObject) ? \
94 FALSE : \
95 FileObject->Flags & FO_SYNCHRONOUS_IO)) \
96
97 //
98 // Returns the internal Device Object Extension
99 //
100 #define IoGetDevObjExtension(DeviceObject) \
101 ((PEXTENDED_DEVOBJ_EXTENSION) \
102 (DeviceObject->DeviceObjectExtension)) \
103
104 //
105 // Returns the internal Driver Object Extension
106 //
107 #define IoGetDrvObjExtension(DriverObject) \
108 ((PEXTENDED_DRIVER_EXTENSION) \
109 (DriverObject->DriverExtension)) \
110
111 /*
112 * VOID
113 * IopDeviceNodeSetFlag(
114 * PDEVICE_NODE DeviceNode,
115 * ULONG Flag);
116 */
117 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \
118 ((DeviceNode)->Flags |= (Flag))
119
120 /*
121 * VOID
122 * IopDeviceNodeClearFlag(
123 * PDEVICE_NODE DeviceNode,
124 * ULONG Flag);
125 */
126 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \
127 ((DeviceNode)->Flags &= ~(Flag))
128
129 /*
130 * BOOLEAN
131 * IopDeviceNodeHasFlag(
132 * PDEVICE_NODE DeviceNode,
133 * ULONG Flag);
134 */
135 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \
136 (((DeviceNode)->Flags & (Flag)) > 0)
137
138 /*
139 * VOID
140 * IopDeviceNodeSetUserFlag(
141 * PDEVICE_NODE DeviceNode,
142 * ULONG UserFlag);
143 */
144 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
145 ((DeviceNode)->UserFlags |= (UserFlag))
146
147 /*
148 * VOID
149 * IopDeviceNodeClearUserFlag(
150 * PDEVICE_NODE DeviceNode,
151 * ULONG UserFlag);
152 */
153 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
154 ((DeviceNode)->UserFlags &= ~(UserFlag))
155
156 /*
157 * BOOLEAN
158 * IopDeviceNodeHasUserFlag(
159 * PDEVICE_NODE DeviceNode,
160 * ULONG UserFlag);
161 */
162 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
163 (((DeviceNode)->UserFlags & (UserFlag)) > 0)
164
165 /*
166 * VOID
167 * IopDeviceNodeSetProblem(
168 * PDEVICE_NODE DeviceNode,
169 * ULONG Problem);
170 */
171 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \
172 ((DeviceNode)->Problem |= (Problem))
173
174 /*
175 * VOID
176 * IopDeviceNodeClearProblem(
177 * PDEVICE_NODE DeviceNode,
178 * ULONG Problem);
179 */
180 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \
181 ((DeviceNode)->Problem &= ~(Problem))
182
183 /*
184 * BOOLEAN
185 * IopDeviceNodeHasProblem(
186 * PDEVICE_NODE DeviceNode,
187 * ULONG Problem);
188 */
189 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \
190 (((DeviceNode)->Problem & (Problem)) > 0)
191
192 /*
193 * VOID
194 * IopInitDeviceTreeTraverseContext(
195 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
196 * PDEVICE_NODE DeviceNode,
197 * DEVICETREE_TRAVERSE_ROUTINE Action,
198 * PVOID Context);
199 */
200 #define IopInitDeviceTreeTraverseContext( \
201 _DeviceTreeTraverseContext, _DeviceNode, _Action, \
202 _Context) { \
203 (_DeviceTreeTraverseContext)->FirstDeviceNode = \
204 (_DeviceNode); \
205 (_DeviceTreeTraverseContext)->Action = (_Action); \
206 (_DeviceTreeTraverseContext)->Context = (_Context); }
207
208 //
209 // Device List Operations
210 //
211 typedef enum _IOP_DEVICE_LIST_OPERATION
212 {
213 IopRemove,
214 IopAdd
215 } IOP_DEVICE_LIST_OPERATION, *PIOP_DEVICE_LIST_OPERATION;
216
217 //
218 // Transfer statistics
219 //
220 typedef enum _IOP_TRANSFER_TYPE
221 {
222 IopReadTransfer,
223 IopWriteTransfer,
224 IopOtherTransfer
225 } IOP_TRANSFER_TYPE, *PIOP_TRANSFER_TYPE;
226
227 //
228 // Special version of the IRP Overlay used to optimize I/O completion
229 // by not using up a separate structure.
230 //
231 typedef struct _IO_COMPLETION_PACKET
232 {
233 struct
234 {
235 LIST_ENTRY ListEntry;
236 union
237 {
238 struct _IO_STACK_LOCATION *CurrentStackLocation;
239 ULONG PacketType;
240 };
241 };
242 PVOID Key;
243 PVOID Context;
244 IO_STATUS_BLOCK IoStatus;
245 } IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET;
246
247 //
248 // I/O Completion Context for IoSetIoCompletionRoutineEx
249 //
250 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT
251 {
252 PDEVICE_OBJECT DeviceObject;
253 PVOID Context;
254 PIO_COMPLETION_ROUTINE CompletionRoutine;
255 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT;
256
257 //
258 // I/O Wrapper around the Executive Work Item
259 //
260 typedef struct _IO_WORKITEM
261 {
262 WORK_QUEUE_ITEM Item;
263 PDEVICE_OBJECT DeviceObject;
264 PIO_WORKITEM_ROUTINE WorkerRoutine;
265 PVOID Context;
266 } IO_WORKITEM, *PIO_WORKITEM;
267
268 //
269 // I/O Wrapper around the Kernel Interrupt
270 //
271 typedef struct _IO_INTERRUPT
272 {
273 KINTERRUPT FirstInterrupt;
274 PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS];
275 KSPIN_LOCK SpinLock;
276 } IO_INTERRUPT, *PIO_INTERRUPT;
277
278 //
279 // I/O Error Log Packet Header
280 //
281 typedef struct _ERROR_LOG_ENTRY
282 {
283 CSHORT Type;
284 CSHORT Size;
285 LIST_ENTRY ListEntry;
286 PDEVICE_OBJECT DeviceObject;
287 PDRIVER_OBJECT DriverObject;
288 LARGE_INTEGER TimeStamp;
289 } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
290
291 //
292 // Event Log LPC Message
293 //
294 typedef struct _ELF_API_MSG
295 {
296 PORT_MESSAGE h;
297 ULONG Unknown[2];
298 IO_ERROR_LOG_MESSAGE IoErrorMessage;
299 } ELF_API_MSG, *PELF_API_MSG;
300
301 //
302 // To simplify matters, the kernel is made to support both the checked and free
303 // version of the I/O Remove Lock in the same binary. This structure includes
304 // both, since the DDK has the structure with a compile-time #ifdef.
305 //
306 typedef struct _EXTENDED_IO_REMOVE_LOCK
307 {
308 IO_REMOVE_LOCK_COMMON_BLOCK Common;
309 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
310 } EXTENDED_IO_REMOVE_LOCK, *PEXTENDED_IO_REMOVE_LOCK;
311
312 //
313 // Dummy File Object used inside the Open Packet so that OB knows how to
314 // deal with the Object Pointer even though it's not a real file.
315 //
316 typedef struct _DUMMY_FILE_OBJECT
317 {
318 OBJECT_HEADER ObjectHeader;
319 CHAR FileObjectBody[sizeof(FILE_OBJECT)];
320 } DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT;
321
322 //
323 // Open packet used as a context for Device/File parsing so that the parse
324 // routine can know what operation is being requested.
325 //
326 typedef struct _OPEN_PACKET
327 {
328 CSHORT Type;
329 CSHORT Size;
330 PFILE_OBJECT FileObject;
331 NTSTATUS FinalStatus;
332 ULONG_PTR Information;
333 ULONG ParseCheck;
334 PFILE_OBJECT RelatedFileObject;
335 OBJECT_ATTRIBUTES OriginalAttributes;
336 LARGE_INTEGER AllocationSize;
337 ULONG CreateOptions;
338 USHORT FileAttributes;
339 USHORT ShareAccess;
340 PVOID EaBuffer;
341 ULONG EaLength;
342 ULONG Options;
343 ULONG Disposition;
344 PFILE_BASIC_INFORMATION BasicInformation;
345 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation;
346 CREATE_FILE_TYPE CreateFileType;
347 PVOID MailslotOrPipeParameters;
348 BOOLEAN Override;
349 BOOLEAN QueryOnly;
350 BOOLEAN DeleteOnly;
351 BOOLEAN FullAttributes;
352 PDUMMY_FILE_OBJECT DummyFileObject;
353 ULONG InternalFlags;
354 //PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update
355 } OPEN_PACKET, *POPEN_PACKET;
356
357 //
358 // Parameters packet for Load/Unload work item's context
359 //
360 typedef struct _LOAD_UNLOAD_PARAMS
361 {
362 NTSTATUS Status;
363 PUNICODE_STRING ServiceName;
364 WORK_QUEUE_ITEM WorkItem;
365 KEVENT Event;
366 PDRIVER_OBJECT DriverObject;
367 } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS;
368
369 //
370 // List of Bus Type GUIDs
371 //
372 typedef struct _IO_BUS_TYPE_GUID_LIST
373 {
374 ULONG GuidCount;
375 FAST_MUTEX Lock;
376 GUID Guids[1];
377 } IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST;
378 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList;
379
380 //
381 // Shutdown entry for registed devices
382 //
383 typedef struct _SHUTDOWN_ENTRY
384 {
385 LIST_ENTRY ShutdownList;
386 PDEVICE_OBJECT DeviceObject;
387 } SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY;
388
389 //
390 // F/S Notification entry for registered File Systems
391 //
392 typedef struct _FS_CHANGE_NOTIFY_ENTRY
393 {
394 LIST_ENTRY FsChangeNotifyList;
395 PDRIVER_OBJECT DriverObject;
396 PDRIVER_FS_NOTIFICATION FSDNotificationProc;
397 } FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY;
398
399 //
400 // Driver (Boot) Re-Initialization Entry
401 //
402 typedef struct _DRIVER_REINIT_ITEM
403 {
404 LIST_ENTRY ItemEntry;
405 PDRIVER_OBJECT DriverObject;
406 PDRIVER_REINITIALIZE ReinitRoutine;
407 PVOID Context;
408 } DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
409
410 //
411 // Called on every visit of a node during a preorder-traversal of the device
412 // node tree.
413 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
414 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
415 // Any other returned status code will be returned to the caller. If a status
416 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
417 // the traversal is stopped immediately and the status code is returned to
418 // the caller.
419 //
420 typedef
421 NTSTATUS
422 (*DEVICETREE_TRAVERSE_ROUTINE)(
423 IN PDEVICE_NODE DeviceNode,
424 IN PVOID Context
425 );
426
427 //
428 // Context information for traversing the device tree
429 //
430 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
431 {
432 //
433 // Current device node during a traversal
434 //
435 PDEVICE_NODE DeviceNode;
436
437 //
438 // Initial device node where we start the traversal
439 //
440 PDEVICE_NODE FirstDeviceNode;
441
442 //
443 // Action routine to be called for every device node
444 //
445 DEVICETREE_TRAVERSE_ROUTINE Action;
446
447 //
448 // Context passed to the action routine
449 //
450 PVOID Context;
451 } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
452
453 //
454 // PNP Routines
455 //
456 VOID
457 PnpInit(
458 VOID
459 );
460
461 BOOLEAN
462 NTAPI
463 PpInitSystem(
464 VOID
465 );
466
467 VOID
468 PnpInit2(
469 VOID
470 );
471
472 VOID
473 IopInitDriverImplementation(
474 VOID
475 );
476
477 VOID
478 IopInitPnpNotificationImplementation(
479 VOID
480 );
481
482 VOID
483 IopNotifyPlugPlayNotification(
484 IN PDEVICE_OBJECT DeviceObject,
485 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
486 IN LPCGUID Event,
487 IN PVOID EventCategoryData1,
488 IN PVOID EventCategoryData2
489 );
490
491 NTSTATUS
492 IopGetSystemPowerDeviceObject(
493 IN PDEVICE_OBJECT *DeviceObject
494 );
495
496 NTSTATUS
497 IopCreateDeviceNode(
498 IN PDEVICE_NODE ParentNode,
499 IN PDEVICE_OBJECT PhysicalDeviceObject,
500 IN PUNICODE_STRING ServiceName,
501 OUT PDEVICE_NODE *DeviceNode
502 );
503
504 NTSTATUS
505 IopFreeDeviceNode(
506 IN PDEVICE_NODE DeviceNode
507 );
508
509 NTSTATUS
510 IopInitiatePnpIrp(
511 IN PDEVICE_OBJECT DeviceObject,
512 IN PIO_STATUS_BLOCK IoStatusBlock,
513 IN ULONG MinorFunction,
514 IN PIO_STACK_LOCATION Stack
515 );
516
517 PDEVICE_NODE
518 FASTCALL
519 IopGetDeviceNode(
520 IN PDEVICE_OBJECT DeviceObject
521 );
522
523 NTSTATUS
524 IopActionConfigureChildServices(
525 IN PDEVICE_NODE DeviceNode,
526 IN PVOID Context
527 );
528
529 NTSTATUS
530 IopActionInitChildServices(
531 IN PDEVICE_NODE DeviceNode,
532 IN PVOID Context,
533 IN BOOLEAN BootDrivers
534 );
535
536 NTSTATUS
537 IoCreateDriverList(
538 VOID
539 );
540
541 NTSTATUS
542 IoDestroyDriverList(
543 VOID
544 );
545
546 NTSTATUS
547 INIT_FUNCTION
548 IopInitPlugPlayEvents(VOID);
549
550 NTSTATUS
551 IopQueueTargetDeviceEvent(
552 const GUID *Guid,
553 PUNICODE_STRING DeviceIds
554 );
555
556 NTSTATUS
557 IopInitializePnpServices(
558 IN PDEVICE_NODE DeviceNode,
559 IN BOOLEAN BootDrivers);
560
561 NTSTATUS
562 IopOpenRegistryKeyEx(
563 PHANDLE KeyHandle,
564 HANDLE ParentKey,
565 PUNICODE_STRING Name,
566 ACCESS_MASK DesiredAccess);
567
568 //
569 // Initialization Routines
570 //
571 NTSTATUS
572 NTAPI
573 IopCreateArcNames(
574 IN PLOADER_PARAMETER_BLOCK LoaderBlock
575 );
576
577 NTSTATUS
578 NTAPI
579 IopReassignSystemRoot(
580 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
581 OUT PANSI_STRING NtBootPath
582 );
583
584 BOOLEAN
585 NTAPI
586 IoInitSystem(
587 IN PLOADER_PARAMETER_BLOCK LoaderBlock
588 );
589
590 //
591 // Device/Volume Routines
592 //
593 NTSTATUS
594 FASTCALL
595 IopInitializeDevice(
596 IN PDEVICE_NODE DeviceNode,
597 IN PDRIVER_OBJECT DriverObject
598 );
599
600 NTSTATUS
601 IopStartDevice(
602 IN PDEVICE_NODE DeviceNode
603 );
604
605 PVPB
606 NTAPI
607 IopCheckVpbMounted(
608 IN POPEN_PACKET OpenPacket,
609 IN PDEVICE_OBJECT DeviceObject,
610 IN PUNICODE_STRING RemainingName,
611 OUT PNTSTATUS Status
612 );
613
614 NTSTATUS
615 NTAPI
616 IopMountVolume(
617 IN PDEVICE_OBJECT DeviceObject,
618 IN BOOLEAN AllowRawMount,
619 IN BOOLEAN DeviceIsLocked,
620 IN BOOLEAN Alertable,
621 OUT PVPB *Vpb
622 );
623
624 PVOID
625 IoOpenSymlink(
626 IN PVOID SymbolicLink
627 );
628
629 PVOID
630 IoOpenFileOnDevice(
631 IN PVOID SymbolicLink,
632 IN PWCHAR Name
633 );
634
635 NTSTATUS
636 NTAPI
637 IopCreateVpb(
638 IN PDEVICE_OBJECT DeviceObject
639 );
640
641 VOID
642 NTAPI
643 IopDereferenceVpb(
644 IN PVPB Vpb
645 );
646
647 VOID
648 NTAPI
649 IoInitFileSystemImplementation(
650 VOID
651 );
652
653 VOID
654 NTAPI
655 IoInitVpbImplementation(
656 VOID
657 );
658
659 NTSTATUS
660 NTAPI
661 IopReferenceDeviceObject(
662 IN PDEVICE_OBJECT DeviceObject
663 );
664
665 VOID
666 NTAPI
667 IopDereferenceDeviceObject(
668 IN PDEVICE_OBJECT DeviceObject,
669 IN BOOLEAN ForceUnload
670 );
671
672 //
673 // IRP Routines
674 //
675 NTSTATUS
676 NTAPI
677 IopCleanupFailedIrp(
678 IN PFILE_OBJECT FileObject,
679 IN PKEVENT EventObject,
680 IN PVOID Buffer OPTIONAL
681 );
682
683 VOID
684 NTAPI
685 IopAbortInterruptedIrp(
686 IN PKEVENT EventObject,
687 IN PIRP Irp
688 );
689
690 //
691 // Shutdown routines
692 //
693 VOID
694 IoInitShutdownNotification(
695 VOID
696 );
697
698 VOID
699 NTAPI
700 IoShutdownRegisteredDevices(
701 VOID
702 );
703
704 VOID
705 NTAPI
706 IoShutdownRegisteredFileSystems(
707 VOID
708 );
709
710 //
711 // Boot logging support
712 //
713 VOID
714 IopInitBootLog(
715 IN BOOLEAN StartBootLog
716 );
717
718 VOID
719 IopStartBootLog(
720 VOID
721 );
722
723 VOID
724 IopStopBootLog(
725 VOID
726 );
727
728 VOID
729 IopBootLog(
730 IN PUNICODE_STRING DriverName,
731 IN BOOLEAN Success
732 );
733
734 VOID
735 IopSaveBootLogToFile(
736 VOID
737 );
738
739 //
740 // I/O Cancellation Routines
741 //
742 VOID
743 NTAPI
744 IoCancelThreadIo(
745 IN PETHREAD Thread
746 );
747
748 VOID
749 IoInitCancelHandling(
750 VOID
751 );
752
753 //
754 // I/O Completion
755 //
756 VOID
757 NTAPI
758 IopCompleteRequest(
759 IN PKAPC Apc,
760 IN PKNORMAL_ROUTINE* NormalRoutine,
761 IN PVOID* NormalContext,
762 IN PVOID* SystemArgument1,
763 IN PVOID* SystemArgument2
764 );
765
766 //
767 // Error Logging Routines
768 //
769 VOID
770 NTAPI
771 IopInitErrorLog(
772 VOID
773 );
774
775 VOID
776 NTAPI
777 IopLogWorker(
778 IN PVOID Parameter
779 );
780
781 //
782 // Raw File System MiniDriver
783 //
784 BOOLEAN
785 RawFsIsRawFileSystemDeviceObject(
786 IN PDEVICE_OBJECT DeviceObject
787 );
788
789 NTSTATUS
790 NTAPI
791 RawFsDriverEntry(
792 IN PDRIVER_OBJECT DriverObject,
793 IN PUNICODE_STRING RegistryPath
794 );
795
796 //
797 // PnP Root MiniDriver
798 //
799 NTSTATUS
800 NTAPI
801 PnpRootDriverEntry(
802 IN PDRIVER_OBJECT DriverObject,
803 IN PUNICODE_STRING RegistryPath
804 );
805
806 NTSTATUS
807 PnpRootCreateDevice(
808 IN PUNICODE_STRING ServiceName,
809 IN OUT PDEVICE_OBJECT *PhysicalDeviceObject
810 );
811
812 //
813 // Driver Routines
814 //
815 VOID
816 FASTCALL
817 IopInitializeBootDrivers(
818 VOID
819 );
820
821 VOID
822 FASTCALL
823 IopInitializeSystemDrivers(
824 VOID
825 );
826
827 NTSTATUS
828 NTAPI
829 IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
830 IN PDRIVER_INITIALIZE InitializationFunction,
831 IN PUNICODE_STRING RegistryPath,
832 IN PVOID DllBase,
833 IN ULONG SizeOfImage,
834 OUT PDRIVER_OBJECT *pDriverObject);
835
836 VOID
837 NTAPI
838 IopDeleteDriver(
839 IN PVOID ObjectBody
840 );
841
842 NTSTATUS
843 FASTCALL
844 IopGetDriverObject(
845 OUT PDRIVER_OBJECT *DriverObject,
846 IN PUNICODE_STRING ServiceName,
847 IN BOOLEAN FileSystem
848 );
849
850 NTSTATUS
851 FASTCALL
852 IopLoadServiceModule(
853 IN PUNICODE_STRING ServiceName,
854 OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
855 );
856
857 VOID
858 NTAPI
859 IopLoadUnloadDriver(
860 IN OUT PLOAD_UNLOAD_PARAMS LoadParams
861 );
862
863 NTSTATUS
864 FASTCALL
865 IopInitializeDriverModule(
866 IN PDEVICE_NODE DeviceNode,
867 IN PLDR_DATA_TABLE_ENTRY ModuleObject,
868 IN PUNICODE_STRING ServiceName,
869 IN BOOLEAN FileSystemDriver,
870 OUT PDRIVER_OBJECT *DriverObject
871 );
872
873 NTSTATUS
874 FASTCALL
875 IopAttachFilterDrivers(
876 IN PDEVICE_NODE DeviceNode,
877 IN BOOLEAN Lower
878 );
879
880 VOID
881 NTAPI
882 IopReinitializeDrivers(
883 VOID
884 );
885
886 VOID
887 NTAPI
888 IopReinitializeBootDrivers(
889 VOID
890 );
891
892 //
893 // File Routines
894 //
895 NTSTATUS
896 NTAPI
897 IopParseDevice(
898 IN PVOID ParseObject,
899 IN PVOID ObjectType,
900 IN OUT PACCESS_STATE AccessState,
901 IN KPROCESSOR_MODE AccessMode,
902 IN ULONG Attributes,
903 IN OUT PUNICODE_STRING CompleteName,
904 IN OUT PUNICODE_STRING RemainingName,
905 IN OUT PVOID Context OPTIONAL,
906 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
907 OUT PVOID *Object
908 );
909
910 NTSTATUS
911 NTAPI
912 IopParseFile(
913 IN PVOID ParseObject,
914 IN PVOID ObjectType,
915 IN OUT PACCESS_STATE AccessState,
916 IN KPROCESSOR_MODE AccessMode,
917 IN ULONG Attributes,
918 IN OUT PUNICODE_STRING CompleteName,
919 IN OUT PUNICODE_STRING RemainingName,
920 IN OUT PVOID Context OPTIONAL,
921 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
922 OUT PVOID *Object
923 );
924
925 VOID
926 NTAPI
927 IopDeleteFile(
928 IN PVOID ObjectBody
929 );
930
931 NTSTATUS
932 NTAPI
933 IopSecurityFile(
934 IN PVOID ObjectBody,
935 IN SECURITY_OPERATION_CODE OperationCode,
936 IN PSECURITY_INFORMATION SecurityInformation,
937 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
938 IN OUT PULONG BufferLength,
939 OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
940 IN POOL_TYPE PoolType,
941 IN OUT PGENERIC_MAPPING GenericMapping
942 );
943
944 NTSTATUS
945 NTAPI
946 IopQueryNameFile(
947 IN PVOID ObjectBody,
948 IN BOOLEAN HasName,
949 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
950 IN ULONG Length,
951 OUT PULONG ReturnLength,
952 IN KPROCESSOR_MODE PreviousMode
953 );
954
955 VOID
956 NTAPI
957 IopCloseFile(
958 IN PEPROCESS Process OPTIONAL,
959 IN PVOID Object,
960 IN ACCESS_MASK GrantedAccess,
961 IN ULONG ProcessHandleCount,
962 IN ULONG SystemHandleCount
963 );
964
965 //
966 // I/O Timer Routines
967 //
968 VOID
969 FASTCALL
970 IopInitTimerImplementation(
971 VOID
972 );
973
974 VOID
975 NTAPI
976 IopRemoveTimerFromTimerList(
977 IN PIO_TIMER Timer
978 );
979
980 //
981 // I/O Completion Routines
982 //
983 VOID
984 NTAPI
985 IopDeleteIoCompletion(
986 PVOID ObjectBody
987 );
988
989 //
990 // Global I/O Data
991 //
992 extern POBJECT_TYPE IoCompletionType;
993 extern PDEVICE_NODE IopRootDeviceNode;
994 extern ULONG IopTraceLevel;
995 extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
996 extern GENERIC_MAPPING IopCompletionMapping;
997 extern GENERIC_MAPPING IopFileMapping;
998 extern POBJECT_TYPE _IoFileObjectType;
999 extern HAL_DISPATCH _HalDispatchTable;
1000 extern LIST_ENTRY IopErrorLogListHead;
1001
1002 //
1003 // Inlined Functions
1004 //
1005 #include "io_x.h"