67 lines
2.9 KiB
C
67 lines
2.9 KiB
C
#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 <stdint.h>
|
|
#include <stddef.h>
|
|
#include <ke_status.h>
|
|
#include <ob_object.h>
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 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);
|