// 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 DbgPrintEx
+#define IOTRACE(x, ...) \
+ { \
+ DbgPrintEx("%s [%.16s] - ", \
+ __FUNCTION__, \
+ PsGetCurrentProcess()->ImageFileName); \
+ DbgPrintEx(__VA_ARGS__); \
+ }
#else
-#define IOTRACE(x, ...) \
- if (x & IopTraceLevel) DbgPrint(__VA_ARGS__)
+#define IOTRACE(x, ...) \
+ if (x & IopTraceLevel) \
+ { \
+ DbgPrint("%s [%.16s] - ", \
+ __FUNCTION__, \
+ PsGetCurrentProcess()->ImageFileName); \
+ DbgPrint(__VA_ARGS__); \
+ }
#endif
#else
#define IOTRACE(x, ...) DPRINT(__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)
//
-// Packet Types when piggybacking on the IRP Overlay
+// Bugcheck codes for RAM disk booting
//
-#define IrpCompletionPacket 0x1
-#define IrpMiniCompletionPacket 0x2
-
//
-// Number of partition tables in the Boot Record
+// 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
//
-#define PARTITION_TBL_SIZE 4
+// Unable to create symbolic link pointing to the RAM disk device
+//
+#define RD_SYMLINK_CREATE_FAILED 5
//
// We can call the Ob Inlined API, it's the same thing
//
#define IopAllocateMdlFromLookaside \
- ObpAllocateCapturedAttributes
+ ObpAllocateObjectCreateInfoBuffer
#define IopFreeMdlFromLookaside \
ObpFreeCapturedAttributes
-//
-// Returns the size of a CM_RESOURCE_LIST
-//
-#define CM_RESOURCE_LIST_SIZE(ResList) \
- (ResList->Count == 1) ? \
- FIELD_OFFSET( \
- CM_RESOURCE_LIST, \
- List[0].PartialResourceList. \
- PartialDescriptors[(ResList)-> \
- List[0]. \
- PartialResourceList. \
- Count]) \
- : \
- FIELD_OFFSET(CM_RESOURCE_LIST, List)
-
//
// Determines if the IRP is Synchronous
//
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 _IO_COMPLETION_PACKET
+typedef struct _IOP_MINI_COMPLETION_PACKET
{
struct
{
ULONG PacketType;
};
};
- PVOID Key;
+ 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;
- IO_STATUS_BLOCK IoStatus;
-} IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET;
+ PIO_COMPLETION_ROUTINE CompletionRoutine;
+} IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT;
//
// I/O Wrapper around the Executive Work Item
PDEVICE_OBJECT DeviceObject;
PIO_WORKITEM_ROUTINE WorkerRoutine;
PVOID Context;
-} IO_WORKITEM, *PIO_WORKITEM;
+} IO_WORKITEM;
//
// I/O Wrapper around the Kernel Interrupt
//PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update
} OPEN_PACKET, *POPEN_PACKET;
+//
+// Parameters packet for Load/Unload work item's context
+//
+typedef struct _LOAD_UNLOAD_PARAMS
+{
+ NTSTATUS Status;
+ PUNICODE_STRING ServiceName;
+ 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
//
} DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
//
-// Internal Representation of a Disk
+// Resource code
//
-typedef struct _DISKENTRY
-{
- LIST_ENTRY ListEntry;
- ULONG DiskNumber;
- ULONG Signature;
- ULONG Checksum;
- PDEVICE_OBJECT DeviceObject;
-} DISKENTRY, *PDISKENTRY;
+ULONG
+NTAPI
+IopCalculateResourceListSize(
+ IN PCM_RESOURCE_LIST ResourceList
+);
-//
-// Partition Table Entry
-//
-#include <pshpack1.h>
-typedef struct _PARTITION
-{
- UCHAR BootFlags;
- UCHAR StartingHead;
- UCHAR StartingSector;
- UCHAR StartingCylinder;
- UCHAR PartitionType;
- UCHAR EndingHead;
- UCHAR EndingSector;
- UCHAR EndingCylinder;
- ULONG StartingBlock;
- ULONG SectorCount;
-} PARTITION, *PPARTITION;
-
-//
-// Boot Record Structure
-//
-typedef struct _PARTITION_SECTOR
-{
- UCHAR BootCode[440];
- ULONG Signature;
- UCHAR Reserved[2];
- PARTITION Partition[PARTITION_TBL_SIZE];
- USHORT Magic;
-} PARTITION_SECTOR, *PPARTITION_SECTOR;
-#include <poppack.h>
+NTSTATUS
+NTAPI
+IopAssignDeviceResources(
+ IN PDEVICE_NODE DeviceNode
+);
//
// PNP Routines
//
-VOID
-PnpInit(
+NTSTATUS
+NTAPI
+PipCallDriverAddDevice(
+ IN PDEVICE_NODE DeviceNode,
+ IN BOOLEAN LoadDriver,
+ IN PDRIVER_OBJECT DriverObject
+);
+
+NTSTATUS
+NTAPI
+IopInitializePlugPlayServices(
+ VOID
+);
+
+BOOLEAN
+NTAPI
+PpInitSystem(
VOID
);
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
+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,
NTSTATUS
IopActionInitChildServices(
IN PDEVICE_NODE DeviceNode,
- IN PVOID Context,
- IN BOOLEAN BootDrivers
+ IN PVOID Context
+);
+
+NTSTATUS
+IopEnumerateDevice(
+ IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
VOID
);
-NTSTATUS
+NTSTATUS
INIT_FUNCTION
IopInitPlugPlayEvents(VOID);
NTSTATUS
IopInitializePnpServices(
- IN PDEVICE_NODE DeviceNode,
- IN BOOLEAN BootDrivers)
-;
+ 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
+);
//
-// Initialization Routines
+// PnP Routines
//
NTSTATUS
-IoCreateArcNames(
+NTAPI
+IopUpdateRootKey(
VOID
);
NTSTATUS
-IoCreateSystemRootLink(
- IN PCHAR ParameterLine
+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
);
//
// Device/Volume Routines
//
+VOID
+NTAPI
+IopReadyDeviceObjects(
+ IN PDRIVER_OBJECT Driver
+);
+
NTSTATUS
FASTCALL
IopInitializeDevice(
OUT PVPB *Vpb
);
-PVOID
+PVOID
IoOpenSymlink(
IN PVOID SymbolicLink
);
IN BOOLEAN ForceUnload
);
+NTSTATUS
+NTAPI
+IoGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
+ OUT PDEVICE_OBJECT *DeviceObject
+);
+
//
// IRP Routines
//
VOID
NTAPI
-IoShutdownRegisteredDevices(
- VOID
+IoShutdownSystem(
+ IN ULONG Phase
);
VOID
NTAPI
-IoShutdownRegisteredFileSystems(
- VOID
+IopShutdownBaseFileSystems(
+ IN PLIST_ENTRY ListHead
);
//
NTSTATUS
PnpRootCreateDevice(
- IN OUT PDEVICE_OBJECT *PhysicalDeviceObject
+ IN PUNICODE_STRING ServiceName,
+ OUT PDEVICE_OBJECT *PhysicalDeviceObject,
+ OUT OPTIONAL PUNICODE_STRING FullInstancePath
);
//
VOID
);
+NTSTATUS
+NTAPI
+IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
+ IN PDRIVER_INITIALIZE InitializationFunction,
+ IN PUNICODE_STRING RegistryPath,
+ IN PVOID DllBase,
+ IN ULONG SizeOfImage,
+ OUT PDRIVER_OBJECT *pDriverObject);
+
VOID
NTAPI
IopDeleteDriver(
IN PVOID ObjectBody
);
-NTSTATUS
-FASTCALL
-IopCreateDriverObject(
- OUT PDRIVER_OBJECT *DriverObject,
- IN PUNICODE_STRING ServiceName,
- IN ULONG CreateAttributes,
- IN BOOLEAN FileSystemDriver,
- IN PVOID DriverImageStart,
- IN ULONG DriverImageSize
-);
-
NTSTATUS
FASTCALL
IopGetDriverObject(
OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
);
-NTSTATUS
+VOID
+NTAPI
+IopLoadUnloadDriver(
+ IN OUT PLOAD_UNLOAD_PARAMS LoadParams
+);
+
+NTSTATUS
FASTCALL
IopInitializeDriverModule(
IN PDEVICE_NODE DeviceNode,
//
// File Routines
//
+VOID
+NTAPI
+IopDeleteDevice(IN PVOID ObjectBody);
+
NTSTATUS
NTAPI
IopParseDevice(
IopSecurityFile(
IN PVOID ObjectBody,
IN SECURITY_OPERATION_CODE OperationCode,
- IN SECURITY_INFORMATION SecurityInformation,
+ IN PSECURITY_INFORMATION SecurityInformation,
IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
IN OUT PULONG BufferLength,
OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
);
//
-// I/O HAL Entrypoints
+// Ramdisk Routines
//
NTSTATUS
-FASTCALL
-xHalQueryDriveLayout(
- IN PUNICODE_STRING DeviceName,
- OUT PDRIVE_LAYOUT_INFORMATION *LayoutInfo
-);
-
-VOID
-FASTCALL
-xHalIoAssignDriveLetters(
- IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock,
- IN PSTRING NtDeviceName,
- OUT PUCHAR NtSystemPath,
- OUT PSTRING NtSystemPathString
-);
-
-NTSTATUS
-FASTCALL
-xHalIoReadPartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN BOOLEAN ReturnRecognizedPartitions,
- OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer
-);
-
-NTSTATUS
-FASTCALL
-xHalIoSetPartitionInformation(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG PartitionNumber,
- IN ULONG PartitionType
-);
-
-NTSTATUS
-FASTCALL
-xHalIoWritePartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG SectorsPerTrack,
- IN ULONG NumberOfHeads,
- IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer
+NTAPI
+IopStartRamdisk(
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
//
//
extern POBJECT_TYPE IoCompletionType;
extern PDEVICE_NODE IopRootDeviceNode;
+extern KSPIN_LOCK IopDeviceTreeLock;
extern ULONG IopTraceLevel;
-extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
+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;
//
// Inlined Functions