| //! Block I/O Protocol |
| //! |
| //! Used to abstract mass storage devices to allow code running in the EFI boot services environment |
| //! to access the storage devices without specific knowledge of the type of device or controller that |
| //! manages the device. |
| |
| pub const PROTOCOL_GUID: crate::base::Guid = crate::base::Guid::from_fields( |
| 0x964e5b21, |
| 0x6459, |
| 0x11d2, |
| 0x8e, |
| 0x39, |
| &[0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b], |
| ); |
| |
| pub const REVISION: u64 = 0x0000000000010000u64; |
| pub const REVISION2: u64 = 0x0000000000020001u64; |
| pub const REVISION3: u64 = 0x000000000002001fu64; |
| |
| #[repr(C)] |
| #[derive(Clone, Copy, Debug)] |
| pub struct Media { |
| pub media_id: u32, |
| pub removable_media: bool, |
| pub media_present: bool, |
| pub logical_partition: bool, |
| pub read_only: bool, |
| pub write_caching: bool, |
| pub block_size: u32, |
| pub io_align: u32, |
| pub last_block: crate::base::Lba, |
| pub lowest_aligned_lba: crate::base::Lba, |
| pub logical_blocks_per_physical_block: u32, |
| pub optimal_transfer_length_granularity: u32, |
| } |
| |
| pub type ProtocolReset = eficall! {fn( |
| *mut Protocol, |
| crate::base::Boolean, |
| ) -> crate::base::Status}; |
| |
| pub type ProtocolReadBlocks = eficall! {fn( |
| *mut Protocol, |
| u32, |
| crate::base::Lba, |
| usize, |
| *mut core::ffi::c_void, |
| ) -> crate::base::Status}; |
| |
| pub type ProtocolWriteBlocks = eficall! {fn( |
| *mut Protocol, |
| u32, |
| crate::base::Lba, |
| usize, |
| *mut core::ffi::c_void, |
| ) -> crate::base::Status}; |
| |
| pub type ProtocolFlushBlocks = eficall! {fn( |
| *mut Protocol, |
| ) -> crate::base::Status}; |
| |
| #[repr(C)] |
| pub struct Protocol { |
| pub revision: u64, |
| pub media: *const Media, |
| pub reset: ProtocolReset, |
| pub read_blocks: ProtocolReadBlocks, |
| pub write_blocks: ProtocolWriteBlocks, |
| pub flush_blocks: ProtocolFlushBlocks, |
| } |