use bitvec::prelude::*;
use core::marker::PhantomData;
use crate::types::Guid;
pub(crate) const KIB: u16 = 1024;
pub(crate) const MIB: u32 = 1024 * (KIB as u32);
pub(crate) const GIB: u32 = 1024 * MIB;
pub(crate) const TIB: u64 = 1024 * (GIB as u64);
pub(crate) const HEADER1_OFFSET: u32 = 64 * (KIB as u32);
pub(crate) const HEADER2_OFFSET: u32 = 128 * (KIB as u32);
pub(crate) const REGION_TABLE1_OFFSET: u32 = 192 * (KIB as u32);
pub(crate) const REGION_TABLE2_OFFSET: u32 = 256 * (KIB as u32);
pub(crate) const LOG_OFFSET: u32 = MIB;
pub(crate) const LOG_LENGTH: u32 = MIB;
pub(crate) const BAT_REGION_OFFSET: u32 = 2 * MIB;
pub(crate) const METADATA_REGION_SIZE: u32 = MIB;
pub(crate) const HEADER_SIZE: u16 = 4096;
pub(crate) const HEADER_BUFFER_SIZE: usize = MIB as usize;
pub(crate) const REGION_TABLE_SIZE: u32 = 64 * 1024;
pub(crate) const METADATA_TABLE_SIZE: u32 = 64 * 1024;
pub(crate) const TABLE_HEADER_SIZE: u8 = 32;
pub(crate) const TABLE_ENTRY_SIZE: u8 = 32;
pub(crate) const LOCATOR_HEADER_SIZE: u8 = 20;
pub(crate) const KV_ENTRY_SIZE: u8 = 12;
pub(crate) const REGION_ENTRY_SIZE: u8 = 32;
pub(crate) const MAX_REGION_ENTRIES: u16 = 2047;
pub(crate) const CREATOR_SIZE: u16 = 512;
pub(crate) const RT_HEADER_SIZE: u8 = 16;
pub(crate) const ENTRY_HEADER_SIZE: u8 = 64;
pub(crate) const DESCRIPTOR_SIZE: u8 = 32;
pub(crate) const SECTOR_SIZE: u16 = 4096;
pub(crate) const SIGNATURE_LOGE: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"loge"),
_ord: PhantomData,
};
pub(crate) const SIGNATURE_DESC: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"desc"),
_ord: PhantomData,
};
pub(crate) const SIGNATURE_ZERO: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"zero"),
_ord: PhantomData,
};
#[cfg(test)]
pub(crate) const SIGNATURE_DATA: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"data"),
_ord: PhantomData,
};
pub(crate) const VHDX_SIGNATURE_BYTES: BitArray<u64, Lsb0> = BitArray {
data: u64::from_le_bytes(*b"vhdxfile"),
_ord: PhantomData,
};
pub(crate) const HEADER_SIGNATURE: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"head"),
_ord: PhantomData,
};
pub(crate) const REGION_SIGNATURE: BitArray<u32, Lsb0> = BitArray {
data: u32::from_le_bytes(*b"regi"),
_ord: PhantomData,
};
pub(crate) const METADATA_SIGNATURE: BitArray<u64, Lsb0> = BitArray {
data: u64::from_le_bytes(*b"metadata"),
_ord: PhantomData,
};
pub(crate) const BAT_REGION_GUID: Guid = Guid::from_bytes([
0x66, 0x77, 0xC2, 0x2D, 0x23, 0xF6, 0x00, 0x42, 0x9D, 0x64, 0x11, 0x5E, 0x9B, 0xFD, 0x4A, 0x08,
]);
pub(crate) const METADATA_REGION_GUID: Guid = Guid::from_bytes([
0x06, 0xA2, 0x7C, 0x8B, 0x90, 0x47, 0x9A, 0x4B, 0xB8, 0xFE, 0x57, 0x5F, 0x05, 0x0F, 0x88, 0x6E,
]);
pub(crate) const FILE_PARAMETERS_GUID: Guid = Guid::from_bytes([
0x37, 0x67, 0xA1, 0xCA, 0x36, 0xFA, 0x43, 0x4D, 0xB3, 0xB6, 0x33, 0xF0, 0xAA, 0x44, 0xE7, 0x6B,
]);
pub(crate) const VIRTUAL_DISK_SIZE_GUID: Guid = Guid::from_bytes([
0x24, 0x42, 0xA5, 0x2F, 0x1B, 0xCD, 0x76, 0x48, 0xB2, 0x11, 0x5D, 0xBE, 0xD8, 0x3B, 0xF4, 0xB8,
]);
pub(crate) const VIRTUAL_DISK_ID_GUID: Guid = Guid::from_bytes([
0xAB, 0x12, 0xCA, 0xBE, 0xE6, 0xB2, 0x23, 0x45, 0x93, 0xEF, 0xC3, 0x09, 0xE0, 0x00, 0xC7, 0x46,
]);
pub(crate) const LOGICAL_SECTOR_SIZE_GUID: Guid = Guid::from_bytes([
0x1D, 0xBF, 0x41, 0x81, 0x6F, 0xA9, 0x09, 0x47, 0xBA, 0x47, 0xF2, 0x33, 0xA8, 0xFA, 0xAB, 0x5F,
]);
pub(crate) const PHYSICAL_SECTOR_SIZE_GUID: Guid = Guid::from_bytes([
0xC7, 0x48, 0xA3, 0xCD, 0x5D, 0x44, 0x71, 0x44, 0x9C, 0xC9, 0xE9, 0x88, 0x52, 0x51, 0xC5, 0x56,
]);
pub(crate) const PARENT_LOCATOR_GUID: Guid = Guid::from_bytes([
0x2D, 0x5F, 0xD3, 0xA8, 0x0B, 0xB3, 0x4D, 0x45, 0xAB, 0xF7, 0xD3, 0xD8, 0x48, 0x34, 0xAB, 0x0C,
]);
pub(crate) const LOCATOR_TYPE_VHDX_GUID: Guid = Guid::from_bytes([
0xB7, 0xEF, 0x4A, 0xB0, 0x9E, 0xD1, 0x81, 0x4A, 0xB7, 0x89, 0x25, 0xB8, 0xE9, 0x44, 0x59, 0x13,
]);
pub(crate) const KNOWN_REGION_GUIDS: &[Guid] = &[BAT_REGION_GUID, METADATA_REGION_GUID];
pub(crate) const KNOWN_METADATA_GUIDS: &[Guid] = &[
FILE_PARAMETERS_GUID,
VIRTUAL_DISK_SIZE_GUID,
VIRTUAL_DISK_ID_GUID,
LOGICAL_SECTOR_SIZE_GUID,
PHYSICAL_SECTOR_SIZE_GUID,
PARENT_LOCATOR_GUID,
];
pub(crate) const FP_BLOCK_SIZE: std::ops::Range<usize> = 0..32;
pub(crate) const FP_BITFIELDS: std::ops::Range<usize> = 32..64;
pub(crate) const FP_LEAVE_BLOCK_ALLOCATED: usize = 32;
pub(crate) const FP_HAS_PARENT: usize = 33;
pub(crate) const FP_RESERVED_START: usize = 34;
pub(crate) const FP_BITS_END: usize = 64;