#pragma once // io_driver.h - definitive kernel driver/device I/O model // // Disk controllers register DEVICE_OBJECTs. IRPs are submitted only through // IoCallDriver()/IoSubmitIrp(); drivers complete accepted IRPs by calling // IoCompleteRequest(). There is no legacy DISK_DRIVER submit table. #include #include #include #include typedef struct HAL_API HAL_API; typedef KSTATUS (*DRIVER_ENTRY_FN)(const HAL_API* hal); typedef void (*DRIVER_UNLOAD_FN)(void); struct IRP; typedef struct DRIVER_OBJECT DRIVER_OBJECT; typedef struct DEVICE_OBJECT DEVICE_OBJECT; typedef enum IO_MAJOR_FUNCTION { IRP_MJ_READ = 0, IRP_MJ_WRITE = 1, IRP_MJ_DEVICE_CONTROL = 2, IRP_MJ_MAXIMUM_FUNCTION = 3, } IO_MAJOR_FUNCTION; typedef KSTATUS (*PDRIVER_DISPATCH)(DEVICE_OBJECT* device, struct IRP* irp); struct DRIVER_OBJECT { const char* Name; PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION]; DRIVER_UNLOAD_FN DriverUnload; }; struct DEVICE_OBJECT { DRIVER_OBJECT* DriverObject; void* DeviceExtension; uint32_t Flags; uint32_t AlignmentRequirement; uint64_t SectorCount; uint8_t DiskIndex; }; #define DEVICE_OBJECT_DISK 0x00000001u #define DEVICE_OBJECT_REMOVABLE 0x00000002u __declspec(dllexport) KSTATUS IoCreateDevice(DRIVER_OBJECT* driver, size_t extensionSize, DEVICE_OBJECT** outDevice); __declspec(dllexport) void IoDeleteDevice(DEVICE_OBJECT* device); __declspec(dllexport) KSTATUS IoRegisterDiskDevice(uint8_t driveIndex, DEVICE_OBJECT* device); __declspec(dllexport) DEVICE_OBJECT* IoGetDiskDevice(uint8_t driveIndex); __declspec(dllexport) bool IoDiskDevicePresent(uint8_t driveIndex); __declspec(dllexport) uint64_t IoDiskSectorCount(uint8_t driveIndex); __declspec(dllexport) KSTATUS IoCallDriver(DEVICE_OBJECT* device, struct IRP* irp); __declspec(dllexport) KSTATUS IoReadDiskSectors(uint8_t driveIndex, uint64_t lba, uint32_t count, void* buffer); __declspec(dllexport) KSTATUS IoWriteDiskSectors(uint8_t driveIndex, uint64_t lba, uint32_t count, const void* buffer);