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