Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenio.h
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Kernel 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: ntoskrnl/include/io.h 00005 * PURPOSE: Internal header for the I/O Manager 00006 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 00007 */ 00008 #include "ntdddisk.h" 00009 00010 // 00011 // Define this if you want debugging support 00012 // 00013 #define _IO_DEBUG_ 0x01 00014 00015 // 00016 // These define the Debug Masks Supported 00017 // 00018 #define IO_IRP_DEBUG 0x01 00019 #define IO_FILE_DEBUG 0x02 00020 #define IO_API_DEBUG 0x04 00021 #define IO_CTL_DEBUG 0x08 00022 00023 // 00024 // Debug/Tracing support 00025 // 00026 #if _IO_DEBUG_ 00027 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented 00028 #define IOTRACE(x, ...) \ 00029 { \ 00030 DbgPrintEx("%s [%.16s] - ", \ 00031 __FUNCTION__, \ 00032 PsGetCurrentProcess()->ImageFileName); \ 00033 DbgPrintEx(__VA_ARGS__); \ 00034 } 00035 #else 00036 #define IOTRACE(x, ...) \ 00037 if (x & IopTraceLevel) \ 00038 { \ 00039 DbgPrint("%s [%.16s] - ", \ 00040 __FUNCTION__, \ 00041 PsGetCurrentProcess()->ImageFileName); \ 00042 DbgPrint(__VA_ARGS__); \ 00043 } 00044 #endif 00045 #else 00046 #define IOTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__) 00047 #endif 00048 00049 // 00050 // Registry path to the enumeration root key 00051 // 00052 #define ENUM_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum" 00053 00054 // 00055 // Returns the type of METHOD_ used in this IOCTL 00056 // 00057 #define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003) 00058 00059 // 00060 // Bugcheck codes for RAM disk booting 00061 // 00062 // 00063 // No LoaderXIPRom descriptor was found in the loader memory list 00064 // 00065 #define RD_NO_XIPROM_DESCRIPTOR 1 00066 // 00067 // Unable to open the RAM disk driver (ramdisk.sys or \Device\Ramdisk) 00068 // 00069 #define RD_NO_RAMDISK_DRIVER 2 00070 // 00071 // FSCTL_CREATE_RAM_DISK failed 00072 // 00073 #define RD_FSCTL_FAILED 3 00074 // 00075 // Unable to create GUID string from binary GUID 00076 // 00077 #define RD_GUID_CONVERT_FAILED 4 00078 // 00079 // Unable to create symbolic link pointing to the RAM disk device 00080 // 00081 #define RD_SYMLINK_CREATE_FAILED 5 00082 00083 // 00084 // We can call the Ob Inlined API, it's the same thing 00085 // 00086 #define IopAllocateMdlFromLookaside \ 00087 ObpAllocateObjectCreateInfoBuffer 00088 #define IopFreeMdlFromLookaside \ 00089 ObpFreeCapturedAttributes 00090 00091 // 00092 // Determines if the IRP is Synchronous 00093 // 00094 #define IsIrpSynchronous(Irp, FileObject) \ 00095 ((Irp->Flags & IRP_SYNCHRONOUS_API) || \ 00096 (!(FileObject) ? \ 00097 FALSE : \ 00098 FileObject->Flags & FO_SYNCHRONOUS_IO)) \ 00099 00100 // 00101 // Returns the internal Device Object Extension 00102 // 00103 #define IoGetDevObjExtension(DeviceObject) \ 00104 ((PEXTENDED_DEVOBJ_EXTENSION) \ 00105 (DeviceObject->DeviceObjectExtension)) \ 00106 00107 // 00108 // Returns the internal Driver Object Extension 00109 // 00110 #define IoGetDrvObjExtension(DriverObject) \ 00111 ((PEXTENDED_DRIVER_EXTENSION) \ 00112 (DriverObject->DriverExtension)) \ 00113 00114 /* 00115 * VOID 00116 * IopDeviceNodeSetFlag( 00117 * PDEVICE_NODE DeviceNode, 00118 * ULONG Flag); 00119 */ 00120 #define IopDeviceNodeSetFlag(DeviceNode, Flag) \ 00121 ((DeviceNode)->Flags |= (Flag)) 00122 00123 /* 00124 * VOID 00125 * IopDeviceNodeClearFlag( 00126 * PDEVICE_NODE DeviceNode, 00127 * ULONG Flag); 00128 */ 00129 #define IopDeviceNodeClearFlag(DeviceNode, Flag) \ 00130 ((DeviceNode)->Flags &= ~(Flag)) 00131 00132 /* 00133 * BOOLEAN 00134 * IopDeviceNodeHasFlag( 00135 * PDEVICE_NODE DeviceNode, 00136 * ULONG Flag); 00137 */ 00138 #define IopDeviceNodeHasFlag(DeviceNode, Flag) \ 00139 (((DeviceNode)->Flags & (Flag)) > 0) 00140 00141 /* 00142 * VOID 00143 * IopDeviceNodeSetUserFlag( 00144 * PDEVICE_NODE DeviceNode, 00145 * ULONG UserFlag); 00146 */ 00147 #define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \ 00148 ((DeviceNode)->UserFlags |= (UserFlag)) 00149 00150 /* 00151 * VOID 00152 * IopDeviceNodeClearUserFlag( 00153 * PDEVICE_NODE DeviceNode, 00154 * ULONG UserFlag); 00155 */ 00156 #define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\ 00157 ((DeviceNode)->UserFlags &= ~(UserFlag)) 00158 00159 /* 00160 * BOOLEAN 00161 * IopDeviceNodeHasUserFlag( 00162 * PDEVICE_NODE DeviceNode, 00163 * ULONG UserFlag); 00164 */ 00165 #define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \ 00166 (((DeviceNode)->UserFlags & (UserFlag)) > 0) 00167 00168 /* 00169 * VOID 00170 * IopDeviceNodeSetProblem( 00171 * PDEVICE_NODE DeviceNode, 00172 * ULONG Problem); 00173 */ 00174 #define IopDeviceNodeSetProblem(DeviceNode, Problem) \ 00175 ((DeviceNode)->Problem |= (Problem)) 00176 00177 /* 00178 * VOID 00179 * IopDeviceNodeClearProblem( 00180 * PDEVICE_NODE DeviceNode, 00181 * ULONG Problem); 00182 */ 00183 #define IopDeviceNodeClearProblem(DeviceNode, Problem) \ 00184 ((DeviceNode)->Problem &= ~(Problem)) 00185 00186 /* 00187 * BOOLEAN 00188 * IopDeviceNodeHasProblem( 00189 * PDEVICE_NODE DeviceNode, 00190 * ULONG Problem); 00191 */ 00192 #define IopDeviceNodeHasProblem(DeviceNode, Problem) \ 00193 (((DeviceNode)->Problem & (Problem)) > 0) 00194 00195 /* 00196 * VOID 00197 * IopInitDeviceTreeTraverseContext( 00198 * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext, 00199 * PDEVICE_NODE DeviceNode, 00200 * DEVICETREE_TRAVERSE_ROUTINE Action, 00201 * PVOID Context); 00202 */ 00203 #define IopInitDeviceTreeTraverseContext( \ 00204 _DeviceTreeTraverseContext, _DeviceNode, _Action, \ 00205 _Context) { \ 00206 (_DeviceTreeTraverseContext)->FirstDeviceNode = \ 00207 (_DeviceNode); \ 00208 (_DeviceTreeTraverseContext)->Action = (_Action); \ 00209 (_DeviceTreeTraverseContext)->Context = (_Context); } 00210 00211 /* 00212 * BOOLEAN 00213 * IopIsValidPhysicalDeviceObject( 00214 * IN PDEVICE_OBJECT PhysicalDeviceObject); 00215 */ 00216 #define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \ 00217 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \ 00218 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \ 00219 (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED)) 00220 00221 // 00222 // Device List Operations 00223 // 00224 typedef enum _IOP_DEVICE_LIST_OPERATION 00225 { 00226 IopRemove, 00227 IopAdd 00228 } IOP_DEVICE_LIST_OPERATION, *PIOP_DEVICE_LIST_OPERATION; 00229 00230 // 00231 // Transfer statistics 00232 // 00233 typedef enum _IOP_TRANSFER_TYPE 00234 { 00235 IopReadTransfer, 00236 IopWriteTransfer, 00237 IopOtherTransfer 00238 } IOP_TRANSFER_TYPE, *PIOP_TRANSFER_TYPE; 00239 00240 // 00241 // Packet Types when piggybacking on the IRP Overlay 00242 // 00243 typedef enum _COMPLETION_PACKET_TYPE 00244 { 00245 IopCompletionPacketIrp, 00246 IopCompletionPacketMini, 00247 IopCompletionPacketQuota 00248 } COMPLETION_PACKET_TYPE, *PCOMPLETION_PACKET_TYPE; 00249 00250 // 00251 // Special version of the IRP Overlay used to optimize I/O completion 00252 // by not using up a separate structure. 00253 // 00254 typedef struct _IOP_MINI_COMPLETION_PACKET 00255 { 00256 struct 00257 { 00258 LIST_ENTRY ListEntry; 00259 union 00260 { 00261 struct _IO_STACK_LOCATION *CurrentStackLocation; 00262 ULONG PacketType; 00263 }; 00264 }; 00265 PVOID KeyContext; 00266 PVOID ApcContext; 00267 NTSTATUS IoStatus; 00268 ULONG_PTR IoStatusInformation; 00269 } IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET; 00270 00271 // 00272 // I/O Completion Context for IoSetIoCompletionRoutineEx 00273 // 00274 typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT 00275 { 00276 PDEVICE_OBJECT DeviceObject; 00277 PVOID Context; 00278 PIO_COMPLETION_ROUTINE CompletionRoutine; 00279 } IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT; 00280 00281 // 00282 // I/O Wrapper around the Executive Work Item 00283 // 00284 typedef struct _IO_WORKITEM 00285 { 00286 WORK_QUEUE_ITEM Item; 00287 PDEVICE_OBJECT DeviceObject; 00288 PIO_WORKITEM_ROUTINE WorkerRoutine; 00289 PVOID Context; 00290 } IO_WORKITEM; 00291 00292 // 00293 // I/O Wrapper around the Kernel Interrupt 00294 // 00295 typedef struct _IO_INTERRUPT 00296 { 00297 KINTERRUPT FirstInterrupt; 00298 PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS]; 00299 KSPIN_LOCK SpinLock; 00300 } IO_INTERRUPT, *PIO_INTERRUPT; 00301 00302 // 00303 // I/O Error Log Packet Header 00304 // 00305 typedef struct _ERROR_LOG_ENTRY 00306 { 00307 CSHORT Type; 00308 CSHORT Size; 00309 LIST_ENTRY ListEntry; 00310 PDEVICE_OBJECT DeviceObject; 00311 PDRIVER_OBJECT DriverObject; 00312 LARGE_INTEGER TimeStamp; 00313 } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY; 00314 00315 // 00316 // Event Log LPC Message 00317 // 00318 typedef struct _ELF_API_MSG 00319 { 00320 PORT_MESSAGE h; 00321 ULONG Unknown[2]; 00322 IO_ERROR_LOG_MESSAGE IoErrorMessage; 00323 } ELF_API_MSG, *PELF_API_MSG; 00324 00325 // 00326 // To simplify matters, the kernel is made to support both the checked and free 00327 // version of the I/O Remove Lock in the same binary. This structure includes 00328 // both, since the DDK has the structure with a compile-time #ifdef. 00329 // 00330 typedef struct _EXTENDED_IO_REMOVE_LOCK 00331 { 00332 IO_REMOVE_LOCK_COMMON_BLOCK Common; 00333 IO_REMOVE_LOCK_DBG_BLOCK Dbg; 00334 } EXTENDED_IO_REMOVE_LOCK, *PEXTENDED_IO_REMOVE_LOCK; 00335 00336 // 00337 // Dummy File Object used inside the Open Packet so that OB knows how to 00338 // deal with the Object Pointer even though it's not a real file. 00339 // 00340 typedef struct _DUMMY_FILE_OBJECT 00341 { 00342 OBJECT_HEADER ObjectHeader; 00343 CHAR FileObjectBody[sizeof(FILE_OBJECT)]; 00344 } DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT; 00345 00346 // 00347 // Open packet used as a context for Device/File parsing so that the parse 00348 // routine can know what operation is being requested. 00349 // 00350 typedef struct _OPEN_PACKET 00351 { 00352 CSHORT Type; 00353 CSHORT Size; 00354 PFILE_OBJECT FileObject; 00355 NTSTATUS FinalStatus; 00356 ULONG_PTR Information; 00357 ULONG ParseCheck; 00358 PFILE_OBJECT RelatedFileObject; 00359 OBJECT_ATTRIBUTES OriginalAttributes; 00360 LARGE_INTEGER AllocationSize; 00361 ULONG CreateOptions; 00362 USHORT FileAttributes; 00363 USHORT ShareAccess; 00364 PVOID EaBuffer; 00365 ULONG EaLength; 00366 ULONG Options; 00367 ULONG Disposition; 00368 PFILE_BASIC_INFORMATION BasicInformation; 00369 PFILE_NETWORK_OPEN_INFORMATION NetworkInformation; 00370 CREATE_FILE_TYPE CreateFileType; 00371 PVOID MailslotOrPipeParameters; 00372 BOOLEAN Override; 00373 BOOLEAN QueryOnly; 00374 BOOLEAN DeleteOnly; 00375 BOOLEAN FullAttributes; 00376 PDUMMY_FILE_OBJECT DummyFileObject; 00377 ULONG InternalFlags; 00378 //PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update 00379 } OPEN_PACKET, *POPEN_PACKET; 00380 00381 // 00382 // Parameters packet for Load/Unload work item's context 00383 // 00384 typedef struct _LOAD_UNLOAD_PARAMS 00385 { 00386 NTSTATUS Status; 00387 PUNICODE_STRING ServiceName; 00388 WORK_QUEUE_ITEM WorkItem; 00389 KEVENT Event; 00390 PDRIVER_OBJECT DriverObject; 00391 } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS; 00392 00393 // 00394 // Boot Driver List Entry 00395 // 00396 typedef struct _DRIVER_INFORMATION 00397 { 00398 LIST_ENTRY Link; 00399 PDRIVER_OBJECT DriverObject; 00400 PBOOT_DRIVER_LIST_ENTRY DataTableEntry; 00401 HANDLE ServiceHandle; 00402 USHORT TagPosition; 00403 ULONG Failed; 00404 ULONG Processed; 00405 NTSTATUS Status; 00406 } DRIVER_INFORMATION, *PDRIVER_INFORMATION; 00407 00408 // 00409 // Boot Driver Node 00410 // 00411 typedef struct _BOOT_DRIVER_NODE 00412 { 00413 BOOT_DRIVER_LIST_ENTRY ListEntry; 00414 UNICODE_STRING Group; 00415 UNICODE_STRING Name; 00416 ULONG Tag; 00417 ULONG ErrorControl; 00418 } BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE; 00419 00420 // 00421 // List of Bus Type GUIDs 00422 // 00423 typedef struct _IO_BUS_TYPE_GUID_LIST 00424 { 00425 ULONG GuidCount; 00426 FAST_MUTEX Lock; 00427 GUID Guids[1]; 00428 } IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST; 00429 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList; 00430 00431 // 00432 // Shutdown entry for registed devices 00433 // 00434 typedef struct _SHUTDOWN_ENTRY 00435 { 00436 LIST_ENTRY ShutdownList; 00437 PDEVICE_OBJECT DeviceObject; 00438 } SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY; 00439 00440 // 00441 // F/S Notification entry for registered File Systems 00442 // 00443 typedef struct _FS_CHANGE_NOTIFY_ENTRY 00444 { 00445 LIST_ENTRY FsChangeNotifyList; 00446 PDRIVER_OBJECT DriverObject; 00447 PDRIVER_FS_NOTIFICATION FSDNotificationProc; 00448 } FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY; 00449 00450 // 00451 // Driver (Boot) Re-Initialization Entry 00452 // 00453 typedef struct _DRIVER_REINIT_ITEM 00454 { 00455 LIST_ENTRY ItemEntry; 00456 PDRIVER_OBJECT DriverObject; 00457 PDRIVER_REINITIALIZE ReinitRoutine; 00458 PVOID Context; 00459 } DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM; 00460 00461 // 00462 // Called on every visit of a node during a preorder-traversal of the device 00463 // node tree. 00464 // If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and 00465 // STATUS_SUCCESS is returned to the caller who initiated the tree traversal. 00466 // Any other returned status code will be returned to the caller. If a status 00467 // code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned, 00468 // the traversal is stopped immediately and the status code is returned to 00469 // the caller. 00470 // 00471 typedef 00472 NTSTATUS 00473 (*DEVICETREE_TRAVERSE_ROUTINE)( 00474 IN PDEVICE_NODE DeviceNode, 00475 IN PVOID Context 00476 ); 00477 00478 // 00479 // Context information for traversing the device tree 00480 // 00481 typedef struct _DEVICETREE_TRAVERSE_CONTEXT 00482 { 00483 // 00484 // Current device node during a traversal 00485 // 00486 PDEVICE_NODE DeviceNode; 00487 00488 // 00489 // Initial device node where we start the traversal 00490 // 00491 PDEVICE_NODE FirstDeviceNode; 00492 00493 // 00494 // Action routine to be called for every device node 00495 // 00496 DEVICETREE_TRAVERSE_ROUTINE Action; 00497 00498 // 00499 // Context passed to the action routine 00500 // 00501 PVOID Context; 00502 } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT; 00503 00504 // 00505 // Resource code 00506 // 00507 ULONG 00508 NTAPI 00509 PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList); 00510 00511 NTSTATUS 00512 NTAPI 00513 IopAssignDeviceResources( 00514 IN PDEVICE_NODE DeviceNode 00515 ); 00516 00517 NTSTATUS 00518 NTAPI 00519 IopFixupResourceListWithRequirements( 00520 IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, 00521 OUT PCM_RESOURCE_LIST *ResourceList 00522 ); 00523 00524 NTSTATUS 00525 NTAPI 00526 IopDetectResourceConflict( 00527 IN PCM_RESOURCE_LIST ResourceList, 00528 IN BOOLEAN Silent, 00529 OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor 00530 ); 00531 00532 // 00533 // PNP Routines 00534 // 00535 NTSTATUS 00536 NTAPI 00537 PipCallDriverAddDevice( 00538 IN PDEVICE_NODE DeviceNode, 00539 IN BOOLEAN LoadDriver, 00540 IN PDRIVER_OBJECT DriverObject 00541 ); 00542 00543 NTSTATUS 00544 NTAPI 00545 IopInitializePlugPlayServices( 00546 VOID 00547 ); 00548 00549 BOOLEAN 00550 NTAPI 00551 PpInitSystem( 00552 VOID 00553 ); 00554 00555 VOID 00556 PnpInit2( 00557 VOID 00558 ); 00559 00560 VOID 00561 IopInitDriverImplementation( 00562 VOID 00563 ); 00564 00565 VOID 00566 IopInitPnpNotificationImplementation( 00567 VOID 00568 ); 00569 00570 VOID 00571 IopNotifyPlugPlayNotification( 00572 IN PDEVICE_OBJECT DeviceObject, 00573 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, 00574 IN LPCGUID Event, 00575 IN PVOID EventCategoryData1, 00576 IN PVOID EventCategoryData2 00577 ); 00578 00579 NTSTATUS 00580 IopGetSystemPowerDeviceObject( 00581 IN PDEVICE_OBJECT *DeviceObject 00582 ); 00583 00584 PDEVICE_NODE 00585 NTAPI 00586 PipAllocateDeviceNode( 00587 IN PDEVICE_OBJECT PhysicalDeviceObject 00588 ); 00589 00590 NTSTATUS 00591 IopCreateDeviceNode( 00592 IN PDEVICE_NODE ParentNode, 00593 IN PDEVICE_OBJECT PhysicalDeviceObject, 00594 IN PUNICODE_STRING ServiceName, 00595 OUT PDEVICE_NODE *DeviceNode 00596 ); 00597 00598 NTSTATUS 00599 IopFreeDeviceNode( 00600 IN PDEVICE_NODE DeviceNode 00601 ); 00602 00603 NTSTATUS 00604 NTAPI 00605 IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode, 00606 PDEVICE_CAPABILITIES DeviceCaps); 00607 00608 NTSTATUS 00609 NTAPI 00610 IopSynchronousCall( 00611 IN PDEVICE_OBJECT DeviceObject, 00612 IN PIO_STACK_LOCATION IoStackLocation, 00613 OUT PVOID *Information 00614 ); 00615 00616 NTSTATUS 00617 NTAPI 00618 IopInitiatePnpIrp( 00619 IN PDEVICE_OBJECT DeviceObject, 00620 IN PIO_STATUS_BLOCK IoStatusBlock, 00621 IN UCHAR MinorFunction, 00622 IN PIO_STACK_LOCATION Stack 00623 ); 00624 00625 PDEVICE_NODE 00626 FASTCALL 00627 IopGetDeviceNode( 00628 IN PDEVICE_OBJECT DeviceObject 00629 ); 00630 00631 NTSTATUS 00632 IopActionConfigureChildServices( 00633 IN PDEVICE_NODE DeviceNode, 00634 IN PVOID Context 00635 ); 00636 00637 NTSTATUS 00638 IopActionInitChildServices( 00639 IN PDEVICE_NODE DeviceNode, 00640 IN PVOID Context 00641 ); 00642 00643 NTSTATUS 00644 IopEnumerateDevice( 00645 IN PDEVICE_OBJECT DeviceObject 00646 ); 00647 00648 NTSTATUS 00649 IoCreateDriverList( 00650 VOID 00651 ); 00652 00653 NTSTATUS 00654 IoDestroyDriverList( 00655 VOID 00656 ); 00657 00658 NTSTATUS 00659 INIT_FUNCTION 00660 IopInitPlugPlayEvents(VOID); 00661 00662 NTSTATUS 00663 IopQueueTargetDeviceEvent( 00664 const GUID *Guid, 00665 PUNICODE_STRING DeviceIds 00666 ); 00667 00668 NTSTATUS 00669 IopInitializePnpServices( 00670 IN PDEVICE_NODE DeviceNode); 00671 00672 NTSTATUS 00673 NTAPI 00674 IopOpenRegistryKeyEx( 00675 PHANDLE KeyHandle, 00676 HANDLE ParentKey, 00677 PUNICODE_STRING Name, 00678 ACCESS_MASK DesiredAccess); 00679 00680 NTSTATUS 00681 NTAPI 00682 IopGetRegistryValue( 00683 IN HANDLE Handle, 00684 IN PWSTR ValueName, 00685 OUT PKEY_VALUE_FULL_INFORMATION *Information 00686 ); 00687 00688 NTSTATUS 00689 NTAPI 00690 IopCreateRegistryKeyEx( 00691 OUT PHANDLE Handle, 00692 IN HANDLE BaseHandle OPTIONAL, 00693 IN PUNICODE_STRING KeyName, 00694 IN ACCESS_MASK DesiredAccess, 00695 IN ULONG CreateOptions, 00696 OUT PULONG Disposition OPTIONAL 00697 ); 00698 00699 00700 NTSTATUS 00701 IopTraverseDeviceTree( 00702 PDEVICETREE_TRAVERSE_CONTEXT Context); 00703 00704 // 00705 // PnP Routines 00706 // 00707 NTSTATUS 00708 NTAPI 00709 IopUpdateRootKey( 00710 VOID 00711 ); 00712 00713 NTSTATUS 00714 NTAPI 00715 PiInitCacheGroupInformation( 00716 VOID 00717 ); 00718 00719 USHORT 00720 NTAPI 00721 PpInitGetGroupOrderIndex( 00722 IN HANDLE ServiceHandle 00723 ); 00724 00725 USHORT 00726 NTAPI 00727 PipGetDriverTagPriority( 00728 IN HANDLE ServiceHandle 00729 ); 00730 00731 NTSTATUS 00732 NTAPI 00733 PnpRegMultiSzToUnicodeStrings( 00734 IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, 00735 OUT PUNICODE_STRING *UnicodeStringList, 00736 OUT PULONG UnicodeStringCount 00737 ); 00738 00739 BOOLEAN 00740 NTAPI 00741 PnpRegSzToString( 00742 IN PWCHAR RegSzData, 00743 IN ULONG RegSzLength, 00744 OUT PUSHORT StringLength OPTIONAL 00745 ); 00746 00747 // 00748 // Initialization Routines 00749 // 00750 NTSTATUS 00751 NTAPI 00752 IopCreateArcNames( 00753 IN PLOADER_PARAMETER_BLOCK LoaderBlock 00754 ); 00755 00756 NTSTATUS 00757 NTAPI 00758 IopReassignSystemRoot( 00759 IN PLOADER_PARAMETER_BLOCK LoaderBlock, 00760 OUT PANSI_STRING NtBootPath 00761 ); 00762 00763 BOOLEAN 00764 NTAPI 00765 IoInitSystem( 00766 IN PLOADER_PARAMETER_BLOCK LoaderBlock 00767 ); 00768 00769 BOOLEAN 00770 NTAPI 00771 IopVerifyDiskSignature( 00772 IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, 00773 IN PARC_DISK_SIGNATURE ArcDiskSignature, 00774 OUT PULONG Signature 00775 ); 00776 00777 // 00778 // Device/Volume Routines 00779 // 00780 VOID 00781 NTAPI 00782 IopReadyDeviceObjects( 00783 IN PDRIVER_OBJECT Driver 00784 ); 00785 00786 NTSTATUS 00787 FASTCALL 00788 IopInitializeDevice( 00789 IN PDEVICE_NODE DeviceNode, 00790 IN PDRIVER_OBJECT DriverObject 00791 ); 00792 00793 NTSTATUS 00794 IopStartDevice( 00795 IN PDEVICE_NODE DeviceNode 00796 ); 00797 00798 NTSTATUS 00799 IopStopDevice( 00800 IN PDEVICE_NODE DeviceNode 00801 ); 00802 00803 NTSTATUS 00804 IopRemoveDevice( 00805 IN PDEVICE_NODE DeviceNode 00806 ); 00807 00808 PVPB 00809 NTAPI 00810 IopCheckVpbMounted( 00811 IN POPEN_PACKET OpenPacket, 00812 IN PDEVICE_OBJECT DeviceObject, 00813 IN PUNICODE_STRING RemainingName, 00814 OUT PNTSTATUS Status 00815 ); 00816 00817 NTSTATUS 00818 NTAPI 00819 IopMountVolume( 00820 IN PDEVICE_OBJECT DeviceObject, 00821 IN BOOLEAN AllowRawMount, 00822 IN BOOLEAN DeviceIsLocked, 00823 IN BOOLEAN Alertable, 00824 OUT PVPB *Vpb 00825 ); 00826 00827 PVOID 00828 IoOpenSymlink( 00829 IN PVOID SymbolicLink 00830 ); 00831 00832 PVOID 00833 IoOpenFileOnDevice( 00834 IN PVOID SymbolicLink, 00835 IN PWCHAR Name 00836 ); 00837 00838 NTSTATUS 00839 NTAPI 00840 IopCreateVpb( 00841 IN PDEVICE_OBJECT DeviceObject 00842 ); 00843 00844 VOID 00845 NTAPI 00846 IopDereferenceVpbAndFree( 00847 IN PVPB Vpb 00848 ); 00849 00850 VOID 00851 NTAPI 00852 IoInitFileSystemImplementation( 00853 VOID 00854 ); 00855 00856 VOID 00857 NTAPI 00858 IoInitVpbImplementation( 00859 VOID 00860 ); 00861 00862 NTSTATUS 00863 NTAPI 00864 IopReferenceDeviceObject( 00865 IN PDEVICE_OBJECT DeviceObject 00866 ); 00867 00868 VOID 00869 NTAPI 00870 IopDereferenceDeviceObject( 00871 IN PDEVICE_OBJECT DeviceObject, 00872 IN BOOLEAN ForceUnload 00873 ); 00874 00875 NTSTATUS 00876 NTAPI 00877 IoGetRelatedTargetDevice( 00878 IN PFILE_OBJECT FileObject, 00879 OUT PDEVICE_OBJECT *DeviceObject 00880 ); 00881 00882 VOID 00883 NTAPI 00884 IopUnloadDevice( 00885 IN PDEVICE_OBJECT DeviceObject 00886 ); 00887 00888 // 00889 // IRP Routines 00890 // 00891 NTSTATUS 00892 NTAPI 00893 IopCleanupFailedIrp( 00894 IN PFILE_OBJECT FileObject, 00895 IN PKEVENT EventObject, 00896 IN PVOID Buffer OPTIONAL 00897 ); 00898 00899 VOID 00900 NTAPI 00901 IopAbortInterruptedIrp( 00902 IN PKEVENT EventObject, 00903 IN PIRP Irp 00904 ); 00905 00906 // 00907 // Shutdown routines 00908 // 00909 VOID 00910 IoInitShutdownNotification( 00911 VOID 00912 ); 00913 00914 VOID 00915 NTAPI 00916 IoShutdownSystem( 00917 IN ULONG Phase 00918 ); 00919 00920 VOID 00921 NTAPI 00922 IopShutdownBaseFileSystems( 00923 IN PLIST_ENTRY ListHead 00924 ); 00925 00926 // 00927 // Boot logging support 00928 // 00929 VOID 00930 IopInitBootLog( 00931 IN BOOLEAN StartBootLog 00932 ); 00933 00934 VOID 00935 IopStartBootLog( 00936 VOID 00937 ); 00938 00939 VOID 00940 IopStopBootLog( 00941 VOID 00942 ); 00943 00944 VOID 00945 IopBootLog( 00946 IN PUNICODE_STRING DriverName, 00947 IN BOOLEAN Success 00948 ); 00949 00950 VOID 00951 IopSaveBootLogToFile( 00952 VOID 00953 ); 00954 00955 // 00956 // I/O Cancellation Routines 00957 // 00958 VOID 00959 NTAPI 00960 IoCancelThreadIo( 00961 IN PETHREAD Thread 00962 ); 00963 00964 VOID 00965 IoInitCancelHandling( 00966 VOID 00967 ); 00968 00969 // 00970 // I/O Completion 00971 // 00972 VOID 00973 NTAPI 00974 IopCompleteRequest( 00975 IN PKAPC Apc, 00976 IN PKNORMAL_ROUTINE* NormalRoutine, 00977 IN PVOID* NormalContext, 00978 IN PVOID* SystemArgument1, 00979 IN PVOID* SystemArgument2 00980 ); 00981 00982 // 00983 // Error Logging Routines 00984 // 00985 VOID 00986 NTAPI 00987 IopInitErrorLog( 00988 VOID 00989 ); 00990 00991 VOID 00992 NTAPI 00993 IopLogWorker( 00994 IN PVOID Parameter 00995 ); 00996 00997 // 00998 // Raw File System MiniDriver 00999 // 01000 BOOLEAN 01001 RawFsIsRawFileSystemDeviceObject( 01002 IN PDEVICE_OBJECT DeviceObject 01003 ); 01004 01005 NTSTATUS 01006 NTAPI 01007 RawFsDriverEntry( 01008 IN PDRIVER_OBJECT DriverObject, 01009 IN PUNICODE_STRING RegistryPath 01010 ); 01011 01012 // 01013 // PnP Root MiniDriver 01014 // 01015 NTSTATUS 01016 NTAPI 01017 PnpRootDriverEntry( 01018 IN PDRIVER_OBJECT DriverObject, 01019 IN PUNICODE_STRING RegistryPath 01020 ); 01021 01022 NTSTATUS 01023 PnpRootCreateDevice( 01024 IN PUNICODE_STRING ServiceName, 01025 IN OPTIONAL PDRIVER_OBJECT DriverObject, 01026 OUT PDEVICE_OBJECT *PhysicalDeviceObject, 01027 OUT OPTIONAL PUNICODE_STRING FullInstancePath 01028 ); 01029 01030 NTSTATUS 01031 PnpRootRegisterDevice( 01032 IN PDEVICE_OBJECT DeviceObject); 01033 01034 // 01035 // Driver Routines 01036 // 01037 VOID 01038 FASTCALL 01039 IopInitializeBootDrivers( 01040 VOID 01041 ); 01042 01043 VOID 01044 FASTCALL 01045 IopInitializeSystemDrivers( 01046 VOID 01047 ); 01048 01049 NTSTATUS 01050 NTAPI 01051 IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL, 01052 IN PDRIVER_INITIALIZE InitializationFunction, 01053 IN PUNICODE_STRING RegistryPath, 01054 PLDR_DATA_TABLE_ENTRY ModuleObject, 01055 OUT PDRIVER_OBJECT *pDriverObject); 01056 01057 VOID 01058 NTAPI 01059 IopDeleteDriver( 01060 IN PVOID ObjectBody 01061 ); 01062 01063 NTSTATUS 01064 FASTCALL 01065 IopGetDriverObject( 01066 OUT PDRIVER_OBJECT *DriverObject, 01067 IN PUNICODE_STRING ServiceName, 01068 IN BOOLEAN FileSystem 01069 ); 01070 01071 NTSTATUS 01072 FASTCALL 01073 IopLoadServiceModule( 01074 IN PUNICODE_STRING ServiceName, 01075 OUT PLDR_DATA_TABLE_ENTRY *ModuleObject 01076 ); 01077 01078 VOID 01079 NTAPI 01080 IopLoadUnloadDriver( 01081 IN OUT PLOAD_UNLOAD_PARAMS LoadParams 01082 ); 01083 01084 NTSTATUS 01085 FASTCALL 01086 IopInitializeDriverModule( 01087 IN PDEVICE_NODE DeviceNode, 01088 IN PLDR_DATA_TABLE_ENTRY ModuleObject, 01089 IN PUNICODE_STRING ServiceName, 01090 IN BOOLEAN FileSystemDriver, 01091 OUT PDRIVER_OBJECT *DriverObject 01092 ); 01093 01094 NTSTATUS 01095 FASTCALL 01096 IopAttachFilterDrivers( 01097 IN PDEVICE_NODE DeviceNode, 01098 IN BOOLEAN Lower 01099 ); 01100 01101 VOID 01102 NTAPI 01103 IopReinitializeDrivers( 01104 VOID 01105 ); 01106 01107 VOID 01108 NTAPI 01109 IopReinitializeBootDrivers( 01110 VOID 01111 ); 01112 01113 // 01114 // File Routines 01115 // 01116 VOID 01117 NTAPI 01118 IopDeleteDevice(IN PVOID ObjectBody); 01119 01120 NTSTATUS 01121 NTAPI 01122 IopParseDevice( 01123 IN PVOID ParseObject, 01124 IN PVOID ObjectType, 01125 IN OUT PACCESS_STATE AccessState, 01126 IN KPROCESSOR_MODE AccessMode, 01127 IN ULONG Attributes, 01128 IN OUT PUNICODE_STRING CompleteName, 01129 IN OUT PUNICODE_STRING RemainingName, 01130 IN OUT PVOID Context, 01131 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, 01132 OUT PVOID *Object 01133 ); 01134 01135 NTSTATUS 01136 NTAPI 01137 IopParseFile( 01138 IN PVOID ParseObject, 01139 IN PVOID ObjectType, 01140 IN OUT PACCESS_STATE AccessState, 01141 IN KPROCESSOR_MODE AccessMode, 01142 IN ULONG Attributes, 01143 IN OUT PUNICODE_STRING CompleteName, 01144 IN OUT PUNICODE_STRING RemainingName, 01145 IN OUT PVOID Context OPTIONAL, 01146 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, 01147 OUT PVOID *Object 01148 ); 01149 01150 VOID 01151 NTAPI 01152 IopDeleteFile( 01153 IN PVOID ObjectBody 01154 ); 01155 01156 NTSTATUS 01157 NTAPI 01158 IopSecurityFile( 01159 IN PVOID ObjectBody, 01160 IN SECURITY_OPERATION_CODE OperationCode, 01161 IN PSECURITY_INFORMATION SecurityInformation, 01162 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, 01163 IN OUT PULONG BufferLength, 01164 OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor, 01165 IN POOL_TYPE PoolType, 01166 IN OUT PGENERIC_MAPPING GenericMapping 01167 ); 01168 01169 NTSTATUS 01170 NTAPI 01171 IopQueryNameFile( 01172 IN PVOID ObjectBody, 01173 IN BOOLEAN HasName, 01174 OUT POBJECT_NAME_INFORMATION ObjectNameInfo, 01175 IN ULONG Length, 01176 OUT PULONG ReturnLength, 01177 IN KPROCESSOR_MODE PreviousMode 01178 ); 01179 01180 VOID 01181 NTAPI 01182 IopCloseFile( 01183 IN PEPROCESS Process OPTIONAL, 01184 IN PVOID Object, 01185 IN ACCESS_MASK GrantedAccess, 01186 IN ULONG ProcessHandleCount, 01187 IN ULONG SystemHandleCount 01188 ); 01189 01190 PVOID 01191 NTAPI 01192 IoGetFileObjectFilterContext( 01193 IN PFILE_OBJECT FileObject 01194 ); 01195 01196 NTSTATUS 01197 NTAPI 01198 IoChangeFileObjectFilterContext( 01199 IN PFILE_OBJECT FileObject, 01200 IN PVOID FilterContext, 01201 IN BOOLEAN Define 01202 ); 01203 01204 // 01205 // I/O Timer Routines 01206 // 01207 VOID 01208 FASTCALL 01209 IopInitTimerImplementation( 01210 VOID 01211 ); 01212 01213 VOID 01214 NTAPI 01215 IopRemoveTimerFromTimerList( 01216 IN PIO_TIMER Timer 01217 ); 01218 01219 // 01220 // I/O Completion Routines 01221 // 01222 VOID 01223 NTAPI 01224 IopDeleteIoCompletion( 01225 PVOID ObjectBody 01226 ); 01227 01228 // 01229 // Ramdisk Routines 01230 // 01231 NTSTATUS 01232 NTAPI 01233 IopStartRamdisk( 01234 IN PLOADER_PARAMETER_BLOCK LoaderBlock 01235 ); 01236 01237 // 01238 // Configuration Routines 01239 // 01240 NTSTATUS 01241 NTAPI 01242 IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList, 01243 IN GUID Guid, 01244 IN ULONG ExpectedInterfaces, 01245 IN PULONG Interfaces 01246 ); 01247 01248 VOID 01249 NTAPI 01250 IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName, 01251 IN PUNICODE_STRING OsLoaderPathName 01252 ); 01253 01254 // 01255 // Global I/O Data 01256 // 01257 extern POBJECT_TYPE IoCompletionType; 01258 extern PDEVICE_NODE IopRootDeviceNode; 01259 extern KSPIN_LOCK IopDeviceTreeLock; 01260 extern ULONG IopTraceLevel; 01261 extern GENERAL_LOOKASIDE IopMdlLookasideList; 01262 extern GENERIC_MAPPING IopCompletionMapping; 01263 extern GENERIC_MAPPING IopFileMapping; 01264 extern POBJECT_TYPE _IoFileObjectType; 01265 extern HAL_DISPATCH _HalDispatchTable; 01266 extern LIST_ENTRY IopErrorLogListHead; 01267 extern ULONG IopNumTriageDumpDataBlocks; 01268 extern PVOID IopTriageDumpDataBlocks[64]; 01269 extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList; 01270 extern PDRIVER_OBJECT IopRootDriverObject; 01271 01272 // 01273 // Inlined Functions 01274 // 01275 #include "io_x.h" Generated on Fri May 25 2012 04:28:24 for ReactOS by
1.7.6.1
|