//
// Define this if you want debugging support
//
-#define _IO_DEBUG_ 0x01
+#define _IO_DEBUG_ 0x00
//
// These define the Debug Masks Supported
}
#endif
#else
-#define IOTRACE(x, ...) DPRINT(__VA_ARGS__);
+#define IOTRACE(x, ...) DPRINT(__VA_ARGS__)
#endif
//
#define IO_METHOD_FROM_CTL_CODE(c) (c & 0x00000003)
//
-// Packet Types when piggybacking on the IRP Overlay
+// 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
//
-#define IrpCompletionPacket 0x1
-#define IrpMiniCompletionPacket 0x2
+// 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
//
// We can call the Ob Inlined API, it's the same thing
#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 Context;
- IO_STATUS_BLOCK IoStatus;
-} IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET;
+ PVOID KeyContext;
+ PVOID ApcContext;
+ NTSTATUS IoStatus;
+ ULONG_PTR IoStatusInformation;
+} IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET;
//
// I/O Completion Context for IoSetIoCompletionRoutineEx
PDEVICE_OBJECT DeviceObject;
PIO_WORKITEM_ROUTINE WorkerRoutine;
PVOID Context;
-} IO_WORKITEM, *PIO_WORKITEM;
+} IO_WORKITEM;
//
// I/O Wrapper around the Kernel Interrupt
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
//
PVOID Context;
} DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
+//
+// Resource code
+//
+ULONG
+NTAPI
+IopCalculateResourceListSize(
+ IN PCM_RESOURCE_LIST ResourceList
+);
+
+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
);
IN PDEVICE_OBJECT *DeviceObject
);
+PDEVICE_NODE
+NTAPI
+PipAllocateDeviceNode(
+ IN PDEVICE_OBJECT PhysicalDeviceObject
+);
+
NTSTATUS
IopCreateDeviceNode(
IN PDEVICE_NODE ParentNode,
);
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
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
+);
+
+//
+// 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
//
//
// Device/Volume Routines
//
+VOID
+NTAPI
+IopReadyDeviceObjects(
+ IN PDRIVER_OBJECT Driver
+);
+
NTSTATUS
FASTCALL
IopInitializeDevice(
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 PUNICODE_STRING ServiceName,
- IN OUT PDEVICE_OBJECT *PhysicalDeviceObject
+ OUT PDEVICE_OBJECT *PhysicalDeviceObject,
+ OUT OPTIONAL PUNICODE_STRING FullInstancePath
);
//
//
// File Routines
//
+VOID
+NTAPI
+IopDeleteDevice(IN PVOID ObjectBody);
+
NTSTATUS
NTAPI
IopParseDevice(
PVOID ObjectBody
);
+//
+// Ramdisk Routines
+//
+NTSTATUS
+NTAPI
+IopStartRamdisk(
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
//
// Global I/O Data
//
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