Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470/* * PROJECT: ReactOS Kernel * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/include/internal/io.h * PURPOSE: Internal header for the I/O Manager * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */
#include "ntdddisk.h"
//// Define this if you want debugging support//#define _IO_DEBUG_ 0x00
//// These define the Debug Masks Supported//#define IO_IRP_DEBUG 0x01#define IO_FILE_DEBUG 0x02#define IO_API_DEBUG 0x04#define IO_CTL_DEBUG 0x08
//// Debug/Tracing support//#if _IO_DEBUG_#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented#define IOTRACE(x, ...) \ { \ DbgPrintEx("%s [%.16s] - ", \ __FUNCTION__, \ PsGetCurrentProcess()->ImageFileName); \ DbgPrintEx(__VA_ARGS__); \ }#else#define IOTRACE(x, ...) \ if (x & IopTraceLevel) \ { \ DbgPrint("%s [%.16s] - ", \ __FUNCTION__, \ PsGetCurrentProcess()->ImageFileName); \ DbgPrint(__VA_ARGS__); \ }#endif#else#define IOTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)#endif
//// Registry path to the enumeration root key//#define ENUM_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum"
//// Returns the type of METHOD_ used in this IOCTL//#define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
//// Bugcheck codes for RAM disk booting////// No LoaderXIPRom descriptor was found in the loader memory list//#define RD_NO_XIPROM_DESCRIPTOR 1//// Unable to open the RAM disk driver (ramdisk.sys or \Device\Ramdisk)//#define RD_NO_RAMDISK_DRIVER 2//// FSCTL_CREATE_RAM_DISK failed//#define RD_FSCTL_FAILED 3//// Unable to create GUID string from binary GUID//#define RD_GUID_CONVERT_FAILED 4//// Unable to create symbolic link pointing to the RAM disk device//#define RD_SYMLINK_CREATE_FAILED 5//// Unable to create system root path when creating the RAM disk//#define RD_SYSROOT_INIT_FAILED 6
//// Max traversal of reparse points for a single open in IoParseDevice//#define IOP_MAX_REPARSE_TRAVERSAL 0x20
//// Private flags for IoCreateFile / IoParseDevice//#define IOP_USE_TOP_LEVEL_DEVICE_HINT 0x01#define IOP_CREATE_FILE_OBJECT_EXTENSION 0x02
typedef struct _FILE_OBJECT_EXTENSION{ PDEVICE_OBJECT TopDeviceObjectHint; PVOID FilterContext;
} FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION;
//// We can call the Ob Inlined API, it's the same thing//#define IopAllocateMdlFromLookaside \ ObpAllocateObjectCreateInfoBuffer#define IopFreeMdlFromLookaside \ ObpFreeCapturedAttributes
//// Determines if the IRP is Synchronous//#define IsIrpSynchronous(Irp, FileObject) \ ((Irp->Flags & IRP_SYNCHRONOUS_API) || \ (!(FileObject) ? \ FALSE : \ FileObject->Flags & FO_SYNCHRONOUS_IO)) \
//// Returns the internal Device Object Extension//#define IoGetDevObjExtension(DeviceObject) \ ((PEXTENDED_DEVOBJ_EXTENSION) \ (DeviceObject->DeviceObjectExtension)) \
//// Returns the internal Driver Object Extension//#define IoGetDrvObjExtension(DriverObject) \ ((PEXTENDED_DRIVER_EXTENSION) \ (DriverObject->DriverExtension)) \
/* * VOID * IopDeviceNodeSetFlag( * PDEVICE_NODE DeviceNode, * ULONG Flag); */#define IopDeviceNodeSetFlag(DeviceNode, Flag) \ ((DeviceNode)->Flags |= (Flag))
/* * VOID * IopDeviceNodeClearFlag( * PDEVICE_NODE DeviceNode, * ULONG Flag); */#define IopDeviceNodeClearFlag(DeviceNode, Flag) \ ((DeviceNode)->Flags &= ~(Flag))
/* * BOOLEAN * IopDeviceNodeHasFlag( * PDEVICE_NODE DeviceNode, * ULONG Flag); */#define IopDeviceNodeHasFlag(DeviceNode, Flag) \ (((DeviceNode)->Flags & (Flag)) > 0)
/* * VOID * IopDeviceNodeSetUserFlag( * PDEVICE_NODE DeviceNode, * ULONG UserFlag); */#define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \ ((DeviceNode)->UserFlags |= (UserFlag))
/* * VOID * IopDeviceNodeClearUserFlag( * PDEVICE_NODE DeviceNode, * ULONG UserFlag); */#define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\ ((DeviceNode)->UserFlags &= ~(UserFlag))
/* * BOOLEAN * IopDeviceNodeHasUserFlag( * PDEVICE_NODE DeviceNode, * ULONG UserFlag); */#define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \ (((DeviceNode)->UserFlags & (UserFlag)) > 0)
/* * VOID * IopDeviceNodeSetProblem( * PDEVICE_NODE DeviceNode, * ULONG Problem); */#define IopDeviceNodeSetProblem(DeviceNode, Problem) \ ((DeviceNode)->Problem |= (Problem))
/* * VOID * IopDeviceNodeClearProblem( * PDEVICE_NODE DeviceNode, * ULONG Problem); */#define IopDeviceNodeClearProblem(DeviceNode, Problem) \ ((DeviceNode)->Problem &= ~(Problem))
/* * BOOLEAN * IopDeviceNodeHasProblem( * PDEVICE_NODE DeviceNode, * ULONG Problem); */#define IopDeviceNodeHasProblem(DeviceNode, Problem) \ (((DeviceNode)->Problem & (Problem)) > 0)
/* * VOID * IopInitDeviceTreeTraverseContext( * PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext, * PDEVICE_NODE DeviceNode, * DEVICETREE_TRAVERSE_ROUTINE Action, * PVOID Context); */#define IopInitDeviceTreeTraverseContext( \ _DeviceTreeTraverseContext, _DeviceNode, _Action, \ _Context) { \ (_DeviceTreeTraverseContext)->FirstDeviceNode = \ (_DeviceNode); \ (_DeviceTreeTraverseContext)->Action = (_Action); \ (_DeviceTreeTraverseContext)->Context = (_Context); }
/* * BOOLEAN * IopIsValidPhysicalDeviceObject( * IN PDEVICE_OBJECT PhysicalDeviceObject); */#define IopIsValidPhysicalDeviceObject(PhysicalDeviceObject) \ (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject) && \ (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode) && \ (((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode->Flags & DNF_ENUMERATED))
//// Device List Operations//typedef enum _IOP_DEVICE_LIST_OPERATION{ IopRemove, IopAdd} IOP_DEVICE_LIST_OPERATION, *PIOP_DEVICE_LIST_OPERATION;
//// Transfer statistics//typedef enum _IOP_TRANSFER_TYPE{ IopReadTransfer, IopWriteTransfer, IopOtherTransfer} IOP_TRANSFER_TYPE, *PIOP_TRANSFER_TYPE;
//// Packet Types when piggybacking on the IRP Overlay//typedef enum _COMPLETION_PACKET_TYPE { IopCompletionPacketIrp, IopCompletionPacketMini, IopCompletionPacketQuota} COMPLETION_PACKET_TYPE, *PCOMPLETION_PACKET_TYPE;
//// Special version of the IRP Overlay used to optimize I/O completion// by not using up a separate structure.//typedef struct _IOP_MINI_COMPLETION_PACKET{ struct { LIST_ENTRY ListEntry; union { struct _IO_STACK_LOCATION *CurrentStackLocation; ULONG PacketType; }; }; PVOID KeyContext; PVOID ApcContext; NTSTATUS IoStatus; ULONG_PTR IoStatusInformation;} IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET;
//// I/O Completion Context for IoSetIoCompletionRoutineEx//typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT{ PDEVICE_OBJECT DeviceObject; PVOID Context; PIO_COMPLETION_ROUTINE CompletionRoutine;} IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT;
//// I/O Wrapper around the Executive Work Item//typedef struct _IO_WORKITEM{ WORK_QUEUE_ITEM Item; PDEVICE_OBJECT DeviceObject; PIO_WORKITEM_ROUTINE WorkerRoutine; PVOID Context;} IO_WORKITEM;
//// I/O Wrapper around the Kernel Interrupt//typedef struct _IO_INTERRUPT{ KINTERRUPT FirstInterrupt; PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS]; KSPIN_LOCK SpinLock;} IO_INTERRUPT, *PIO_INTERRUPT;
//// I/O Error Log Packet Header//typedef struct _ERROR_LOG_ENTRY{ CSHORT Type; CSHORT Size; LIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; PDRIVER_OBJECT DriverObject; LARGE_INTEGER TimeStamp;} ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
//// To simplify matters, the kernel is made to support both the checked and free// version of the I/O Remove Lock in the same binary. This structure includes// both, since the DDK has the structure with a compile-time #ifdef.//typedef struct _EXTENDED_IO_REMOVE_LOCK{ IO_REMOVE_LOCK_COMMON_BLOCK Common; IO_REMOVE_LOCK_DBG_BLOCK Dbg;} EXTENDED_IO_REMOVE_LOCK, *PEXTENDED_IO_REMOVE_LOCK;
//// Dummy File Object used inside the Open Packet so that OB knows how to// deal with the Object Pointer even though it's not a real file.//typedef struct _DUMMY_FILE_OBJECT{ OBJECT_HEADER ObjectHeader; CHAR FileObjectBody[sizeof(FILE_OBJECT)];} DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT;
//// Open packet used as a context for Device/File parsing so that the parse// routine can know what operation is being requested.//typedef struct _OPEN_PACKET{ CSHORT Type; CSHORT Size; PFILE_OBJECT FileObject; NTSTATUS FinalStatus; ULONG_PTR Information; ULONG ParseCheck; PFILE_OBJECT RelatedFileObject; OBJECT_ATTRIBUTES OriginalAttributes; LARGE_INTEGER AllocationSize; ULONG CreateOptions; USHORT FileAttributes; USHORT ShareAccess; PVOID EaBuffer; ULONG EaLength; ULONG Options; ULONG Disposition; PFILE_BASIC_INFORMATION BasicInformation; PFILE_NETWORK_OPEN_INFORMATION NetworkInformation; CREATE_FILE_TYPE CreateFileType; PVOID ExtraCreateParameters; BOOLEAN Override; BOOLEAN QueryOnly; BOOLEAN DeleteOnly; BOOLEAN FullAttributes; PDUMMY_FILE_OBJECT LocalFileObject; BOOLEAN TraversedMountPoint; ULONG InternalFlags; PDEVICE_OBJECT TopDeviceObjectHint;} OPEN_PACKET, *POPEN_PACKET;
//// Boot Driver List Entry//typedef struct _DRIVER_INFORMATION{ LIST_ENTRY Link; PDRIVER_OBJECT DriverObject; PBOOT_DRIVER_LIST_ENTRY DataTableEntry; HANDLE ServiceHandle; USHORT TagPosition; ULONG Failed; ULONG Processed; NTSTATUS Status;} DRIVER_INFORMATION, *PDRIVER_INFORMATION;
//// List of Bus Type GUIDs//typedef struct _IO_BUS_TYPE_GUID_LIST{ ULONG GuidCount; FAST_MUTEX Lock; GUID Guids[1];} IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST;extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList;
//// Shutdown entry for registed devices//typedef struct _SHUTDOWN_ENTRY{ LIST_ENTRY ShutdownList; PDEVICE_OBJECT DeviceObject;} SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY;
//// F/S Notification entry for registered File Systems//typedef struct _FS_CHANGE_NOTIFY_ENTRY{ LIST_ENTRY FsChangeNotifyList; PDRIVER_OBJECT DriverObject; PDRIVER_FS_NOTIFICATION FSDNotificationProc;} FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY;
//// Driver (Boot) Re-Initialization Entry//typedef struct _DRIVER_REINIT_ITEM{ LIST_ENTRY ItemEntry; PDRIVER_OBJECT DriverObject; PDRIVER_REINITIALIZE ReinitRoutine; PVOID Context;} DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
//// Called on every visit of a node during a preorder-traversal of the device// node tree.// If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and// STATUS_SUCCESS is returned to the caller who initiated the tree traversal.// Any other returned status code will be returned to the caller. If a status// code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,// the traversal is stopped immediately and the status code is returned to// the caller.//typedefNTSTATUS(*DEVICETREE_TRAVERSE_ROUTINE)( IN PDEVICE_NODE DeviceNode, IN PVOID Context);
//// Context information for traversing the device tree//typedef struct _DEVICETREE_TRAVERSE_CONTEXT{ // // Current device node during a traversal // PDEVICE_NODE DeviceNode;
// // Initial device node where we start the traversal // PDEVICE_NODE FirstDeviceNode;
// // Action routine to be called for every device node // DEVICETREE_TRAVERSE_ROUTINE Action;
// // Context passed to the action routine // PVOID Context;} DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
//// Reserve IRP allocator// Used for read paging IOs in low-memory situations//typedef struct _RESERVE_IRP_ALLOCATOR{ PIRP ReserveIrp; volatile LONG ReserveIrpInUse; KEVENT WaitEvent; CCHAR StackSize;} RESERVE_IRP_ALLOCATOR, *PRESERVE_IRP_ALLOCATOR;
//// Type selection for IopCreateSecurityDescriptorPerType()//typedef enum _SECURITY_DESCRIPTOR_TYPE{ RestrictedPublic = 1, UnrestrictedPublic, RestrictedPublicOpen, UnrestrictedPublicOpen, SystemDefault,} SECURITY_DESCRIPTOR_TYPE, *PSECURITY_DESCRIPTOR_TYPE;
//// Action types and data for PiQueueDeviceAction()//typedef enum _DEVICE_ACTION{ PiActionEnumDeviceTree, PiActionEnumRootDevices, PiActionResetDevice, PiActionAddBootDevices, PiActionStartDevice, PiActionQueryState,} DEVICE_ACTION;
//// Resource code//ULONGNTAPIPnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList);
NTSTATUSNTAPIIopAssignDeviceResources( IN PDEVICE_NODE DeviceNode);
NTSTATUSNTAPIIopFixupResourceListWithRequirements( IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, OUT PCM_RESOURCE_LIST *ResourceList);
NTSTATUSNTAPIIopDetectResourceConflict( IN PCM_RESOURCE_LIST ResourceList, IN BOOLEAN Silent, OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor);
//// PNP Routines//NTSTATUSNTAPIPipCallDriverAddDevice( IN PDEVICE_NODE DeviceNode, IN BOOLEAN LoadDriver, IN PDRIVER_OBJECT DriverObject);
CODE_SEG("INIT")NTSTATUSNTAPIIopInitializePlugPlayServices( VOID);
BOOLEANNTAPIPpInitSystem( VOID);
VOIDPnpInit2( VOID);
VOIDIopInitDriverImplementation( VOID);
NTSTATUSIopGetSystemPowerDeviceObject( IN PDEVICE_OBJECT *DeviceObject);
PDEVICE_NODEPipAllocateDeviceNode( IN PDEVICE_OBJECT PhysicalDeviceObject);
VOIDPiInsertDevNode( _In_ PDEVICE_NODE DeviceNode, _In_ PDEVICE_NODE ParentNode);
PNP_DEVNODE_STATEPiSetDevNodeState( _In_ PDEVICE_NODE DeviceNode, _In_ PNP_DEVNODE_STATE NewState);
VOIDPiSetDevNodeProblem( _In_ PDEVICE_NODE DeviceNode, _In_ UINT32 Problem);
VOIDPiClearDevNodeProblem( _In_ PDEVICE_NODE DeviceNode);
NTSTATUSIopFreeDeviceNode( IN PDEVICE_NODE DeviceNode);
NTSTATUSNTAPIIopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode, PDEVICE_CAPABILITIES DeviceCaps);
NTSTATUSIopSynchronousCall( IN PDEVICE_OBJECT DeviceObject, IN PIO_STACK_LOCATION IoStackLocation, OUT PVOID *Information);
NTSTATUSNTAPIIopInitiatePnpIrp( IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack);
PDEVICE_NODEFASTCALLIopGetDeviceNode( IN PDEVICE_OBJECT DeviceObject);
NTSTATUSIoCreateDriverList( VOID);
NTSTATUSIoDestroyDriverList( VOID);
CODE_SEG("INIT")NTSTATUSIopInitPlugPlayEvents(VOID);
NTSTATUSIopQueueDeviceChangeEvent( _In_ const GUID *EventGuid, _In_ const GUID *InterfaceClassGuid, _In_ PUNICODE_STRING SymbolicLinkName);
NTSTATUSIopQueueTargetDeviceEvent( _In_ const GUID *Guid, _In_ PUNICODE_STRING DeviceIds);
NTSTATUSIopQueueDeviceInstallEvent( _In_ const GUID *Guid, _In_ PUNICODE_STRING DeviceId);
NTSTATUSNTAPIIopOpenRegistryKeyEx( PHANDLE KeyHandle, HANDLE ParentKey, PUNICODE_STRING Name, ACCESS_MASK DesiredAccess);
NTSTATUSNTAPIIopGetRegistryValue( IN HANDLE Handle, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *Information);
NTSTATUSNTAPIIopCreateRegistryKeyEx( OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL);
NTSTATUSIopTraverseDeviceTree( PDEVICETREE_TRAVERSE_CONTEXT Context);
NTSTATUSNTAPIIopCreateDeviceKeyPath( IN PCUNICODE_STRING RegistryPath, IN ULONG CreateOptions, OUT PHANDLE Handle);
//// PnP Routines//CODE_SEG("INIT")NTSTATUSNTAPIIopUpdateRootKey( VOID);
CODE_SEG("INIT")NTSTATUSNTAPIPiInitCacheGroupInformation( VOID);
USHORTNTAPIPpInitGetGroupOrderIndex( IN HANDLE ServiceHandle);
USHORTNTAPIPipGetDriverTagPriority( IN HANDLE ServiceHandle);
NTSTATUSNTAPIPnpRegMultiSzToUnicodeStrings( IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, OUT PUNICODE_STRING *UnicodeStringList, OUT PULONG UnicodeStringCount);
BOOLEANNTAPIPnpRegSzToString( IN PWCHAR RegSzData, IN ULONG RegSzLength, OUT PUSHORT StringLength OPTIONAL);
VOIDPiSetDevNodeText( _In_ PDEVICE_NODE DeviceNode, _In_ HANDLE InstanceKey);
//// Initialization Routines//CODE_SEG("INIT")NTSTATUSNTAPIIopCreateArcNames( IN PLOADER_PARAMETER_BLOCK LoaderBlock);
CODE_SEG("INIT")NTSTATUSNTAPIIopReassignSystemRoot( IN PLOADER_PARAMETER_BLOCK LoaderBlock, OUT PANSI_STRING NtBootPath);
CODE_SEG("INIT")BOOLEANNTAPIIoInitSystem( IN PLOADER_PARAMETER_BLOCK LoaderBlock);
BOOLEANIopVerifyDiskSignature( _In_ PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, _In_ PARC_DISK_SIGNATURE ArcDiskSignature, _Out_ PULONG Signature);
BOOLEANNTAPIIoInitializeCrashDump( IN HANDLE PageFileHandle);
CODE_SEG("INIT")VOIDPiInitializeNotifications( VOID);
//// Device/Volume Routines//VOIDNTAPIIopReadyDeviceObjects( IN PDRIVER_OBJECT Driver);
PVPBNTAPIIopCheckVpbMounted( IN POPEN_PACKET OpenPacket, IN PDEVICE_OBJECT DeviceObject, IN PUNICODE_STRING RemainingName, OUT PNTSTATUS Status);
NTSTATUSNTAPIIopMountVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount, IN BOOLEAN DeviceIsLocked, IN BOOLEAN Alertable, OUT PVPB *Vpb);
PVOIDIoOpenSymlink( IN PVOID SymbolicLink);
PVOIDIoOpenFileOnDevice( IN PVOID SymbolicLink, IN PWCHAR Name);
NTSTATUSNTAPIIopCreateVpb( IN PDEVICE_OBJECT DeviceObject);
VOIDNTAPIIopDereferenceVpbAndFree( IN PVPB Vpb);
VOIDNTAPIIoInitFileSystemImplementation( VOID);
VOIDNTAPIIoInitVpbImplementation( VOID);
NTSTATUSNTAPIIopReferenceDeviceObject( IN PDEVICE_OBJECT DeviceObject);
VOIDNTAPIIopDereferenceDeviceObject( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN ForceUnload);
NTSTATUSNTAPIIopGetRelatedTargetDevice( IN PFILE_OBJECT FileObject, OUT PDEVICE_NODE *DeviceNode);
NTSTATUSNTAPIIoGetRelatedTargetDevice( IN PFILE_OBJECT FileObject, OUT PDEVICE_OBJECT *DeviceObject);
VOIDNTAPIIopUnloadDevice( IN PDEVICE_OBJECT DeviceObject);
PDEVICE_OBJECTNTAPIIopGetDeviceAttachmentBase( IN PDEVICE_OBJECT DeviceObject);
//// IRP Routines//NTSTATUSNTAPIIopCleanupFailedIrp( IN PFILE_OBJECT FileObject, IN PKEVENT EventObject, IN PVOID Buffer OPTIONAL);
VOIDNTAPIIopAbortInterruptedIrp( IN PKEVENT EventObject, IN PIRP Irp);
PIRPNTAPIIopAllocateIrpMustSucceed( IN CCHAR StackSize);
BOOLEANNTAPIIopInitializeReserveIrp( IN PRESERVE_IRP_ALLOCATOR ReserveIrpAllocator);
PIRPNTAPIIopAllocateReserveIrp( IN CCHAR StackSize);
//// Shutdown routines//VOIDIoInitShutdownNotification( VOID);
VOIDNTAPIIoShutdownSystem( IN ULONG Phase);
VOIDNTAPIIopShutdownBaseFileSystems( IN PLIST_ENTRY ListHead);
//// Boot logging support//CODE_SEG("INIT")VOIDIopInitBootLog( IN BOOLEAN StartBootLog);
CODE_SEG("INIT")VOIDIopStartBootLog( VOID);
VOIDIopStopBootLog( VOID);
VOIDIopBootLog( IN PUNICODE_STRING DriverName, IN BOOLEAN Success);
VOIDIopSaveBootLogToFile( VOID);
//// I/O Cancellation Routines//VOIDNTAPIIoCancelThreadIo( IN PETHREAD Thread);
VOIDIoInitCancelHandling( VOID);
//// I/O Completion//VOIDNTAPIIopCompleteRequest( IN PKAPC Apc, IN PKNORMAL_ROUTINE* NormalRoutine, IN PVOID* NormalContext, IN PVOID* SystemArgument1, IN PVOID* SystemArgument2);
//// Error Logging Routines//VOIDNTAPIIopInitErrorLog( VOID);
VOIDNTAPIIopLogWorker( IN PVOID Parameter);
//// Raw File System MiniDriver//BOOLEANRawFsIsRawFileSystemDeviceObject( IN PDEVICE_OBJECT DeviceObject);
CODE_SEG("INIT")NTSTATUSNTAPIRawFsDriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
//// PnP Root MiniDriver//NTSTATUSNTAPIPnpRootDriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUSPnpRootCreateDeviceObject( OUT PDEVICE_OBJECT *DeviceObject);
NTSTATUSPnpRootCreateDevice( IN PUNICODE_STRING ServiceName, OUT PDEVICE_OBJECT *PhysicalDeviceObject, OUT PUNICODE_STRING FullInstancePath);
NTSTATUSPnpRootRegisterDevice( IN PDEVICE_OBJECT DeviceObject);
VOIDPnpRootInitializeDevExtension(VOID);
//// Driver Routines//CODE_SEG("INIT")VOIDFASTCALLIopInitializeBootDrivers( VOID);
CODE_SEG("INIT")VOIDFASTCALLIopInitializeSystemDrivers( VOID);
VOIDNTAPIIopDeleteDriver( IN PVOID ObjectBody);
NTSTATUSIopLoadDriver( _In_ HANDLE ServiceHandle, _Out_ PDRIVER_OBJECT *DriverObject);
NTSTATUSIopGetDriverNames( _In_ HANDLE ServiceHandle, _Out_ PUNICODE_STRING DriverName, _Out_opt_ PUNICODE_STRING ServiceName);
NTSTATUSIopInitializeDriverModule( _In_ PLDR_DATA_TABLE_ENTRY ModuleObject, _In_ HANDLE ServiceHandle, _Out_ PDRIVER_OBJECT *DriverObject, _Out_ NTSTATUS *DriverEntryStatus);
NTSTATUSFASTCALLIopAttachFilterDrivers( IN PDEVICE_NODE DeviceNode, IN HANDLE EnumSubKey, IN HANDLE ClassKey, IN BOOLEAN Lower);
VOIDNTAPIIopReinitializeDrivers( VOID);
VOIDNTAPIIopReinitializeBootDrivers( VOID);
//// File Routines//VOIDNTAPIIopDeleteDevice(IN PVOID ObjectBody);
NTSTATUSNTAPIIopParseDevice( IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object);
NTSTATUSNTAPIIopParseFile( IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object);
VOIDNTAPIIopDeleteFile( IN PVOID ObjectBody);
NTSTATUSNTAPIIopGetSetSecurityObject( IN PVOID ObjectBody, IN SECURITY_OPERATION_CODE OperationCode, IN PSECURITY_INFORMATION SecurityInformation, IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG BufferLength, OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor, IN POOL_TYPE PoolType, IN OUT PGENERIC_MAPPING GenericMapping);
NTSTATUSNTAPIIopQueryName( IN PVOID ObjectBody, IN BOOLEAN HasName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode);
NTSTATUSNTAPIIopQueryNameInternal( IN PVOID ObjectBody, IN BOOLEAN HasName, IN BOOLEAN QueryDosName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode);
VOIDNTAPIIopCloseFile( IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG ProcessHandleCount, IN ULONG SystemHandleCount);
NTSTATUSNTAPIIopAcquireFileObjectLock( _In_ PFILE_OBJECT FileObject, _In_ KPROCESSOR_MODE AccessMode, _In_ BOOLEAN Alertable, _Out_ PBOOLEAN LockFailed);
PVOIDNTAPIIoGetFileObjectFilterContext( IN PFILE_OBJECT FileObject);
NTSTATUSNTAPIIoChangeFileObjectFilterContext( IN PFILE_OBJECT FileObject, IN PVOID FilterContext, IN BOOLEAN Define);
VOIDNTAPIIopDoNameTransmogrify( IN PIRP Irp, IN PFILE_OBJECT FileObject, IN PREPARSE_DATA_BUFFER DataBuffer);
NTSTATUSNTAPIIoComputeDesiredAccessFileObject( IN PFILE_OBJECT FileObject, IN PACCESS_MASK DesiredAccess);
NTSTATUSNTAPIIopGetFileInformation( IN PFILE_OBJECT FileObject, IN ULONG Length, IN FILE_INFORMATION_CLASS FileInfoClass, OUT PVOID Buffer, OUT PULONG ReturnedLength);
BOOLEANNTAPIIopVerifyDeviceObjectOnStack( IN PDEVICE_OBJECT BaseDeviceObject, IN PDEVICE_OBJECT TopDeviceObjectHint);
//// I/O Timer Routines//VOIDFASTCALLIopInitTimerImplementation( VOID);
VOIDNTAPIIopRemoveTimerFromTimerList( IN PIO_TIMER Timer);
//// I/O Completion Routines//VOIDNTAPIIopDeleteIoCompletion( PVOID ObjectBody);
NTSTATUSNTAPIIoSetIoCompletion( IN PVOID IoCompletion, IN PVOID KeyContext, IN PVOID ApcContext, IN NTSTATUS IoStatus, IN ULONG_PTR IoStatusInformation, IN BOOLEAN Quota);
//// Ramdisk Routines//CODE_SEG("INIT")NTSTATUSNTAPIIopStartRamdisk( IN PLOADER_PARAMETER_BLOCK LoaderBlock);
//// Configuration Routines//NTSTATUSIopFetchConfigurationInformation( _Out_ PWSTR* SymbolicLinkList, _In_ GUID Guid, _In_ ULONG ExpectedInterfaces, _Out_ PULONG Interfaces);
VOIDIopStoreSystemPartitionInformation( _In_ PUNICODE_STRING NtSystemPartitionDeviceName, _In_ PUNICODE_STRING OsLoaderPathName);
//// Device action//VOIDPiQueueDeviceAction( _In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_ACTION Action, _In_opt_ PKEVENT CompletionEvent, _Out_opt_ NTSTATUS *CompletionStatus);
NTSTATUSPiPerformSyncDeviceAction( _In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_ACTION Action);
//// PnP notifications//CODE_SEG("PAGE")VOIDPiNotifyDeviceInterfaceChange( _In_ LPCGUID Event, _In_ LPCGUID InterfaceClassGuid, _In_ PUNICODE_STRING SymbolicLinkName);
CODE_SEG("PAGE")VOIDPiNotifyHardwareProfileChange( _In_ LPCGUID Event);
CODE_SEG("PAGE")VOIDPiNotifyTargetDeviceChange( _In_ LPCGUID Event, _In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PTARGET_DEVICE_CUSTOM_NOTIFICATION CustomNotification);
//// PnP IRPs//NTSTATUSPiIrpStartDevice( _In_ PDEVICE_NODE DeviceNode);
NTSTATUSPiIrpStopDevice( _In_ PDEVICE_NODE DeviceNode);
NTSTATUSPiIrpQueryStopDevice( _In_ PDEVICE_NODE DeviceNode);
NTSTATUSPiIrpCancelStopDevice( _In_ PDEVICE_NODE DeviceNode);
NTSTATUSPiIrpQueryDeviceRelations( _In_ PDEVICE_NODE DeviceNode, _In_ DEVICE_RELATION_TYPE Type);
NTSTATUSPiIrpQueryResources( _In_ PDEVICE_NODE DeviceNode, _Out_ PCM_RESOURCE_LIST *Resources);
NTSTATUSPiIrpQueryResourceRequirements( _In_ PDEVICE_NODE DeviceNode, _Out_ PIO_RESOURCE_REQUIREMENTS_LIST *Resources);
NTSTATUSPiIrpQueryDeviceText( _In_ PDEVICE_NODE DeviceNode, _In_ LCID LocaleId, _In_ DEVICE_TEXT_TYPE Type, _Out_ PWSTR *DeviceText);
NTSTATUSPiIrpQueryPnPDeviceState( _In_ PDEVICE_NODE DeviceNode, _Out_ PPNP_DEVICE_STATE DeviceState);
//// Global I/O Data//extern POBJECT_TYPE IoCompletionType;extern PDEVICE_NODE IopRootDeviceNode;extern KSPIN_LOCK IopDeviceTreeLock;extern ULONG IopTraceLevel;extern GENERAL_LOOKASIDE IopMdlLookasideList;extern GENERIC_MAPPING IopCompletionMapping;extern GENERIC_MAPPING IopFileMapping;extern POBJECT_TYPE _IoFileObjectType;extern HAL_DISPATCH _HalDispatchTable;extern LIST_ENTRY IopErrorLogListHead;extern ULONG IopAutoReboot;extern ULONG IopNumTriageDumpDataBlocks;extern PVOID IopTriageDumpDataBlocks[64];extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList;extern PDRIVER_OBJECT IopRootDriverObject;extern KSPIN_LOCK IopDeviceActionLock;extern LIST_ENTRY IopDeviceActionRequestList;extern RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator;extern BOOLEAN IoRemoteBootClient;
//// Inlined Functions//#include "io_x.h"