#pragma once // io_file.h - VFS layer // Filesystem drivers register an IO_FILESYSTEM vtable via IoRegisterFilesystem. // Kernel and user code open files through IoOpenFile. #include #include #include #include // --------------------------------------------------------------------------- // Filesystem driver vtable - filled in by fat32.sys (or any future fs driver) // --------------------------------------------------------------------------- typedef struct IO_FILESYSTEM { // Open a file by absolute path (e.g. "apps\\shell.exe"). // Returns an opaque per-file driver cookie in* fileCtx. KSTATUS (*Open)(struct IO_FILESYSTEM* fs, const char* path, void **fileCtx); // Read up to 'size' bytes at 'offset' into 'buf'. // Sets* bytesRead to actual bytes copied. KSTATUS (*Read)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t offset, void* buf, size_t size, size_t* bytesRead); // Return the file size in bytes. uint64_t (*GetSize)(struct IO_FILESYSTEM* fs, void* fileCtx); // Release any resources the driver allocated for fileCtx. void (*Close)(struct IO_FILESYSTEM* fs, void* fileCtx); // Optional driver-private data. void* DriverCtx; } IO_FILESYSTEM; // --------------------------------------------------------------------------- // FILE_OBJECT - the kernel object returned to callers // --------------------------------------------------------------------------- typedef struct FILE_OBJECT { OBJECT Header; // must be first IO_FILESYSTEM* Fs; void* FileCtx; // driver cookie uint64_t Size; uint64_t Offset; // current position for sequential reads } FILE_OBJECT; typedef struct IO_VOLUME_PARAMS { uint8_t DiskIndex; // which disk in HAL_DISK table uint64_t PartitionLba; // starting LBA of this partition uint64_t PartitionSize; // sectors, for bounds checking } IO_VOLUME_PARAMS; // --------------------------------------------------------------------------- // Registration - called by fat32.sys from DriverEntry // --------------------------------------------------------------------------- // driveIndex matches the index passed to IoRegisterDisk. KSTATUS IoRegisterFilesystem(uint8_t driveIndex, IO_FILESYSTEM* fs, const IO_VOLUME_PARAMS *vol); // --------------------------------------------------------------------------- // Kernel-side API // --------------------------------------------------------------------------- KSTATUS IoOpenFile(const char* path, FILE_OBJECT **out); KSTATUS IoReadFile(FILE_OBJECT* file, void* buf, size_t size, size_t* bytesRead); KSTATUS IoSeekFile(FILE_OBJECT* file, uint64_t offset); uint64_t IoGetFileSize(FILE_OBJECT* file); void IoCloseFile(FILE_OBJECT* file);