[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / include / internal / io.h
index 6d0867c..9398ef1 100644 (file)
 // 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
 //
@@ -209,11 +227,21 @@ typedef enum _IOP_TRANSFER_TYPE
     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
     {
@@ -224,10 +252,21 @@ typedef struct _IO_COMPLETION_PACKET
             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
@@ -238,7 +277,7 @@ typedef struct _IO_WORKITEM
     PDEVICE_OBJECT DeviceObject;
     PIO_WORKITEM_ROUTINE WorkerRoutine;
     PVOID Context;
-} IO_WORKITEM, *PIO_WORKITEM;
+} IO_WORKITEM;
 
 //
 // I/O Wrapper around the Kernel Interrupt
@@ -329,6 +368,45 @@ typedef struct _OPEN_PACKET
     //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
 //
@@ -414,53 +492,40 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT
 } 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
 );
 
@@ -493,10 +558,17 @@ 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
 );
 
@@ -506,6 +578,15 @@ IopFreeDeviceNode(
 );
 
 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,
@@ -528,8 +609,12 @@ IopActionConfigureChildServices(
 NTSTATUS
 IopActionInitChildServices(
     IN PDEVICE_NODE DeviceNode,
-    IN PVOID Context,
-    IN BOOLEAN BootDrivers
+    IN PVOID Context
+);
+
+NTSTATUS
+IopEnumerateDevice(
+    IN PDEVICE_OBJECT DeviceObject
 );
 
 NTSTATUS
@@ -542,7 +627,7 @@ IoDestroyDriverList(
     VOID
 );
 
-NTSTATUS 
+NTSTATUS
 INIT_FUNCTION
 IopInitPlugPlayEvents(VOID);
 
@@ -554,32 +639,109 @@ IopQueueTargetDeviceEvent(
 
 NTSTATUS
 IopInitializePnpServices(
-    IN PDEVICE_NODE DeviceNode,
-    IN BOOLEAN BootDrivers)
-;
+    IN PDEVICE_NODE DeviceNode);
 
 NTSTATUS
-IopInvalidateDeviceRelations(
-    IN PDEVICE_NODE DeviceNode,
-    IN DEVICE_RELATION_TYPE Type
+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(
@@ -611,7 +773,7 @@ IopMountVolume(
     OUT PVPB *Vpb
 );
 
-PVOID 
+PVOID
 IoOpenSymlink(
     IN PVOID SymbolicLink
 );
@@ -659,6 +821,12 @@ IopDereferenceDeviceObject(
     IN BOOLEAN ForceUnload
 );
 
+NTSTATUS
+NTAPI
+IoGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
+                         OUT PDEVICE_OBJECT *DeviceObject
+);
+
 //
 // IRP Routines
 //
@@ -666,7 +834,8 @@ NTSTATUS
 NTAPI
 IopCleanupFailedIrp(
     IN PFILE_OBJECT FileObject,
-    IN PKEVENT EventObject
+    IN PKEVENT EventObject,
+    IN PVOID Buffer OPTIONAL
 );
 
 VOID
@@ -686,14 +855,14 @@ IoInitShutdownNotification(
 
 VOID
 NTAPI
-IoShutdownRegisteredDevices(
-    VOID
+IoShutdownSystem(
+    IN ULONG Phase
 );
 
 VOID
 NTAPI
-IoShutdownRegisteredFileSystems(
-    VOID
+IopShutdownBaseFileSystems(
+    IN PLIST_ENTRY ListHead
 );
 
 //
@@ -729,7 +898,7 @@ IopSaveBootLogToFile(
 // I/O Cancellation Routines
 //
 VOID
-STDCALL
+NTAPI
 IoCancelThreadIo(
     IN PETHREAD Thread
 );
@@ -776,7 +945,7 @@ RawFsIsRawFileSystemDeviceObject(
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 RawFsDriverEntry(
     IN PDRIVER_OBJECT DriverObject,
     IN PUNICODE_STRING RegistryPath
@@ -786,7 +955,7 @@ RawFsDriverEntry(
 // PnP Root MiniDriver
 //
 NTSTATUS
-STDCALL
+NTAPI
 PnpRootDriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
@@ -794,7 +963,9 @@ PnpRootDriverEntry(
 
 NTSTATUS
 PnpRootCreateDevice(
-    IN OUT PDEVICE_OBJECT *PhysicalDeviceObject
+    IN PUNICODE_STRING ServiceName,
+    OUT PDEVICE_OBJECT *PhysicalDeviceObject,
+    OUT OPTIONAL PUNICODE_STRING FullInstancePath
 );
 
 //
@@ -812,23 +983,21 @@ IopInitializeSystemDrivers(
     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(
@@ -844,7 +1013,13 @@ IopLoadServiceModule(
     OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
 );
 
-NTSTATUS 
+VOID
+NTAPI
+IopLoadUnloadDriver(
+    IN OUT PLOAD_UNLOAD_PARAMS LoadParams
+);
+
+NTSTATUS
 FASTCALL
 IopInitializeDriverModule(
     IN PDEVICE_NODE DeviceNode,
@@ -876,6 +1051,10 @@ IopReinitializeBootDrivers(
 //
 // File Routines
 //
+VOID
+NTAPI
+IopDeleteDevice(IN PVOID ObjectBody);
+
 NTSTATUS
 NTAPI
 IopParseDevice(
@@ -907,17 +1086,17 @@ IopParseFile(
 );
 
 VOID
-STDCALL
+NTAPI
 IopDeleteFile(
     IN PVOID ObjectBody
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 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,
@@ -926,7 +1105,7 @@ IopSecurityFile(
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 IopQueryNameFile(
     IN PVOID ObjectBody,
     IN BOOLEAN HasName,
@@ -937,7 +1116,7 @@ IopQueryNameFile(
 );
 
 VOID
-STDCALL
+NTAPI
 IopCloseFile(
     IN PEPROCESS Process OPTIONAL,
     IN PVOID Object,
@@ -956,7 +1135,7 @@ IopInitTimerImplementation(
 );
 
 VOID
-STDCALL
+NTAPI
 IopRemoveTimerFromTimerList(
     IN PIO_TIMER Timer
 );
@@ -971,60 +1150,12 @@ IopDeleteIoCompletion(
 );
 
 //
-// I/O HAL Entrypoints
+// Ramdisk Routines
 //
 NTSTATUS
-FASTCALL
-xHalQueryDriveLayout(
-    IN PUNICODE_STRING DeviceName,
-    OUT PDRIVE_LAYOUT_INFORMATION *LayoutInfo
-);
-
-#undef HalExamineMBR
-VOID 
-FASTCALL
-HalExamineMBR(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG SectorSize,
-    IN ULONG MBRTypeIdentifier,
-    OUT PVOID *Buffer
-);
-
-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
 );
 
 //
@@ -1032,10 +1163,18 @@ xHalIoWritePartitionTable(
 //
 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