pub const HEADER_SIZE: u32 = 0x0000_004C;
pub const LINK_CLSID: &str = "00021401-0000-0000-C000-000000000046";
pub const LINK_FLAG_HAS_LINK_TARGET_ID_LIST: u32 = 1 << 0;
pub const LINK_FLAG_HAS_LINK_INFO: u32 = 1 << 1;
pub const LINK_FLAG_HAS_NAME: u32 = 1 << 2;
pub const LINK_FLAG_HAS_RELATIVE_PATH: u32 = 1 << 3;
pub const LINK_FLAG_HAS_WORKING_DIR: u32 = 1 << 4;
pub const LINK_FLAG_HAS_ARGUMENTS: u32 = 1 << 5;
pub const LINK_FLAG_HAS_ICON_LOCATION: u32 = 1 << 6;
pub const LINK_FLAG_IS_UNICODE: u32 = 1 << 7;
pub const LINK_FLAG_FORCE_NO_LINK_INFO: u32 = 1 << 8;
pub const LINK_FLAG_HAS_EXP_STRING: u32 = 1 << 9;
pub const LINK_FLAG_RUN_IN_SEPARATE_PROCESS: u32 = 1 << 10;
pub const LINK_FLAG_HAS_DARWIN_ID: u32 = 1 << 12;
pub const LINK_FLAG_RUN_AS_USER: u32 = 1 << 13;
pub const LINK_FLAG_HAS_EXP_ICON: u32 = 1 << 14;
pub const LINK_FLAG_NO_PIDL_ALIAS: u32 = 1 << 15;
pub const LINK_FLAG_RUN_WITH_SHIM_LAYER: u32 = 1 << 17;
pub const LINK_FLAG_FORCE_NO_LINK_TRACK: u32 = 1 << 18;
pub const LINK_FLAG_ENABLE_TARGET_METADATA: u32 = 1 << 19;
pub const LINK_FLAG_DISABLE_LINK_PATH_TRACKING: u32 = 1 << 20;
pub const LINK_FLAG_DISABLE_KNOWN_FOLDER_TRACKING: u32 = 1 << 21;
pub const LINK_FLAG_DISABLE_KNOWN_FOLDER_ALIAS: u32 = 1 << 22;
pub const LINK_FLAG_ALLOW_LINK_TO_LINK: u32 = 1 << 23;
pub const LINK_FLAG_UNALIAS_ON_SAVE: u32 = 1 << 24;
pub const LINK_FLAG_PREFER_ENVIRONMENT_PATH: u32 = 1 << 25;
pub const LINK_FLAG_KEEP_LOCAL_ID_LIST_FOR_UNC_TARGET: u32 = 1 << 26;
pub const FILE_ATTRIBUTE_READONLY: u32 = 1 << 0;
pub const FILE_ATTRIBUTE_HIDDEN: u32 = 1 << 1;
pub const FILE_ATTRIBUTE_SYSTEM: u32 = 1 << 2;
pub const FILE_ATTRIBUTE_DIRECTORY: u32 = 1 << 4;
pub const FILE_ATTRIBUTE_ARCHIVE: u32 = 1 << 5;
pub const FILE_ATTRIBUTE_NORMAL: u32 = 1 << 7;
pub const FILE_ATTRIBUTE_TEMPORARY: u32 = 1 << 8;
pub const FILE_ATTRIBUTE_SPARSE_FILE: u32 = 1 << 9;
pub const FILE_ATTRIBUTE_REPARSE_POINT: u32 = 1 << 10;
pub const FILE_ATTRIBUTE_COMPRESSED: u32 = 1 << 11;
pub const FILE_ATTRIBUTE_OFFLINE: u32 = 1 << 12;
pub const FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: u32 = 1 << 13;
pub const FILE_ATTRIBUTE_ENCRYPTED: u32 = 1 << 14;
pub const EXTRA_ENVIRONMENT_VARIABLE_DATA_BLOCK: u32 = 0xA000_0001;
pub const EXTRA_CONSOLE_DATA_BLOCK: u32 = 0xA000_0002;
pub const EXTRA_TRACKER_DATA_BLOCK: u32 = 0xA000_0003;
pub const EXTRA_CONSOLE_FE_DATA_BLOCK: u32 = 0xA000_0004;
pub const EXTRA_SPECIAL_FOLDER_DATA_BLOCK: u32 = 0xA000_0005;
pub const EXTRA_DARWIN_DATA_BLOCK: u32 = 0xA000_0006;
pub const EXTRA_ICON_ENVIRONMENT_DATA_BLOCK: u32 = 0xA000_0007;
pub const EXTRA_SHIM_DATA_BLOCK: u32 = 0xA000_0008;
pub const EXTRA_PROPERTY_STORE_DATA_BLOCK: u32 = 0xA000_0009;
pub const EXTRA_VISTA_AND_ABOVE_ID_LIST_DATA_BLOCK: u32 = 0xA000_000A;
pub const EXTRA_KNOWN_FOLDER_DATA_BLOCK: u32 = 0xA000_000B;
pub const EXTRA_DATA_TERMINAL_BLOCK_SIZE: u32 = 0x0000_0004;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn header_size_and_clsid() {
assert_eq!(HEADER_SIZE, 0x0000_004C);
assert_eq!(LINK_CLSID, "00021401-0000-0000-C000-000000000046");
}
#[test]
fn link_flags_bit_positions() {
assert_eq!(LINK_FLAG_HAS_LINK_TARGET_ID_LIST, 1 << 0);
assert_eq!(LINK_FLAG_HAS_LINK_INFO, 1 << 1);
assert_eq!(LINK_FLAG_HAS_NAME, 1 << 2);
assert_eq!(LINK_FLAG_HAS_RELATIVE_PATH, 1 << 3);
assert_eq!(LINK_FLAG_HAS_WORKING_DIR, 1 << 4);
assert_eq!(LINK_FLAG_HAS_ARGUMENTS, 1 << 5);
assert_eq!(LINK_FLAG_HAS_ICON_LOCATION, 1 << 6);
assert_eq!(LINK_FLAG_IS_UNICODE, 1 << 7);
assert_eq!(LINK_FLAG_FORCE_NO_LINK_INFO, 1 << 8);
assert_eq!(LINK_FLAG_HAS_EXP_STRING, 1 << 9);
assert_eq!(LINK_FLAG_RUN_IN_SEPARATE_PROCESS, 1 << 10);
assert_eq!(LINK_FLAG_HAS_DARWIN_ID, 1 << 12);
assert_eq!(LINK_FLAG_RUN_AS_USER, 1 << 13);
assert_eq!(LINK_FLAG_HAS_EXP_ICON, 1 << 14);
assert_eq!(LINK_FLAG_NO_PIDL_ALIAS, 1 << 15);
assert_eq!(LINK_FLAG_RUN_WITH_SHIM_LAYER, 1 << 17);
assert_eq!(LINK_FLAG_FORCE_NO_LINK_TRACK, 1 << 18);
assert_eq!(LINK_FLAG_ENABLE_TARGET_METADATA, 1 << 19);
assert_eq!(LINK_FLAG_DISABLE_LINK_PATH_TRACKING, 1 << 20);
assert_eq!(LINK_FLAG_DISABLE_KNOWN_FOLDER_TRACKING, 1 << 21);
assert_eq!(LINK_FLAG_DISABLE_KNOWN_FOLDER_ALIAS, 1 << 22);
assert_eq!(LINK_FLAG_ALLOW_LINK_TO_LINK, 1 << 23);
assert_eq!(LINK_FLAG_UNALIAS_ON_SAVE, 1 << 24);
assert_eq!(LINK_FLAG_PREFER_ENVIRONMENT_PATH, 1 << 25);
assert_eq!(LINK_FLAG_KEEP_LOCAL_ID_LIST_FOR_UNC_TARGET, 1 << 26);
}
#[test]
fn file_attributes_bit_positions() {
assert_eq!(FILE_ATTRIBUTE_READONLY, 1 << 0);
assert_eq!(FILE_ATTRIBUTE_HIDDEN, 1 << 1);
assert_eq!(FILE_ATTRIBUTE_SYSTEM, 1 << 2);
assert_eq!(FILE_ATTRIBUTE_DIRECTORY, 1 << 4);
assert_eq!(FILE_ATTRIBUTE_ARCHIVE, 1 << 5);
assert_eq!(FILE_ATTRIBUTE_NORMAL, 1 << 7);
assert_eq!(FILE_ATTRIBUTE_TEMPORARY, 1 << 8);
assert_eq!(FILE_ATTRIBUTE_SPARSE_FILE, 1 << 9);
assert_eq!(FILE_ATTRIBUTE_REPARSE_POINT, 1 << 10);
assert_eq!(FILE_ATTRIBUTE_COMPRESSED, 1 << 11);
assert_eq!(FILE_ATTRIBUTE_OFFLINE, 1 << 12);
assert_eq!(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, 1 << 13);
assert_eq!(FILE_ATTRIBUTE_ENCRYPTED, 1 << 14);
}
#[test]
fn extra_data_block_signatures() {
assert_eq!(EXTRA_ENVIRONMENT_VARIABLE_DATA_BLOCK, 0xA000_0001);
assert_eq!(EXTRA_CONSOLE_DATA_BLOCK, 0xA000_0002);
assert_eq!(EXTRA_TRACKER_DATA_BLOCK, 0xA000_0003);
assert_eq!(EXTRA_CONSOLE_FE_DATA_BLOCK, 0xA000_0004);
assert_eq!(EXTRA_SPECIAL_FOLDER_DATA_BLOCK, 0xA000_0005);
assert_eq!(EXTRA_DARWIN_DATA_BLOCK, 0xA000_0006);
assert_eq!(EXTRA_ICON_ENVIRONMENT_DATA_BLOCK, 0xA000_0007);
assert_eq!(EXTRA_SHIM_DATA_BLOCK, 0xA000_0008);
assert_eq!(EXTRA_PROPERTY_STORE_DATA_BLOCK, 0xA000_0009);
assert_eq!(EXTRA_VISTA_AND_ABOVE_ID_LIST_DATA_BLOCK, 0xA000_000A);
assert_eq!(EXTRA_KNOWN_FOLDER_DATA_BLOCK, 0xA000_000B);
}
#[test]
fn extra_data_terminal_block() {
assert_eq!(EXTRA_DATA_TERMINAL_BLOCK_SIZE, 0x0000_0004);
}
}