mirror of
https://github.com/reactos/reactos.git
synced 2025-01-05 13:59:25 +00:00
a3c58ca76f
The reserve IRP is an IRP which is allocated on system boot and kept during the whole system life. Its purpose is to allow page reads in case of low-memory situations where the system doesn't have enough memory left to allocate an IRP to read from the page file (would be catastrophic situation).
1349 lines
26 KiB
C
1349 lines
26 KiB
C
/*
|
|
* 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
|
|
|
|
//
|
|
// 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;
|
|
|
|
} 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;
|
|
|
|
//
|
|
// Parameters packet for Load/Unload work item's context
|
|
//
|
|
typedef struct _LOAD_UNLOAD_PARAMS
|
|
{
|
|
NTSTATUS Status;
|
|
PCUNICODE_STRING RegistryPath;
|
|
WORK_QUEUE_ITEM WorkItem;
|
|
KEVENT Event;
|
|
PDRIVER_OBJECT DriverObject;
|
|
} LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS;
|
|
|
|
//
|
|
// 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;
|
|
|
|
//
|
|
// Boot Driver Node
|
|
//
|
|
typedef struct _BOOT_DRIVER_NODE
|
|
{
|
|
BOOT_DRIVER_LIST_ENTRY ListEntry;
|
|
UNICODE_STRING Group;
|
|
UNICODE_STRING Name;
|
|
ULONG Tag;
|
|
ULONG ErrorControl;
|
|
} BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE;
|
|
|
|
//
|
|
// 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.
|
|
//
|
|
typedef
|
|
NTSTATUS
|
|
(*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;
|
|
|
|
//
|
|
// Resource code
|
|
//
|
|
ULONG
|
|
NTAPI
|
|
PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopAssignDeviceResources(
|
|
IN PDEVICE_NODE DeviceNode
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopFixupResourceListWithRequirements(
|
|
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
|
|
OUT PCM_RESOURCE_LIST *ResourceList
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopDetectResourceConflict(
|
|
IN PCM_RESOURCE_LIST ResourceList,
|
|
IN BOOLEAN Silent,
|
|
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
|
|
);
|
|
|
|
//
|
|
// PNP Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
PipCallDriverAddDevice(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN BOOLEAN LoadDriver,
|
|
IN PDRIVER_OBJECT DriverObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopInitializePlugPlayServices(
|
|
VOID
|
|
);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
PpInitSystem(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PnpInit2(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
IopInitDriverImplementation(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
IopInitPnpNotificationImplementation(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
IopNotifyPlugPlayNotification(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
|
|
IN LPCGUID Event,
|
|
IN PVOID EventCategoryData1,
|
|
IN PVOID EventCategoryData2
|
|
);
|
|
|
|
NTSTATUS
|
|
IopGetSystemPowerDeviceObject(
|
|
IN PDEVICE_OBJECT *DeviceObject
|
|
);
|
|
|
|
PDEVICE_NODE
|
|
NTAPI
|
|
PipAllocateDeviceNode(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
IopCreateDeviceNode(
|
|
IN PDEVICE_NODE ParentNode,
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
IN PUNICODE_STRING ServiceName,
|
|
OUT PDEVICE_NODE *DeviceNode
|
|
);
|
|
|
|
NTSTATUS
|
|
IopFreeDeviceNode(
|
|
IN PDEVICE_NODE DeviceNode
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode,
|
|
PDEVICE_CAPABILITIES DeviceCaps);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopSynchronousCall(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIO_STACK_LOCATION IoStackLocation,
|
|
OUT PVOID *Information
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopInitiatePnpIrp(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN UCHAR MinorFunction,
|
|
IN PIO_STACK_LOCATION Stack
|
|
);
|
|
|
|
PDEVICE_NODE
|
|
FASTCALL
|
|
IopGetDeviceNode(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
IopActionConfigureChildServices(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
IopActionInitChildServices(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
IopEnumerateDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
IoCreateDriverList(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
IoDestroyDriverList(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
IopInitPlugPlayEvents(VOID);
|
|
|
|
NTSTATUS
|
|
IopQueueTargetDeviceEvent(
|
|
const GUID *Guid,
|
|
PUNICODE_STRING DeviceIds
|
|
);
|
|
|
|
NTSTATUS
|
|
IopInitializePnpServices(
|
|
IN PDEVICE_NODE DeviceNode);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopOpenRegistryKeyEx(
|
|
PHANDLE KeyHandle,
|
|
HANDLE ParentKey,
|
|
PUNICODE_STRING Name,
|
|
ACCESS_MASK DesiredAccess);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopGetRegistryValue(
|
|
IN HANDLE Handle,
|
|
IN PWSTR ValueName,
|
|
OUT PKEY_VALUE_FULL_INFORMATION *Information
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopCreateRegistryKeyEx(
|
|
OUT PHANDLE Handle,
|
|
IN HANDLE BaseHandle OPTIONAL,
|
|
IN PUNICODE_STRING KeyName,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN ULONG CreateOptions,
|
|
OUT PULONG Disposition OPTIONAL
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
IopTraverseDeviceTree(
|
|
PDEVICETREE_TRAVERSE_CONTEXT Context);
|
|
|
|
//
|
|
// PnP Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
IopUpdateRootKey(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
PiInitCacheGroupInformation(
|
|
VOID
|
|
);
|
|
|
|
USHORT
|
|
NTAPI
|
|
PpInitGetGroupOrderIndex(
|
|
IN HANDLE ServiceHandle
|
|
);
|
|
|
|
USHORT
|
|
NTAPI
|
|
PipGetDriverTagPriority(
|
|
IN HANDLE ServiceHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
PnpRegMultiSzToUnicodeStrings(
|
|
IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation,
|
|
OUT PUNICODE_STRING *UnicodeStringList,
|
|
OUT PULONG UnicodeStringCount
|
|
);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
PnpRegSzToString(
|
|
IN PWCHAR RegSzData,
|
|
IN ULONG RegSzLength,
|
|
OUT PUSHORT StringLength OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Initialization Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
IopCreateArcNames(
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopReassignSystemRoot(
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
|
OUT PANSI_STRING NtBootPath
|
|
);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
IoInitSystem(
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|
);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
IopVerifyDiskSignature(
|
|
IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout,
|
|
IN PARC_DISK_SIGNATURE ArcDiskSignature,
|
|
OUT PULONG Signature
|
|
);
|
|
|
|
//
|
|
// Device/Volume Routines
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IopReadyDeviceObjects(
|
|
IN PDRIVER_OBJECT Driver
|
|
);
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
IopInitializeDevice(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN PDRIVER_OBJECT DriverObject
|
|
);
|
|
|
|
NTSTATUS
|
|
IopStartDevice(
|
|
IN PDEVICE_NODE DeviceNode
|
|
);
|
|
|
|
NTSTATUS
|
|
IopStopDevice(
|
|
IN PDEVICE_NODE DeviceNode
|
|
);
|
|
|
|
NTSTATUS
|
|
IopRemoveDevice(
|
|
IN PDEVICE_NODE DeviceNode
|
|
);
|
|
|
|
PVPB
|
|
NTAPI
|
|
IopCheckVpbMounted(
|
|
IN POPEN_PACKET OpenPacket,
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUNICODE_STRING RemainingName,
|
|
OUT PNTSTATUS Status
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopMountVolume(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN BOOLEAN AllowRawMount,
|
|
IN BOOLEAN DeviceIsLocked,
|
|
IN BOOLEAN Alertable,
|
|
OUT PVPB *Vpb
|
|
);
|
|
|
|
PVOID
|
|
IoOpenSymlink(
|
|
IN PVOID SymbolicLink
|
|
);
|
|
|
|
PVOID
|
|
IoOpenFileOnDevice(
|
|
IN PVOID SymbolicLink,
|
|
IN PWCHAR Name
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopCreateVpb(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopDereferenceVpbAndFree(
|
|
IN PVPB Vpb
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IoInitFileSystemImplementation(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IoInitVpbImplementation(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopReferenceDeviceObject(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopDereferenceDeviceObject(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN BOOLEAN ForceUnload
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IoGetRelatedTargetDevice(
|
|
IN PFILE_OBJECT FileObject,
|
|
OUT PDEVICE_OBJECT *DeviceObject
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopUnloadDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
//
|
|
// IRP Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
IopCleanupFailedIrp(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PKEVENT EventObject,
|
|
IN PVOID Buffer OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopAbortInterruptedIrp(
|
|
IN PKEVENT EventObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
PIRP
|
|
NTAPI
|
|
IopAllocateIrpMustSucceed(
|
|
IN CCHAR StackSize
|
|
);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
IopInitializeReserveIrp(
|
|
IN PRESERVE_IRP_ALLOCATOR ReserveIrpAllocator
|
|
);
|
|
|
|
PIRP
|
|
NTAPI
|
|
IopAllocateReserveIrp(
|
|
IN CCHAR StackSize
|
|
);
|
|
|
|
//
|
|
// Shutdown routines
|
|
//
|
|
VOID
|
|
IoInitShutdownNotification(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IoShutdownSystem(
|
|
IN ULONG Phase
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopShutdownBaseFileSystems(
|
|
IN PLIST_ENTRY ListHead
|
|
);
|
|
|
|
//
|
|
// Boot logging support
|
|
//
|
|
VOID
|
|
IopInitBootLog(
|
|
IN BOOLEAN StartBootLog
|
|
);
|
|
|
|
VOID
|
|
IopStartBootLog(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
IopStopBootLog(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
IopBootLog(
|
|
IN PUNICODE_STRING DriverName,
|
|
IN BOOLEAN Success
|
|
);
|
|
|
|
VOID
|
|
IopSaveBootLogToFile(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// I/O Cancellation Routines
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IoCancelThreadIo(
|
|
IN PETHREAD Thread
|
|
);
|
|
|
|
VOID
|
|
IoInitCancelHandling(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// I/O Completion
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IopCompleteRequest(
|
|
IN PKAPC Apc,
|
|
IN PKNORMAL_ROUTINE* NormalRoutine,
|
|
IN PVOID* NormalContext,
|
|
IN PVOID* SystemArgument1,
|
|
IN PVOID* SystemArgument2
|
|
);
|
|
|
|
//
|
|
// Error Logging Routines
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IopInitErrorLog(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopLogWorker(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
//
|
|
// Raw File System MiniDriver
|
|
//
|
|
BOOLEAN
|
|
RawFsIsRawFileSystemDeviceObject(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
RawFsDriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath
|
|
);
|
|
|
|
//
|
|
// PnP Root MiniDriver
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
PnpRootDriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath
|
|
);
|
|
|
|
NTSTATUS
|
|
PnpRootCreateDevice(
|
|
IN PUNICODE_STRING ServiceName,
|
|
IN OPTIONAL PDRIVER_OBJECT DriverObject,
|
|
OUT PDEVICE_OBJECT *PhysicalDeviceObject,
|
|
OUT OPTIONAL PUNICODE_STRING FullInstancePath
|
|
);
|
|
|
|
NTSTATUS
|
|
PnpRootRegisterDevice(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
//
|
|
// Driver Routines
|
|
//
|
|
VOID
|
|
FASTCALL
|
|
IopInitializeBootDrivers(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
FASTCALL
|
|
IopInitializeSystemDrivers(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
|
|
IN PDRIVER_INITIALIZE InitializationFunction,
|
|
IN PUNICODE_STRING RegistryPath,
|
|
IN PCUNICODE_STRING ServiceName,
|
|
PLDR_DATA_TABLE_ENTRY ModuleObject,
|
|
OUT PDRIVER_OBJECT *pDriverObject);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopDeleteDriver(
|
|
IN PVOID ObjectBody
|
|
);
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
IopGetDriverObject(
|
|
OUT PDRIVER_OBJECT *DriverObject,
|
|
IN PUNICODE_STRING ServiceName,
|
|
IN BOOLEAN FileSystem
|
|
);
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
IopLoadServiceModule(
|
|
IN PUNICODE_STRING ServiceName,
|
|
OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopLoadUnloadDriver(
|
|
_In_opt_ PCUNICODE_STRING RegistryPath,
|
|
_Inout_ PDRIVER_OBJECT *DriverObject
|
|
);
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
IopInitializeDriverModule(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN PLDR_DATA_TABLE_ENTRY ModuleObject,
|
|
IN PUNICODE_STRING ServiceName,
|
|
IN BOOLEAN FileSystemDriver,
|
|
OUT PDRIVER_OBJECT *DriverObject
|
|
);
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
IopAttachFilterDrivers(
|
|
IN PDEVICE_NODE DeviceNode,
|
|
IN HANDLE EnumSubKey,
|
|
IN HANDLE ClassKey,
|
|
IN BOOLEAN Lower
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopReinitializeDrivers(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopReinitializeBootDrivers(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// File Routines
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IopDeleteDevice(IN PVOID ObjectBody);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopParseDevice(
|
|
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
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopParseFile(
|
|
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
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopDeleteFile(
|
|
IN PVOID ObjectBody
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopGetSetSecurityObject(
|
|
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
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IopQueryNameFile(
|
|
IN PVOID ObjectBody,
|
|
IN BOOLEAN HasName,
|
|
OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
|
|
IN ULONG Length,
|
|
OUT PULONG ReturnLength,
|
|
IN KPROCESSOR_MODE PreviousMode
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopCloseFile(
|
|
IN PEPROCESS Process OPTIONAL,
|
|
IN PVOID Object,
|
|
IN ACCESS_MASK GrantedAccess,
|
|
IN ULONG ProcessHandleCount,
|
|
IN ULONG SystemHandleCount
|
|
);
|
|
|
|
PVOID
|
|
NTAPI
|
|
IoGetFileObjectFilterContext(
|
|
IN PFILE_OBJECT FileObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IoChangeFileObjectFilterContext(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PVOID FilterContext,
|
|
IN BOOLEAN Define
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopDoNameTransmogrify(
|
|
IN PIRP Irp,
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PREPARSE_DATA_BUFFER DataBuffer
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IoComputeDesiredAccessFileObject(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PACCESS_MASK DesiredAccess
|
|
);
|
|
|
|
//
|
|
// I/O Timer Routines
|
|
//
|
|
VOID
|
|
FASTCALL
|
|
IopInitTimerImplementation(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopRemoveTimerFromTimerList(
|
|
IN PIO_TIMER Timer
|
|
);
|
|
|
|
//
|
|
// I/O Completion Routines
|
|
//
|
|
VOID
|
|
NTAPI
|
|
IopDeleteIoCompletion(
|
|
PVOID ObjectBody
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IoSetIoCompletion(
|
|
IN PVOID IoCompletion,
|
|
IN PVOID KeyContext,
|
|
IN PVOID ApcContext,
|
|
IN NTSTATUS IoStatus,
|
|
IN ULONG_PTR IoStatusInformation,
|
|
IN BOOLEAN Quota
|
|
);
|
|
|
|
//
|
|
// Ramdisk Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
IopStartRamdisk(
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|
);
|
|
|
|
//
|
|
// Configuration Routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList,
|
|
IN GUID Guid,
|
|
IN ULONG ExpectedInterfaces,
|
|
IN PULONG Interfaces
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName,
|
|
IN PUNICODE_STRING OsLoaderPathName
|
|
);
|
|
|
|
//
|
|
// 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 IopNumTriageDumpDataBlocks;
|
|
extern PVOID IopTriageDumpDataBlocks[64];
|
|
extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList;
|
|
extern PDRIVER_OBJECT IopRootDriverObject;
|
|
extern KSPIN_LOCK IopDeviceRelationsSpinLock;
|
|
extern LIST_ENTRY IopDeviceRelationsRequestList;
|
|
extern RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator;
|
|
|
|
//
|
|
// Inlined Functions
|
|
//
|
|
#include "io_x.h"
|