| use crate::time::Time; |
| use crate::{guid, Char16, Event, Guid, Status}; |
| use bitflags::bitflags; |
| use core::ffi::c_void; |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct SimpleFileSystemProtocol { |
| pub revision: u64, |
| pub open_volume: |
| unsafe extern "efiapi" fn(this: *mut Self, root: *mut *mut FileProtocolV1) -> Status, |
| } |
| |
| impl SimpleFileSystemProtocol { |
| pub const GUID: Guid = guid!("964e5b22-6459-11d2-8e39-00a0c969723b"); |
| } |
| |
| newtype_enum! { |
| pub enum FileProtocolRevision: u64 => { |
| REVISION_1 = 0x00010000, |
| REVISION_2 = 0x00020000, |
| } |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileProtocolV1 { |
| pub revision: FileProtocolRevision, |
| pub open: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| new_handle: *mut *mut Self, |
| file_name: *const Char16, |
| open_mode: FileMode, |
| attributes: FileAttribute, |
| ) -> Status, |
| pub close: unsafe extern "efiapi" fn(this: *mut Self) -> Status, |
| pub delete: unsafe extern "efiapi" fn(this: *mut Self) -> Status, |
| pub read: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| buffer_size: *mut usize, |
| buffer: *mut c_void, |
| ) -> Status, |
| pub write: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| buffer_size: *mut usize, |
| buffer: *const c_void, |
| ) -> Status, |
| pub get_position: unsafe extern "efiapi" fn(this: *const Self, position: *mut u64) -> Status, |
| pub set_position: unsafe extern "efiapi" fn(this: *mut Self, position: u64) -> Status, |
| pub get_info: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| information_type: *const Guid, |
| buffer_size: *mut usize, |
| buffer: *mut c_void, |
| ) -> Status, |
| pub set_info: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| information_type: *const Guid, |
| buffer_size: usize, |
| buffer: *const c_void, |
| ) -> Status, |
| pub flush: unsafe extern "efiapi" fn(this: *mut Self) -> Status, |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileProtocolV2 { |
| pub v1: FileProtocolV1, |
| pub open_ex: unsafe extern "efiapi" fn( |
| this: *mut Self, |
| new_handle: *mut *mut Self, |
| file_name: *const Char16, |
| open_mode: FileMode, |
| attributes: FileAttribute, |
| token: *mut FileIoToken, |
| ) -> Status, |
| pub read_ex: unsafe extern "efiapi" fn(this: *mut Self, token: *mut FileIoToken) -> Status, |
| pub write_ex: unsafe extern "efiapi" fn(this: *mut Self, token: *mut FileIoToken) -> Status, |
| pub flush_ex: unsafe extern "efiapi" fn(this: *mut Self, token: *mut FileIoToken) -> Status, |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileIoToken { |
| pub event: Event, |
| pub status: Status, |
| pub buffer_size: usize, |
| pub buffer: *mut c_void, |
| } |
| |
| bitflags! { |
| /// File attributes. |
| #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] |
| #[repr(transparent)] |
| pub struct FileAttribute: u64 { |
| /// The file cannot be opened for modification. |
| const READ_ONLY = 0x0000000000000001; |
| |
| /// The file is hidden from normal directory views. |
| const HIDDEN = 0x0000000000000002; |
| |
| /// The file belongs to the system and must not be physically moved. |
| const SYSTEM = 0x0000000000000004; |
| |
| /// The file is a directory. |
| const DIRECTORY = 0x0000000000000010; |
| |
| /// The file is marked for archival by backup software. |
| const ARCHIVE = 0x0000000000000020; |
| |
| /// Mask combining all the valid attributes. |
| const VALID_ATTR = 0x0000000000000037; |
| } |
| } |
| |
| bitflags! { |
| #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] |
| #[repr(transparent)] |
| pub struct FileMode: u64 { |
| const READ = 0x0000000000000001; |
| const WRITE = 0x0000000000000002; |
| const CREATE = 0x8000000000000000; |
| } |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileInfo { |
| pub size: u64, |
| pub file_size: u64, |
| pub physical_size: u64, |
| pub create_time: Time, |
| pub last_access_time: Time, |
| pub modification_time: Time, |
| pub attribute: FileAttribute, |
| |
| /// The null-terminated name of the file. For a root directory, this is an |
| /// empty string. |
| /// |
| /// Note that this field is actually a variable-length array. In order to |
| /// avoid making this struct a DST, the field is represented as a |
| /// zero-length array here. |
| pub file_name: [Char16; 0], |
| } |
| |
| impl FileInfo { |
| pub const ID: Guid = guid!("09576e92-6d3f-11d2-8e39-00a0c969723b"); |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileSystemInfo { |
| pub size: u64, |
| pub read_only: u8, |
| pub volume_size: u64, |
| pub free_space: u64, |
| pub block_size: u32, |
| |
| /// The null-terminated label of the volume. |
| /// |
| /// Note that this field is actually a variable-length array. In order to |
| /// avoid making this struct a DST, the field is represented as a |
| /// zero-length array here. |
| pub volume_label: [Char16; 0], |
| } |
| |
| impl FileSystemInfo { |
| pub const ID: Guid = guid!("09576e93-6d3f-11d2-8e39-00a0c969723b"); |
| } |
| |
| #[derive(Debug)] |
| #[repr(C)] |
| pub struct FileSystemVolumeLabel { |
| /// The null-terminated label of the volume. |
| /// |
| /// Note that this field is actually a variable-length array. In order to |
| /// avoid making this struct a DST, the field is represented as a |
| /// zero-length array here. |
| pub volume_label: [Char16; 0], |
| } |
| |
| impl FileSystemVolumeLabel { |
| pub const ID: Guid = guid!("db47d7d3-fe81-11d3-9a35-0090273fc14d"); |
| } |