├── .github └── workflows │ └── rust.yml ├── .gitignore ├── .gitmodules ├── .idea ├── modules.xml ├── stormlib-rs.iml ├── vcs.xml └── workspace.xml ├── Cargo.toml ├── README.md ├── crates ├── stormlib-bindgen │ ├── Cargo.toml │ └── src │ │ ├── main.rs │ │ └── wrapper.hpp ├── stormlib-sys │ ├── Cargo.toml │ ├── build.rs │ └── src │ │ ├── bindings_linux.rs │ │ ├── bindings_macos.rs │ │ ├── bindings_windows.rs │ │ └── lib.rs └── stormlib │ ├── Cargo.toml │ └── src │ ├── constants.rs │ ├── error.rs │ ├── lib.rs │ └── util.rs ├── rustfmt.toml └── samples ├── test_tft.w3x ├── war3map.j └── 中文.w3x /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | test: 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | os: [macos-latest, ubuntu-latest, windows-latest] 18 | include: 19 | - os: macos-latest 20 | - os: ubuntu-latest 21 | - os: windows-latest 22 | steps: 23 | - uses: actions/checkout@v2 24 | with: 25 | submodules: true 26 | - name: Run tests 27 | run: cargo test --all 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.lock 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "deps/StormLib"] 2 | path = deps/StormLib 3 | url = https://github.com/ladislav-zezula/StormLib.git 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/stormlib-rs.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 41 | 42 | 44 | 45 | 47 | 48 | 50 | 51 | 52 | 53 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 75 | 76 | 77 | 78 | 79 | 81 | 82 | 83 | 94 | 95 | 106 | 107 | 118 | 119 | 130 | 131 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 156 | 157 | 158 | 159 | 160 | 1607399247231 161 | 167 | 168 | 169 | 170 | 172 | 173 | 182 | 184 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "./crates/stormlib-sys", 4 | "./crates/stormlib-bindgen", 5 | "./crates/stormlib" 6 | ] 7 | 8 | [patch.crates-io] 9 | stormlib-sys = { path = "./crates/stormlib-sys" } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Rust](https://github.com/wc3tools/stormlib-rs/actions/workflows/rust.yml/badge.svg)](https://github.com/wc3tools/stormlib-rs/actions/workflows/rust.yml) 2 | 3 | Rust [StormLib](https://github.com/ladislav-zezula/StormLib) binding for working with Blizzard MPQ archives 4 | - 5 | 6 | ```rust 7 | fn test_read_utf8() { 8 | let mut archive = Archive::open( 9 | "../../samples/中文.w3x", 10 | OpenArchiveFlags::MPQ_OPEN_NO_LISTFILE | OpenArchiveFlags::MPQ_OPEN_NO_ATTRIBUTES, 11 | ) 12 | .unwrap(); 13 | let mut f = archive.open_file("war3map.j").unwrap(); 14 | assert_eq!( 15 | f.read_all().unwrap(), 16 | std::fs::read("../../samples/war3map.j").unwrap() 17 | ); 18 | } 19 | ``` 20 | -------------------------------------------------------------------------------- /crates/stormlib-bindgen/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "stormlib-bindgen" 3 | version = "0.1.1" 4 | authors = ["Flux Xu "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | bindgen = "0.69.4" -------------------------------------------------------------------------------- /crates/stormlib-bindgen/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | fn main() { 4 | // The bindgen::Builder is the main entry point 5 | // to bindgen, and lets you build up options for 6 | // the resulting bindings. 7 | let mut bindings = bindgen::Builder::default() 8 | // The input header we would like to generate 9 | // bindings for. 10 | .clang_arg("-I./deps/StormLib/src") 11 | .header("./crates/stormlib-bindgen/src/wrapper.hpp") 12 | // Tell cargo to invalidate the built crate whenever any of the 13 | // included header files changed. 14 | .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) 15 | .allowlist_type("^S[A-Z].+") 16 | .allowlist_function("^S[A-Z].+") 17 | .allowlist_var("^ERROR_.+"); 18 | 19 | for var in VARS { 20 | bindings = bindings.allowlist_var(var); 21 | } 22 | 23 | #[cfg(target_os = "windows")] 24 | let bindings = bindings.blocklist_function("SetLastError"); 25 | 26 | let bindings = bindings 27 | // Finish the builder and generate the bindings. 28 | .generate() 29 | // Unwrap the Result and panic on failure. 30 | .expect("Unable to generate bindings"); 31 | 32 | // Write the bindings to the $OUT_DIR/bindings.rs file. 33 | let out_path = PathBuf::from("./crates/stormlib-sys/src"); 34 | #[cfg(target_os = "windows")] 35 | let file_name = "bindings_windows.rs"; 36 | #[cfg(target_os = "linux")] 37 | let file_name = "bindings_linux.rs"; 38 | #[cfg(target_os = "macos")] 39 | let file_name = "bindings_macos.rs"; 40 | bindings 41 | .write_to_file(out_path.join(file_name)) 42 | .expect("Couldn't write bindings!"); 43 | } 44 | 45 | const VARS: &[&str] = &[ 46 | "STORMLIB_VERSION", 47 | "STORMLIB_VERSION_STRING", 48 | "ID_MPQ", 49 | "ID_MPQ_USERDATA", 50 | "ID_MPK", 51 | "ERROR_AVI_FILE", 52 | "ERROR_UNKNOWN_FILE_KEY", 53 | "ERROR_CHECKSUM_ERROR", 54 | "ERROR_INTERNAL_FILE", 55 | "ERROR_BASE_FILE_MISSING", 56 | "ERROR_MARKED_FOR_DELETE", 57 | "ERROR_FILE_INCOMPLETE", 58 | "ERROR_UNKNOWN_FILE_NAMES", 59 | "ERROR_CANT_FIND_PATCH_PREFIX", 60 | "HASH_TABLE_SIZE_MIN", 61 | "HASH_TABLE_SIZE_DEFAULT", 62 | "HASH_TABLE_SIZE_MAX", 63 | "HASH_ENTRY_DELETED", 64 | "HASH_ENTRY_FREE", 65 | "HET_ENTRY_DELETED", 66 | "HET_ENTRY_FREE", 67 | "HASH_STATE_SIZE", 68 | "SFILE_OPEN_HARD_DISK_FILE", 69 | "SFILE_OPEN_CDROM_FILE", 70 | "SFILE_OPEN_FROM_MPQ", 71 | "SFILE_OPEN_CHECK_EXISTS", 72 | "SFILE_OPEN_BASE_FILE", 73 | "SFILE_OPEN_ANY_LOCALE", 74 | "SFILE_OPEN_LOCAL_FILE", 75 | "MPQ_FLAG_READ_ONLY", 76 | "MPQ_FLAG_CHANGED", 77 | "MPQ_FLAG_MALFORMED", 78 | "MPQ_FLAG_HASH_TABLE_CUT", 79 | "MPQ_FLAG_BLOCK_TABLE_CUT", 80 | "MPQ_FLAG_CHECK_SECTOR_CRC", 81 | "MPQ_FLAG_SAVING_TABLES", 82 | "MPQ_FLAG_PATCH", 83 | "MPQ_FLAG_WAR3_MAP", 84 | "MPQ_FLAG_LISTFILE_NONE", 85 | "MPQ_FLAG_LISTFILE_NEW", 86 | "MPQ_FLAG_LISTFILE_FORCE", 87 | "MPQ_FLAG_ATTRIBUTES_NONE", 88 | "MPQ_FLAG_ATTRIBUTES_NEW", 89 | "MPQ_FLAG_SIGNATURE_NONE", 90 | "MPQ_FLAG_SIGNATURE_NEW", 91 | "MPQ_SUBTYPE_MPQ", 92 | "MPQ_SUBTYPE_SQP", 93 | "MPQ_SUBTYPE_MPK", 94 | "SFILE_INVALID_SIZE", 95 | "SFILE_INVALID_POS", 96 | "SFILE_INVALID_ATTRIBUTES", 97 | "MPQ_FILE_IMPLODE", 98 | "MPQ_FILE_COMPRESS", 99 | "MPQ_FILE_ENCRYPTED", 100 | "MPQ_FILE_FIX_KEY", 101 | "MPQ_FILE_PATCH_FILE", 102 | "MPQ_FILE_SINGLE_UNIT", 103 | "MPQ_FILE_DELETE_MARKER", 104 | "MPQ_FILE_SECTOR_CRC", 105 | "MPQ_FILE_SIGNATURE", 106 | "MPQ_FILE_EXISTS", 107 | "MPQ_FILE_REPLACEEXISTING", 108 | "MPQ_FILE_COMPRESS_MASK", 109 | "MPQ_FILE_DEFAULT_INTERNAL", 110 | "MPQ_FILE_VALID_FLAGS", 111 | "MPQ_FILE_VALID_FLAGS_W3X", 112 | "BLOCK_INDEX_MASK", 113 | "MPQ_COMPRESSION_HUFFMANN", 114 | "MPQ_COMPRESSION_ZLIB", 115 | "MPQ_COMPRESSION_PKWARE", 116 | "MPQ_COMPRESSION_BZIP2", 117 | "MPQ_COMPRESSION_SPARSE", 118 | "MPQ_COMPRESSION_ADPCM_MONO", 119 | "MPQ_COMPRESSION_ADPCM_STEREO", 120 | "MPQ_COMPRESSION_LZMA", 121 | "MPQ_COMPRESSION_NEXT_SAME", 122 | "MPQ_WAVE_QUALITY_HIGH", 123 | "MPQ_WAVE_QUALITY_MEDIUM", 124 | "MPQ_WAVE_QUALITY_LOW", 125 | "HET_TABLE_SIGNATURE", 126 | "BET_TABLE_SIGNATURE", 127 | "MPQ_KEY_HASH_TABLE", 128 | "MPQ_KEY_BLOCK_TABLE", 129 | "LISTFILE_NAME", 130 | "SIGNATURE_NAME", 131 | "ATTRIBUTES_NAME", 132 | "PATCH_METADATA_NAME", 133 | "MPQ_FORMAT_VERSION_1", 134 | "MPQ_FORMAT_VERSION_2", 135 | "MPQ_FORMAT_VERSION_3", 136 | "MPQ_FORMAT_VERSION_4", 137 | "MPQ_ATTRIBUTE_CRC32", 138 | "MPQ_ATTRIBUTE_FILETIME", 139 | "MPQ_ATTRIBUTE_MD5", 140 | "MPQ_ATTRIBUTE_PATCH_BIT", 141 | "MPQ_ATTRIBUTE_ALL", 142 | "MPQ_ATTRIBUTES_V1", 143 | "BASE_PROVIDER_FILE", 144 | "BASE_PROVIDER_MAP", 145 | "BASE_PROVIDER_HTTP", 146 | "BASE_PROVIDER_MASK", 147 | "STREAM_PROVIDER_FLAT", 148 | "STREAM_PROVIDER_PARTIAL", 149 | "STREAM_PROVIDER_MPQE", 150 | "STREAM_PROVIDER_BLOCK4", 151 | "STREAM_PROVIDER_MASK", 152 | "STREAM_FLAG_READ_ONLY", 153 | "STREAM_FLAG_WRITE_SHARE", 154 | "STREAM_FLAG_USE_BITMAP", 155 | "STREAM_OPTIONS_MASK", 156 | "STREAM_PROVIDERS_MASK", 157 | "STREAM_FLAGS_MASK", 158 | "MPQ_OPEN_NO_LISTFILE", 159 | "MPQ_OPEN_NO_ATTRIBUTES", 160 | "MPQ_OPEN_NO_HEADER_SEARCH", 161 | "MPQ_OPEN_FORCE_MPQ_V1", 162 | "MPQ_OPEN_CHECK_SECTOR_CRC", 163 | "MPQ_OPEN_PATCH", 164 | "MPQ_OPEN_FORCE_LISTFILE", 165 | "MPQ_OPEN_READ_ONLY", 166 | "MPQ_CREATE_LISTFILE", 167 | "MPQ_CREATE_ATTRIBUTES", 168 | "MPQ_CREATE_SIGNATURE", 169 | "MPQ_CREATE_ARCHIVE_V1", 170 | "MPQ_CREATE_ARCHIVE_V2", 171 | "MPQ_CREATE_ARCHIVE_V3", 172 | "MPQ_CREATE_ARCHIVE_V4", 173 | "MPQ_CREATE_ARCHIVE_VMASK", 174 | "FLAGS_TO_FORMAT_SHIFT", 175 | "SFILE_VERIFY_SECTOR_CRC", 176 | "SFILE_VERIFY_FILE_CRC", 177 | "SFILE_VERIFY_FILE_MD5", 178 | "SFILE_VERIFY_RAW_MD5", 179 | "SFILE_VERIFY_ALL", 180 | "VERIFY_OPEN_ERROR", 181 | "VERIFY_READ_ERROR", 182 | "VERIFY_FILE_HAS_SECTOR_CRC", 183 | "VERIFY_FILE_SECTOR_CRC_ERROR", 184 | "VERIFY_FILE_HAS_CHECKSUM", 185 | "VERIFY_FILE_CHECKSUM_ERROR", 186 | "VERIFY_FILE_HAS_MD5", 187 | "VERIFY_FILE_MD5_ERROR", 188 | "VERIFY_FILE_HAS_RAW_MD5", 189 | "VERIFY_FILE_RAW_MD5_ERROR", 190 | "VERIFY_FILE_ERROR_MASK", 191 | "SFILE_VERIFY_MPQ_HEADER", 192 | "SFILE_VERIFY_HET_TABLE", 193 | "SFILE_VERIFY_BET_TABLE", 194 | "SFILE_VERIFY_HASH_TABLE", 195 | "SFILE_VERIFY_BLOCK_TABLE", 196 | "SFILE_VERIFY_HIBLOCK_TABLE", 197 | "SFILE_VERIFY_FILE", 198 | "SIGNATURE_TYPE_NONE", 199 | "SIGNATURE_TYPE_WEAK", 200 | "SIGNATURE_TYPE_STRONG", 201 | "ERROR_NO_SIGNATURE", 202 | "ERROR_VERIFY_FAILED", 203 | "ERROR_WEAK_SIGNATURE_OK", 204 | "ERROR_WEAK_SIGNATURE_ERROR", 205 | "ERROR_STRONG_SIGNATURE_OK", 206 | "ERROR_STRONG_SIGNATURE_ERROR", 207 | "MD5_DIGEST_SIZE", 208 | "SHA1_DIGEST_SIZE", 209 | "LANG_NEUTRAL", 210 | "CCB_CHECKING_FILES", 211 | "CCB_CHECKING_HASH_TABLE", 212 | "CCB_COPYING_NON_MPQ_DATA", 213 | "CCB_COMPACTING_FILES", 214 | "CCB_CLOSING_ARCHIVE", 215 | "MPQ_HEADER_SIZE_V1", 216 | "MPQ_HEADER_SIZE_V2", 217 | "MPQ_HEADER_SIZE_V3", 218 | "MPQ_HEADER_SIZE_V4", 219 | "MPQ_HEADER_DWORDS", 220 | ]; 221 | -------------------------------------------------------------------------------- /crates/stormlib-bindgen/src/wrapper.hpp: -------------------------------------------------------------------------------- 1 | #define _UNICODE 2 | #define UNICODE 3 | 4 | #include "StormLib.h" -------------------------------------------------------------------------------- /crates/stormlib-sys/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "stormlib-sys" 3 | version = "0.1.2" 4 | authors = ["Flux Xu "] 5 | build = "build.rs" 6 | edition = "2018" 7 | 8 | [dependencies] 9 | libc = "0.2.155" 10 | bitflags = "1.2" 11 | 12 | [build-dependencies] 13 | cmake = "0.1.49" -------------------------------------------------------------------------------- /crates/stormlib-sys/build.rs: -------------------------------------------------------------------------------- 1 | extern crate cmake; 2 | 3 | use std::env; 4 | 5 | fn main() { 6 | // Gets StormLib source path from env STORMLIB_DIR 7 | let stormlib_path = env::var("STORMLIB_DIR").unwrap_or("../../deps/StormLib".to_string()); 8 | 9 | println!("cargo:rerun-if-changed={}", stormlib_path); 10 | 11 | // Builds StormLib using cmake 12 | let mut cfg = cmake::Config::new(&stormlib_path); 13 | 14 | #[cfg(target_os = "windows")] 15 | { 16 | cfg.cxxflag("-D UNICODE") 17 | .cxxflag("-D _UNICODE"); 18 | } 19 | 20 | #[cfg(target_os = "macos")] 21 | { 22 | cfg.cflag("-Wno-implicit-function-declaration"); 23 | } 24 | 25 | let dst = cfg 26 | .define("BUILD_SHARED_LIBS", "OFF") 27 | .build(); 28 | 29 | let lib = dst.join("lib"); 30 | 31 | // For gcc should link static storm first! (before adding -l flags) 32 | // That's very important and I've wasted an hour finding it >_< 33 | // source: https://stackoverflow.com/questions/29199107/c-lz-library-link-order-undefined-reference-to-symbol-inflateinit2 34 | println!("cargo:rustc-link-search=native={}", lib.display()); 35 | 36 | #[cfg(target_os = "windows")] 37 | { 38 | println!("cargo::rustc-link-lib=static=StormLib"); 39 | println!("cargo:rustc-link-lib=user32"); 40 | } 41 | 42 | #[cfg(target_os = "macos")] 43 | { 44 | println!("cargo:rustc-link-lib=static=storm"); 45 | println!("cargo:rustc-link-lib=dylib=c++"); 46 | println!("cargo:rustc-link-lib=z"); 47 | println!("cargo:rustc-link-lib=bz2"); 48 | } 49 | 50 | #[cfg(target_os = "linux")] 51 | { 52 | println!("cargo:rustc-link-lib=static=storm"); 53 | println!("cargo:rustc-link-lib=stdc++"); 54 | println!("cargo:rustc-link-lib=z"); 55 | println!("cargo:rustc-link-lib=bz2"); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /crates/stormlib-sys/src/bindings_linux.rs: -------------------------------------------------------------------------------- 1 | /* automatically generated by rust-bindgen 0.69.4 */ 2 | 3 | pub const ERROR_SUCCESS: u32 = 0; 4 | pub const ERROR_FILE_NOT_FOUND: u32 = 2; 5 | pub const ERROR_ACCESS_DENIED: u32 = 1; 6 | pub const ERROR_INVALID_HANDLE: u32 = 9; 7 | pub const ERROR_NOT_ENOUGH_MEMORY: u32 = 12; 8 | pub const ERROR_NOT_SUPPORTED: u32 = 95; 9 | pub const ERROR_INVALID_PARAMETER: u32 = 22; 10 | pub const ERROR_NEGATIVE_SEEK: u32 = 29; 11 | pub const ERROR_DISK_FULL: u32 = 28; 12 | pub const ERROR_ALREADY_EXISTS: u32 = 17; 13 | pub const ERROR_INSUFFICIENT_BUFFER: u32 = 105; 14 | pub const ERROR_BAD_FORMAT: u32 = 1000; 15 | pub const ERROR_NO_MORE_FILES: u32 = 1001; 16 | pub const ERROR_HANDLE_EOF: u32 = 1002; 17 | pub const ERROR_CAN_NOT_COMPLETE: u32 = 1003; 18 | pub const ERROR_FILE_CORRUPT: u32 = 1004; 19 | pub const ERROR_BUFFER_OVERFLOW: u32 = 1005; 20 | pub const STORMLIB_VERSION: u32 = 2329; 21 | pub const STORMLIB_VERSION_STRING: &[u8; 5] = b"9.25\0"; 22 | pub const ID_MPQ: u32 = 441536589; 23 | pub const ID_MPQ_USERDATA: u32 = 458313805; 24 | pub const ID_MPK: u32 = 441143373; 25 | pub const ERROR_AVI_FILE: u32 = 10000; 26 | pub const ERROR_UNKNOWN_FILE_KEY: u32 = 10001; 27 | pub const ERROR_CHECKSUM_ERROR: u32 = 10002; 28 | pub const ERROR_INTERNAL_FILE: u32 = 10003; 29 | pub const ERROR_BASE_FILE_MISSING: u32 = 10004; 30 | pub const ERROR_MARKED_FOR_DELETE: u32 = 10005; 31 | pub const ERROR_FILE_INCOMPLETE: u32 = 10006; 32 | pub const ERROR_UNKNOWN_FILE_NAMES: u32 = 10007; 33 | pub const ERROR_CANT_FIND_PATCH_PREFIX: u32 = 10008; 34 | pub const ERROR_FAKE_MPQ_HEADER: u32 = 10009; 35 | pub const HASH_TABLE_SIZE_MIN: u32 = 4; 36 | pub const HASH_TABLE_SIZE_DEFAULT: u32 = 4096; 37 | pub const HASH_TABLE_SIZE_MAX: u32 = 524288; 38 | pub const HASH_ENTRY_DELETED: u32 = 4294967294; 39 | pub const HASH_ENTRY_FREE: u32 = 4294967295; 40 | pub const HET_ENTRY_DELETED: u32 = 128; 41 | pub const HET_ENTRY_FREE: u32 = 0; 42 | pub const SFILE_OPEN_HARD_DISK_FILE: u32 = 2; 43 | pub const SFILE_OPEN_CDROM_FILE: u32 = 3; 44 | pub const SFILE_OPEN_FROM_MPQ: u32 = 0; 45 | pub const SFILE_OPEN_CHECK_EXISTS: u32 = 4294967292; 46 | pub const SFILE_OPEN_BASE_FILE: u32 = 4294967293; 47 | pub const SFILE_OPEN_ANY_LOCALE: u32 = 4294967294; 48 | pub const SFILE_OPEN_LOCAL_FILE: u32 = 4294967295; 49 | pub const MPQ_FLAG_READ_ONLY: u32 = 1; 50 | pub const MPQ_FLAG_CHANGED: u32 = 2; 51 | pub const MPQ_FLAG_MALFORMED: u32 = 4; 52 | pub const MPQ_FLAG_HASH_TABLE_CUT: u32 = 8; 53 | pub const MPQ_FLAG_BLOCK_TABLE_CUT: u32 = 16; 54 | pub const MPQ_FLAG_CHECK_SECTOR_CRC: u32 = 32; 55 | pub const MPQ_FLAG_SAVING_TABLES: u32 = 64; 56 | pub const MPQ_FLAG_PATCH: u32 = 128; 57 | pub const MPQ_FLAG_WAR3_MAP: u32 = 1024; 58 | pub const MPQ_FLAG_LISTFILE_NONE: u32 = 2048; 59 | pub const MPQ_FLAG_LISTFILE_NEW: u32 = 4096; 60 | pub const MPQ_FLAG_LISTFILE_FORCE: u32 = 8192; 61 | pub const MPQ_FLAG_ATTRIBUTES_NONE: u32 = 16384; 62 | pub const MPQ_FLAG_ATTRIBUTES_NEW: u32 = 32768; 63 | pub const MPQ_FLAG_SIGNATURE_NONE: u32 = 65536; 64 | pub const MPQ_FLAG_SIGNATURE_NEW: u32 = 131072; 65 | pub const MPQ_SUBTYPE_MPQ: u32 = 0; 66 | pub const MPQ_SUBTYPE_SQP: u32 = 1; 67 | pub const MPQ_SUBTYPE_MPK: u32 = 2; 68 | pub const SFILE_INVALID_SIZE: u32 = 4294967295; 69 | pub const SFILE_INVALID_POS: u32 = 4294967295; 70 | pub const SFILE_INVALID_ATTRIBUTES: u32 = 4294967295; 71 | pub const MPQ_FILE_IMPLODE: u32 = 256; 72 | pub const MPQ_FILE_COMPRESS: u32 = 512; 73 | pub const MPQ_FILE_ENCRYPTED: u32 = 65536; 74 | pub const MPQ_FILE_PATCH_FILE: u32 = 1048576; 75 | pub const MPQ_FILE_SINGLE_UNIT: u32 = 16777216; 76 | pub const MPQ_FILE_DELETE_MARKER: u32 = 33554432; 77 | pub const MPQ_FILE_SECTOR_CRC: u32 = 67108864; 78 | pub const MPQ_FILE_SIGNATURE: u32 = 268435456; 79 | pub const MPQ_FILE_EXISTS: u32 = 2147483648; 80 | pub const MPQ_FILE_REPLACEEXISTING: u32 = 2147483648; 81 | pub const MPQ_FILE_COMPRESS_MASK: u32 = 65280; 82 | pub const MPQ_FILE_DEFAULT_INTERNAL: u32 = 4294967295; 83 | pub const MPQ_FILE_FIX_KEY: u32 = 131072; 84 | pub const MPQ_FILE_VALID_FLAGS: u32 = 2534605568; 85 | pub const MPQ_FILE_VALID_FLAGS_W3X: u32 = 2516779776; 86 | pub const BLOCK_INDEX_MASK: u32 = 268435455; 87 | pub const MPQ_COMPRESSION_HUFFMANN: u32 = 1; 88 | pub const MPQ_COMPRESSION_ZLIB: u32 = 2; 89 | pub const MPQ_COMPRESSION_PKWARE: u32 = 8; 90 | pub const MPQ_COMPRESSION_BZIP2: u32 = 16; 91 | pub const MPQ_COMPRESSION_SPARSE: u32 = 32; 92 | pub const MPQ_COMPRESSION_ADPCM_MONO: u32 = 64; 93 | pub const MPQ_COMPRESSION_ADPCM_STEREO: u32 = 128; 94 | pub const MPQ_COMPRESSION_LZMA: u32 = 18; 95 | pub const MPQ_COMPRESSION_NEXT_SAME: u32 = 4294967295; 96 | pub const MPQ_WAVE_QUALITY_HIGH: u32 = 0; 97 | pub const MPQ_WAVE_QUALITY_MEDIUM: u32 = 1; 98 | pub const MPQ_WAVE_QUALITY_LOW: u32 = 2; 99 | pub const HET_TABLE_SIGNATURE: u32 = 441730376; 100 | pub const BET_TABLE_SIGNATURE: u32 = 441730370; 101 | pub const MPQ_KEY_HASH_TABLE: u32 = 3283040112; 102 | pub const MPQ_KEY_BLOCK_TABLE: u32 = 3968054179; 103 | pub const LISTFILE_NAME: &[u8; 11] = b"(listfile)\0"; 104 | pub const SIGNATURE_NAME: &[u8; 12] = b"(signature)\0"; 105 | pub const ATTRIBUTES_NAME: &[u8; 13] = b"(attributes)\0"; 106 | pub const PATCH_METADATA_NAME: &[u8; 17] = b"(patch_metadata)\0"; 107 | pub const MPQ_FORMAT_VERSION_1: u32 = 0; 108 | pub const MPQ_FORMAT_VERSION_2: u32 = 1; 109 | pub const MPQ_FORMAT_VERSION_3: u32 = 2; 110 | pub const MPQ_FORMAT_VERSION_4: u32 = 3; 111 | pub const MPQ_ATTRIBUTE_CRC32: u32 = 1; 112 | pub const MPQ_ATTRIBUTE_FILETIME: u32 = 2; 113 | pub const MPQ_ATTRIBUTE_MD5: u32 = 4; 114 | pub const MPQ_ATTRIBUTE_PATCH_BIT: u32 = 8; 115 | pub const MPQ_ATTRIBUTE_ALL: u32 = 15; 116 | pub const MPQ_ATTRIBUTES_V1: u32 = 100; 117 | pub const BASE_PROVIDER_FILE: u32 = 0; 118 | pub const BASE_PROVIDER_MAP: u32 = 1; 119 | pub const BASE_PROVIDER_HTTP: u32 = 2; 120 | pub const BASE_PROVIDER_MASK: u32 = 15; 121 | pub const STREAM_PROVIDER_FLAT: u32 = 0; 122 | pub const STREAM_PROVIDER_PARTIAL: u32 = 16; 123 | pub const STREAM_PROVIDER_MPQE: u32 = 32; 124 | pub const STREAM_PROVIDER_BLOCK4: u32 = 48; 125 | pub const STREAM_PROVIDER_MASK: u32 = 240; 126 | pub const STREAM_FLAG_READ_ONLY: u32 = 256; 127 | pub const STREAM_FLAG_WRITE_SHARE: u32 = 512; 128 | pub const STREAM_FLAG_USE_BITMAP: u32 = 1024; 129 | pub const STREAM_OPTIONS_MASK: u32 = 65280; 130 | pub const STREAM_PROVIDERS_MASK: u32 = 255; 131 | pub const STREAM_FLAGS_MASK: u32 = 65535; 132 | pub const MPQ_OPEN_NO_LISTFILE: u32 = 65536; 133 | pub const MPQ_OPEN_NO_ATTRIBUTES: u32 = 131072; 134 | pub const MPQ_OPEN_NO_HEADER_SEARCH: u32 = 262144; 135 | pub const MPQ_OPEN_FORCE_MPQ_V1: u32 = 524288; 136 | pub const MPQ_OPEN_CHECK_SECTOR_CRC: u32 = 1048576; 137 | pub const MPQ_OPEN_PATCH: u32 = 2097152; 138 | pub const MPQ_OPEN_FORCE_LISTFILE: u32 = 4194304; 139 | pub const MPQ_OPEN_READ_ONLY: u32 = 256; 140 | pub const MPQ_CREATE_LISTFILE: u32 = 1048576; 141 | pub const MPQ_CREATE_ATTRIBUTES: u32 = 2097152; 142 | pub const MPQ_CREATE_SIGNATURE: u32 = 4194304; 143 | pub const MPQ_CREATE_ARCHIVE_V1: u32 = 0; 144 | pub const MPQ_CREATE_ARCHIVE_V2: u32 = 16777216; 145 | pub const MPQ_CREATE_ARCHIVE_V3: u32 = 33554432; 146 | pub const MPQ_CREATE_ARCHIVE_V4: u32 = 50331648; 147 | pub const MPQ_CREATE_ARCHIVE_VMASK: u32 = 251658240; 148 | pub const FLAGS_TO_FORMAT_SHIFT: u32 = 24; 149 | pub const SFILE_VERIFY_SECTOR_CRC: u32 = 1; 150 | pub const SFILE_VERIFY_FILE_CRC: u32 = 2; 151 | pub const SFILE_VERIFY_FILE_MD5: u32 = 4; 152 | pub const SFILE_VERIFY_RAW_MD5: u32 = 8; 153 | pub const SFILE_VERIFY_ALL: u32 = 15; 154 | pub const VERIFY_OPEN_ERROR: u32 = 1; 155 | pub const VERIFY_READ_ERROR: u32 = 2; 156 | pub const VERIFY_FILE_HAS_SECTOR_CRC: u32 = 4; 157 | pub const VERIFY_FILE_SECTOR_CRC_ERROR: u32 = 8; 158 | pub const VERIFY_FILE_HAS_CHECKSUM: u32 = 16; 159 | pub const VERIFY_FILE_CHECKSUM_ERROR: u32 = 32; 160 | pub const VERIFY_FILE_HAS_MD5: u32 = 64; 161 | pub const VERIFY_FILE_MD5_ERROR: u32 = 128; 162 | pub const VERIFY_FILE_HAS_RAW_MD5: u32 = 256; 163 | pub const VERIFY_FILE_RAW_MD5_ERROR: u32 = 512; 164 | pub const VERIFY_FILE_ERROR_MASK: u32 = 683; 165 | pub const SFILE_VERIFY_MPQ_HEADER: u32 = 1; 166 | pub const SFILE_VERIFY_HET_TABLE: u32 = 2; 167 | pub const SFILE_VERIFY_BET_TABLE: u32 = 3; 168 | pub const SFILE_VERIFY_HASH_TABLE: u32 = 4; 169 | pub const SFILE_VERIFY_BLOCK_TABLE: u32 = 5; 170 | pub const SFILE_VERIFY_HIBLOCK_TABLE: u32 = 6; 171 | pub const SFILE_VERIFY_FILE: u32 = 7; 172 | pub const SIGNATURE_TYPE_NONE: u32 = 0; 173 | pub const SIGNATURE_TYPE_WEAK: u32 = 1; 174 | pub const SIGNATURE_TYPE_STRONG: u32 = 2; 175 | pub const ERROR_NO_SIGNATURE: u32 = 0; 176 | pub const ERROR_VERIFY_FAILED: u32 = 1; 177 | pub const ERROR_WEAK_SIGNATURE_OK: u32 = 2; 178 | pub const ERROR_WEAK_SIGNATURE_ERROR: u32 = 3; 179 | pub const ERROR_STRONG_SIGNATURE_OK: u32 = 4; 180 | pub const ERROR_STRONG_SIGNATURE_ERROR: u32 = 5; 181 | pub const MD5_DIGEST_SIZE: u32 = 16; 182 | pub const SHA1_DIGEST_SIZE: u32 = 20; 183 | pub const LANG_NEUTRAL: u32 = 0; 184 | pub const CCB_CHECKING_FILES: u32 = 1; 185 | pub const CCB_CHECKING_HASH_TABLE: u32 = 2; 186 | pub const CCB_COPYING_NON_MPQ_DATA: u32 = 3; 187 | pub const CCB_COMPACTING_FILES: u32 = 4; 188 | pub const CCB_CLOSING_ARCHIVE: u32 = 5; 189 | pub const MPQ_HEADER_SIZE_V1: u32 = 32; 190 | pub const MPQ_HEADER_SIZE_V2: u32 = 44; 191 | pub const MPQ_HEADER_SIZE_V3: u32 = 68; 192 | pub const MPQ_HEADER_SIZE_V4: u32 = 208; 193 | pub const MPQ_HEADER_DWORDS: u32 = 52; 194 | pub type LONG = ::std::os::raw::c_int; 195 | pub type DWORD = ::std::os::raw::c_uint; 196 | pub type ULONGLONG = ::std::os::raw::c_ulonglong; 197 | pub type HANDLE = *mut ::std::os::raw::c_void; 198 | pub type LPOVERLAPPED = *mut ::std::os::raw::c_void; 199 | pub type TCHAR = ::std::os::raw::c_char; 200 | pub type LCID = ::std::os::raw::c_uint; 201 | pub type LPDWORD = *mut DWORD; 202 | pub const _SFileInfoClass_SFileMpqFileName: _SFileInfoClass = 0; 203 | pub const _SFileInfoClass_SFileMpqStreamBitmap: _SFileInfoClass = 1; 204 | pub const _SFileInfoClass_SFileMpqUserDataOffset: _SFileInfoClass = 2; 205 | pub const _SFileInfoClass_SFileMpqUserDataHeader: _SFileInfoClass = 3; 206 | pub const _SFileInfoClass_SFileMpqUserData: _SFileInfoClass = 4; 207 | pub const _SFileInfoClass_SFileMpqHeaderOffset: _SFileInfoClass = 5; 208 | pub const _SFileInfoClass_SFileMpqHeaderSize: _SFileInfoClass = 6; 209 | pub const _SFileInfoClass_SFileMpqHeader: _SFileInfoClass = 7; 210 | pub const _SFileInfoClass_SFileMpqHetTableOffset: _SFileInfoClass = 8; 211 | pub const _SFileInfoClass_SFileMpqHetTableSize: _SFileInfoClass = 9; 212 | pub const _SFileInfoClass_SFileMpqHetHeader: _SFileInfoClass = 10; 213 | pub const _SFileInfoClass_SFileMpqHetTable: _SFileInfoClass = 11; 214 | pub const _SFileInfoClass_SFileMpqBetTableOffset: _SFileInfoClass = 12; 215 | pub const _SFileInfoClass_SFileMpqBetTableSize: _SFileInfoClass = 13; 216 | pub const _SFileInfoClass_SFileMpqBetHeader: _SFileInfoClass = 14; 217 | pub const _SFileInfoClass_SFileMpqBetTable: _SFileInfoClass = 15; 218 | pub const _SFileInfoClass_SFileMpqHashTableOffset: _SFileInfoClass = 16; 219 | pub const _SFileInfoClass_SFileMpqHashTableSize64: _SFileInfoClass = 17; 220 | pub const _SFileInfoClass_SFileMpqHashTableSize: _SFileInfoClass = 18; 221 | pub const _SFileInfoClass_SFileMpqHashTable: _SFileInfoClass = 19; 222 | pub const _SFileInfoClass_SFileMpqBlockTableOffset: _SFileInfoClass = 20; 223 | pub const _SFileInfoClass_SFileMpqBlockTableSize64: _SFileInfoClass = 21; 224 | pub const _SFileInfoClass_SFileMpqBlockTableSize: _SFileInfoClass = 22; 225 | pub const _SFileInfoClass_SFileMpqBlockTable: _SFileInfoClass = 23; 226 | pub const _SFileInfoClass_SFileMpqHiBlockTableOffset: _SFileInfoClass = 24; 227 | pub const _SFileInfoClass_SFileMpqHiBlockTableSize64: _SFileInfoClass = 25; 228 | pub const _SFileInfoClass_SFileMpqHiBlockTable: _SFileInfoClass = 26; 229 | pub const _SFileInfoClass_SFileMpqSignatures: _SFileInfoClass = 27; 230 | pub const _SFileInfoClass_SFileMpqStrongSignatureOffset: _SFileInfoClass = 28; 231 | pub const _SFileInfoClass_SFileMpqStrongSignatureSize: _SFileInfoClass = 29; 232 | pub const _SFileInfoClass_SFileMpqStrongSignature: _SFileInfoClass = 30; 233 | pub const _SFileInfoClass_SFileMpqArchiveSize64: _SFileInfoClass = 31; 234 | pub const _SFileInfoClass_SFileMpqArchiveSize: _SFileInfoClass = 32; 235 | pub const _SFileInfoClass_SFileMpqMaxFileCount: _SFileInfoClass = 33; 236 | pub const _SFileInfoClass_SFileMpqFileTableSize: _SFileInfoClass = 34; 237 | pub const _SFileInfoClass_SFileMpqSectorSize: _SFileInfoClass = 35; 238 | pub const _SFileInfoClass_SFileMpqNumberOfFiles: _SFileInfoClass = 36; 239 | pub const _SFileInfoClass_SFileMpqRawChunkSize: _SFileInfoClass = 37; 240 | pub const _SFileInfoClass_SFileMpqStreamFlags: _SFileInfoClass = 38; 241 | pub const _SFileInfoClass_SFileMpqFlags: _SFileInfoClass = 39; 242 | pub const _SFileInfoClass_SFileInfoPatchChain: _SFileInfoClass = 40; 243 | pub const _SFileInfoClass_SFileInfoFileEntry: _SFileInfoClass = 41; 244 | pub const _SFileInfoClass_SFileInfoHashEntry: _SFileInfoClass = 42; 245 | pub const _SFileInfoClass_SFileInfoHashIndex: _SFileInfoClass = 43; 246 | pub const _SFileInfoClass_SFileInfoNameHash1: _SFileInfoClass = 44; 247 | pub const _SFileInfoClass_SFileInfoNameHash2: _SFileInfoClass = 45; 248 | pub const _SFileInfoClass_SFileInfoNameHash3: _SFileInfoClass = 46; 249 | pub const _SFileInfoClass_SFileInfoLocale: _SFileInfoClass = 47; 250 | pub const _SFileInfoClass_SFileInfoFileIndex: _SFileInfoClass = 48; 251 | pub const _SFileInfoClass_SFileInfoByteOffset: _SFileInfoClass = 49; 252 | pub const _SFileInfoClass_SFileInfoFileTime: _SFileInfoClass = 50; 253 | pub const _SFileInfoClass_SFileInfoFileSize: _SFileInfoClass = 51; 254 | pub const _SFileInfoClass_SFileInfoCompressedSize: _SFileInfoClass = 52; 255 | pub const _SFileInfoClass_SFileInfoFlags: _SFileInfoClass = 53; 256 | pub const _SFileInfoClass_SFileInfoEncryptionKey: _SFileInfoClass = 54; 257 | pub const _SFileInfoClass_SFileInfoEncryptionKeyRaw: _SFileInfoClass = 55; 258 | pub const _SFileInfoClass_SFileInfoCRC32: _SFileInfoClass = 56; 259 | pub const _SFileInfoClass_SFileInfoInvalid: _SFileInfoClass = 4095; 260 | pub type _SFileInfoClass = ::std::os::raw::c_uint; 261 | pub use self::_SFileInfoClass as SFileInfoClass; 262 | pub type SFILE_DOWNLOAD_CALLBACK = ::std::option::Option< 263 | unsafe extern "C" fn( 264 | pvUserData: *mut ::std::os::raw::c_void, 265 | ByteOffset: ULONGLONG, 266 | dwTotalBytes: DWORD, 267 | ), 268 | >; 269 | pub type SFILE_ADDFILE_CALLBACK = ::std::option::Option< 270 | unsafe extern "C" fn( 271 | pvUserData: *mut ::std::os::raw::c_void, 272 | dwBytesWritten: DWORD, 273 | dwTotalBytes: DWORD, 274 | bFinalCall: bool, 275 | ), 276 | >; 277 | pub type SFILE_COMPACT_CALLBACK = ::std::option::Option< 278 | unsafe extern "C" fn( 279 | pvUserData: *mut ::std::os::raw::c_void, 280 | dwWorkType: DWORD, 281 | BytesProcessed: ULONGLONG, 282 | TotalBytes: ULONGLONG, 283 | ), 284 | >; 285 | #[repr(C)] 286 | #[derive(Debug, Copy, Clone)] 287 | pub struct _SFILE_FIND_DATA { 288 | pub cFileName: [::std::os::raw::c_char; 1024usize], 289 | pub szPlainName: *mut ::std::os::raw::c_char, 290 | pub dwHashIndex: DWORD, 291 | pub dwBlockIndex: DWORD, 292 | pub dwFileSize: DWORD, 293 | pub dwFileFlags: DWORD, 294 | pub dwCompSize: DWORD, 295 | pub dwFileTimeLo: DWORD, 296 | pub dwFileTimeHi: DWORD, 297 | pub lcLocale: LCID, 298 | } 299 | #[test] 300 | fn bindgen_test_layout__SFILE_FIND_DATA() { 301 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_FIND_DATA> = ::std::mem::MaybeUninit::uninit(); 302 | let ptr = UNINIT.as_ptr(); 303 | assert_eq!( 304 | ::std::mem::size_of::<_SFILE_FIND_DATA>(), 305 | 1064usize, 306 | concat!("Size of: ", stringify!(_SFILE_FIND_DATA)) 307 | ); 308 | assert_eq!( 309 | ::std::mem::align_of::<_SFILE_FIND_DATA>(), 310 | 8usize, 311 | concat!("Alignment of ", stringify!(_SFILE_FIND_DATA)) 312 | ); 313 | assert_eq!( 314 | unsafe { ::std::ptr::addr_of!((*ptr).cFileName) as usize - ptr as usize }, 315 | 0usize, 316 | concat!( 317 | "Offset of field: ", 318 | stringify!(_SFILE_FIND_DATA), 319 | "::", 320 | stringify!(cFileName) 321 | ) 322 | ); 323 | assert_eq!( 324 | unsafe { ::std::ptr::addr_of!((*ptr).szPlainName) as usize - ptr as usize }, 325 | 1024usize, 326 | concat!( 327 | "Offset of field: ", 328 | stringify!(_SFILE_FIND_DATA), 329 | "::", 330 | stringify!(szPlainName) 331 | ) 332 | ); 333 | assert_eq!( 334 | unsafe { ::std::ptr::addr_of!((*ptr).dwHashIndex) as usize - ptr as usize }, 335 | 1032usize, 336 | concat!( 337 | "Offset of field: ", 338 | stringify!(_SFILE_FIND_DATA), 339 | "::", 340 | stringify!(dwHashIndex) 341 | ) 342 | ); 343 | assert_eq!( 344 | unsafe { ::std::ptr::addr_of!((*ptr).dwBlockIndex) as usize - ptr as usize }, 345 | 1036usize, 346 | concat!( 347 | "Offset of field: ", 348 | stringify!(_SFILE_FIND_DATA), 349 | "::", 350 | stringify!(dwBlockIndex) 351 | ) 352 | ); 353 | assert_eq!( 354 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileSize) as usize - ptr as usize }, 355 | 1040usize, 356 | concat!( 357 | "Offset of field: ", 358 | stringify!(_SFILE_FIND_DATA), 359 | "::", 360 | stringify!(dwFileSize) 361 | ) 362 | ); 363 | assert_eq!( 364 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags) as usize - ptr as usize }, 365 | 1044usize, 366 | concat!( 367 | "Offset of field: ", 368 | stringify!(_SFILE_FIND_DATA), 369 | "::", 370 | stringify!(dwFileFlags) 371 | ) 372 | ); 373 | assert_eq!( 374 | unsafe { ::std::ptr::addr_of!((*ptr).dwCompSize) as usize - ptr as usize }, 375 | 1048usize, 376 | concat!( 377 | "Offset of field: ", 378 | stringify!(_SFILE_FIND_DATA), 379 | "::", 380 | stringify!(dwCompSize) 381 | ) 382 | ); 383 | assert_eq!( 384 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileTimeLo) as usize - ptr as usize }, 385 | 1052usize, 386 | concat!( 387 | "Offset of field: ", 388 | stringify!(_SFILE_FIND_DATA), 389 | "::", 390 | stringify!(dwFileTimeLo) 391 | ) 392 | ); 393 | assert_eq!( 394 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileTimeHi) as usize - ptr as usize }, 395 | 1056usize, 396 | concat!( 397 | "Offset of field: ", 398 | stringify!(_SFILE_FIND_DATA), 399 | "::", 400 | stringify!(dwFileTimeHi) 401 | ) 402 | ); 403 | assert_eq!( 404 | unsafe { ::std::ptr::addr_of!((*ptr).lcLocale) as usize - ptr as usize }, 405 | 1060usize, 406 | concat!( 407 | "Offset of field: ", 408 | stringify!(_SFILE_FIND_DATA), 409 | "::", 410 | stringify!(lcLocale) 411 | ) 412 | ); 413 | } 414 | pub type SFILE_FIND_DATA = _SFILE_FIND_DATA; 415 | #[repr(C)] 416 | #[derive(Debug, Copy, Clone)] 417 | pub struct _SFILE_CREATE_MPQ { 418 | pub cbSize: DWORD, 419 | pub dwMpqVersion: DWORD, 420 | pub pvUserData: *mut ::std::os::raw::c_void, 421 | pub cbUserData: DWORD, 422 | pub dwStreamFlags: DWORD, 423 | pub dwFileFlags1: DWORD, 424 | pub dwFileFlags2: DWORD, 425 | pub dwFileFlags3: DWORD, 426 | pub dwAttrFlags: DWORD, 427 | pub dwSectorSize: DWORD, 428 | pub dwRawChunkSize: DWORD, 429 | pub dwMaxFileCount: DWORD, 430 | } 431 | #[test] 432 | fn bindgen_test_layout__SFILE_CREATE_MPQ() { 433 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_CREATE_MPQ> = ::std::mem::MaybeUninit::uninit(); 434 | let ptr = UNINIT.as_ptr(); 435 | assert_eq!( 436 | ::std::mem::size_of::<_SFILE_CREATE_MPQ>(), 437 | 56usize, 438 | concat!("Size of: ", stringify!(_SFILE_CREATE_MPQ)) 439 | ); 440 | assert_eq!( 441 | ::std::mem::align_of::<_SFILE_CREATE_MPQ>(), 442 | 8usize, 443 | concat!("Alignment of ", stringify!(_SFILE_CREATE_MPQ)) 444 | ); 445 | assert_eq!( 446 | unsafe { ::std::ptr::addr_of!((*ptr).cbSize) as usize - ptr as usize }, 447 | 0usize, 448 | concat!( 449 | "Offset of field: ", 450 | stringify!(_SFILE_CREATE_MPQ), 451 | "::", 452 | stringify!(cbSize) 453 | ) 454 | ); 455 | assert_eq!( 456 | unsafe { ::std::ptr::addr_of!((*ptr).dwMpqVersion) as usize - ptr as usize }, 457 | 4usize, 458 | concat!( 459 | "Offset of field: ", 460 | stringify!(_SFILE_CREATE_MPQ), 461 | "::", 462 | stringify!(dwMpqVersion) 463 | ) 464 | ); 465 | assert_eq!( 466 | unsafe { ::std::ptr::addr_of!((*ptr).pvUserData) as usize - ptr as usize }, 467 | 8usize, 468 | concat!( 469 | "Offset of field: ", 470 | stringify!(_SFILE_CREATE_MPQ), 471 | "::", 472 | stringify!(pvUserData) 473 | ) 474 | ); 475 | assert_eq!( 476 | unsafe { ::std::ptr::addr_of!((*ptr).cbUserData) as usize - ptr as usize }, 477 | 16usize, 478 | concat!( 479 | "Offset of field: ", 480 | stringify!(_SFILE_CREATE_MPQ), 481 | "::", 482 | stringify!(cbUserData) 483 | ) 484 | ); 485 | assert_eq!( 486 | unsafe { ::std::ptr::addr_of!((*ptr).dwStreamFlags) as usize - ptr as usize }, 487 | 20usize, 488 | concat!( 489 | "Offset of field: ", 490 | stringify!(_SFILE_CREATE_MPQ), 491 | "::", 492 | stringify!(dwStreamFlags) 493 | ) 494 | ); 495 | assert_eq!( 496 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags1) as usize - ptr as usize }, 497 | 24usize, 498 | concat!( 499 | "Offset of field: ", 500 | stringify!(_SFILE_CREATE_MPQ), 501 | "::", 502 | stringify!(dwFileFlags1) 503 | ) 504 | ); 505 | assert_eq!( 506 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags2) as usize - ptr as usize }, 507 | 28usize, 508 | concat!( 509 | "Offset of field: ", 510 | stringify!(_SFILE_CREATE_MPQ), 511 | "::", 512 | stringify!(dwFileFlags2) 513 | ) 514 | ); 515 | assert_eq!( 516 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags3) as usize - ptr as usize }, 517 | 32usize, 518 | concat!( 519 | "Offset of field: ", 520 | stringify!(_SFILE_CREATE_MPQ), 521 | "::", 522 | stringify!(dwFileFlags3) 523 | ) 524 | ); 525 | assert_eq!( 526 | unsafe { ::std::ptr::addr_of!((*ptr).dwAttrFlags) as usize - ptr as usize }, 527 | 36usize, 528 | concat!( 529 | "Offset of field: ", 530 | stringify!(_SFILE_CREATE_MPQ), 531 | "::", 532 | stringify!(dwAttrFlags) 533 | ) 534 | ); 535 | assert_eq!( 536 | unsafe { ::std::ptr::addr_of!((*ptr).dwSectorSize) as usize - ptr as usize }, 537 | 40usize, 538 | concat!( 539 | "Offset of field: ", 540 | stringify!(_SFILE_CREATE_MPQ), 541 | "::", 542 | stringify!(dwSectorSize) 543 | ) 544 | ); 545 | assert_eq!( 546 | unsafe { ::std::ptr::addr_of!((*ptr).dwRawChunkSize) as usize - ptr as usize }, 547 | 44usize, 548 | concat!( 549 | "Offset of field: ", 550 | stringify!(_SFILE_CREATE_MPQ), 551 | "::", 552 | stringify!(dwRawChunkSize) 553 | ) 554 | ); 555 | assert_eq!( 556 | unsafe { ::std::ptr::addr_of!((*ptr).dwMaxFileCount) as usize - ptr as usize }, 557 | 48usize, 558 | concat!( 559 | "Offset of field: ", 560 | stringify!(_SFILE_CREATE_MPQ), 561 | "::", 562 | stringify!(dwMaxFileCount) 563 | ) 564 | ); 565 | } 566 | pub type SFILE_CREATE_MPQ = _SFILE_CREATE_MPQ; 567 | pub type PSFILE_CREATE_MPQ = *mut _SFILE_CREATE_MPQ; 568 | #[repr(C)] 569 | #[derive(Debug, Copy, Clone)] 570 | pub struct _SFILE_MARKERS { 571 | pub dwSize: DWORD, 572 | pub dwSignature: DWORD, 573 | pub szHashTableKey: *const ::std::os::raw::c_char, 574 | pub szBlockTableKey: *const ::std::os::raw::c_char, 575 | } 576 | #[test] 577 | fn bindgen_test_layout__SFILE_MARKERS() { 578 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_MARKERS> = ::std::mem::MaybeUninit::uninit(); 579 | let ptr = UNINIT.as_ptr(); 580 | assert_eq!( 581 | ::std::mem::size_of::<_SFILE_MARKERS>(), 582 | 24usize, 583 | concat!("Size of: ", stringify!(_SFILE_MARKERS)) 584 | ); 585 | assert_eq!( 586 | ::std::mem::align_of::<_SFILE_MARKERS>(), 587 | 8usize, 588 | concat!("Alignment of ", stringify!(_SFILE_MARKERS)) 589 | ); 590 | assert_eq!( 591 | unsafe { ::std::ptr::addr_of!((*ptr).dwSize) as usize - ptr as usize }, 592 | 0usize, 593 | concat!( 594 | "Offset of field: ", 595 | stringify!(_SFILE_MARKERS), 596 | "::", 597 | stringify!(dwSize) 598 | ) 599 | ); 600 | assert_eq!( 601 | unsafe { ::std::ptr::addr_of!((*ptr).dwSignature) as usize - ptr as usize }, 602 | 4usize, 603 | concat!( 604 | "Offset of field: ", 605 | stringify!(_SFILE_MARKERS), 606 | "::", 607 | stringify!(dwSignature) 608 | ) 609 | ); 610 | assert_eq!( 611 | unsafe { ::std::ptr::addr_of!((*ptr).szHashTableKey) as usize - ptr as usize }, 612 | 8usize, 613 | concat!( 614 | "Offset of field: ", 615 | stringify!(_SFILE_MARKERS), 616 | "::", 617 | stringify!(szHashTableKey) 618 | ) 619 | ); 620 | assert_eq!( 621 | unsafe { ::std::ptr::addr_of!((*ptr).szBlockTableKey) as usize - ptr as usize }, 622 | 16usize, 623 | concat!( 624 | "Offset of field: ", 625 | stringify!(_SFILE_MARKERS), 626 | "::", 627 | stringify!(szBlockTableKey) 628 | ) 629 | ); 630 | } 631 | pub type SFILE_MARKERS = _SFILE_MARKERS; 632 | pub type PSFILE_MARKERS = *mut _SFILE_MARKERS; 633 | pub type SFILESETLOCALE = ::std::option::Option LCID>; 634 | pub type SFILEOPENARCHIVE = ::std::option::Option< 635 | unsafe extern "C" fn( 636 | arg1: *const ::std::os::raw::c_char, 637 | arg2: DWORD, 638 | arg3: DWORD, 639 | arg4: *mut HANDLE, 640 | ) -> bool, 641 | >; 642 | pub type SFILECLOSEARCHIVE = ::std::option::Option bool>; 643 | pub type SFILEOPENFILEEX = ::std::option::Option< 644 | unsafe extern "C" fn( 645 | arg1: HANDLE, 646 | arg2: *const ::std::os::raw::c_char, 647 | arg3: DWORD, 648 | arg4: *mut HANDLE, 649 | ) -> bool, 650 | >; 651 | pub type SFILECLOSEFILE = ::std::option::Option bool>; 652 | pub type SFILEGETFILESIZE = 653 | ::std::option::Option DWORD>; 654 | pub type SFILESETFILEPOINTER = ::std::option::Option< 655 | unsafe extern "C" fn(arg1: HANDLE, arg2: LONG, arg3: *mut LONG, arg4: DWORD) -> DWORD, 656 | >; 657 | pub type SFILEREADFILE = ::std::option::Option< 658 | unsafe extern "C" fn( 659 | arg1: HANDLE, 660 | arg2: *mut ::std::os::raw::c_void, 661 | arg3: DWORD, 662 | arg4: LPDWORD, 663 | arg5: LPOVERLAPPED, 664 | ) -> bool, 665 | >; 666 | extern "C" { 667 | pub fn SFileSetArchiveMarkers(pMarkers: PSFILE_MARKERS) -> bool; 668 | } 669 | extern "C" { 670 | pub fn SFileGetLocale() -> LCID; 671 | } 672 | extern "C" { 673 | pub fn SFileSetLocale(lcFileLocale: LCID) -> LCID; 674 | } 675 | extern "C" { 676 | pub fn SFileOpenArchive( 677 | szMpqName: *const TCHAR, 678 | dwPriority: DWORD, 679 | dwFlags: DWORD, 680 | phMpq: *mut HANDLE, 681 | ) -> bool; 682 | } 683 | extern "C" { 684 | pub fn SFileCreateArchive( 685 | szMpqName: *const TCHAR, 686 | dwCreateFlags: DWORD, 687 | dwMaxFileCount: DWORD, 688 | phMpq: *mut HANDLE, 689 | ) -> bool; 690 | } 691 | extern "C" { 692 | pub fn SFileCreateArchive2( 693 | szMpqName: *const TCHAR, 694 | pCreateInfo: PSFILE_CREATE_MPQ, 695 | phMpq: *mut HANDLE, 696 | ) -> bool; 697 | } 698 | extern "C" { 699 | pub fn SFileSetDownloadCallback( 700 | hMpq: HANDLE, 701 | DownloadCB: SFILE_DOWNLOAD_CALLBACK, 702 | pvUserData: *mut ::std::os::raw::c_void, 703 | ) -> bool; 704 | } 705 | extern "C" { 706 | pub fn SFileFlushArchive(hMpq: HANDLE) -> bool; 707 | } 708 | extern "C" { 709 | pub fn SFileCloseArchive(hMpq: HANDLE) -> bool; 710 | } 711 | extern "C" { 712 | pub fn SFileAddListFile(hMpq: HANDLE, szListFile: *const TCHAR) -> DWORD; 713 | } 714 | extern "C" { 715 | pub fn SFileAddListFileEntries( 716 | hMpq: HANDLE, 717 | listFileEntries: *mut *const ::std::os::raw::c_char, 718 | dwEntryCount: DWORD, 719 | ) -> DWORD; 720 | } 721 | extern "C" { 722 | pub fn SFileSetCompactCallback( 723 | hMpq: HANDLE, 724 | CompactCB: SFILE_COMPACT_CALLBACK, 725 | pvUserData: *mut ::std::os::raw::c_void, 726 | ) -> bool; 727 | } 728 | extern "C" { 729 | pub fn SFileCompactArchive(hMpq: HANDLE, szListFile: *const TCHAR, bReserved: bool) -> bool; 730 | } 731 | extern "C" { 732 | pub fn SFileGetMaxFileCount(hMpq: HANDLE) -> DWORD; 733 | } 734 | extern "C" { 735 | pub fn SFileSetMaxFileCount(hMpq: HANDLE, dwMaxFileCount: DWORD) -> bool; 736 | } 737 | extern "C" { 738 | pub fn SFileGetAttributes(hMpq: HANDLE) -> DWORD; 739 | } 740 | extern "C" { 741 | pub fn SFileSetAttributes(hMpq: HANDLE, dwFlags: DWORD) -> bool; 742 | } 743 | extern "C" { 744 | pub fn SFileUpdateFileAttributes(hMpq: HANDLE, szFileName: *const ::std::os::raw::c_char) 745 | -> bool; 746 | } 747 | extern "C" { 748 | pub fn SFileOpenPatchArchive( 749 | hMpq: HANDLE, 750 | szPatchMpqName: *const TCHAR, 751 | szPatchPathPrefix: *const ::std::os::raw::c_char, 752 | dwFlags: DWORD, 753 | ) -> bool; 754 | } 755 | extern "C" { 756 | pub fn SFileIsPatchedArchive(hMpq: HANDLE) -> bool; 757 | } 758 | extern "C" { 759 | pub fn SFileHasFile(hMpq: HANDLE, szFileName: *const ::std::os::raw::c_char) -> bool; 760 | } 761 | extern "C" { 762 | pub fn SFileOpenFileEx( 763 | hMpq: HANDLE, 764 | szFileName: *const ::std::os::raw::c_char, 765 | dwSearchScope: DWORD, 766 | phFile: *mut HANDLE, 767 | ) -> bool; 768 | } 769 | extern "C" { 770 | pub fn SFileGetFileSize(hFile: HANDLE, pdwFileSizeHigh: LPDWORD) -> DWORD; 771 | } 772 | extern "C" { 773 | pub fn SFileSetFilePointer( 774 | hFile: HANDLE, 775 | lFilePos: LONG, 776 | plFilePosHigh: *mut LONG, 777 | dwMoveMethod: DWORD, 778 | ) -> DWORD; 779 | } 780 | extern "C" { 781 | pub fn SFileReadFile( 782 | hFile: HANDLE, 783 | lpBuffer: *mut ::std::os::raw::c_void, 784 | dwToRead: DWORD, 785 | pdwRead: LPDWORD, 786 | lpOverlapped: LPOVERLAPPED, 787 | ) -> bool; 788 | } 789 | extern "C" { 790 | pub fn SFileCloseFile(hFile: HANDLE) -> bool; 791 | } 792 | extern "C" { 793 | pub fn SFileGetFileInfo( 794 | hMpqOrFile: HANDLE, 795 | InfoClass: SFileInfoClass, 796 | pvFileInfo: *mut ::std::os::raw::c_void, 797 | cbFileInfo: DWORD, 798 | pcbLengthNeeded: LPDWORD, 799 | ) -> bool; 800 | } 801 | extern "C" { 802 | pub fn SFileGetFileName(hFile: HANDLE, szFileName: *mut ::std::os::raw::c_char) -> bool; 803 | } 804 | extern "C" { 805 | pub fn SFileFreeFileInfo( 806 | pvFileInfo: *mut ::std::os::raw::c_void, 807 | InfoClass: SFileInfoClass, 808 | ) -> bool; 809 | } 810 | extern "C" { 811 | pub fn SFileExtractFile( 812 | hMpq: HANDLE, 813 | szToExtract: *const ::std::os::raw::c_char, 814 | szExtracted: *const TCHAR, 815 | dwSearchScope: DWORD, 816 | ) -> bool; 817 | } 818 | extern "C" { 819 | pub fn SFileGetFileChecksums( 820 | hMpq: HANDLE, 821 | szFileName: *const ::std::os::raw::c_char, 822 | pdwCrc32: LPDWORD, 823 | pMD5: *mut ::std::os::raw::c_char, 824 | ) -> bool; 825 | } 826 | extern "C" { 827 | pub fn SFileVerifyFile( 828 | hMpq: HANDLE, 829 | szFileName: *const ::std::os::raw::c_char, 830 | dwFlags: DWORD, 831 | ) -> DWORD; 832 | } 833 | extern "C" { 834 | pub fn SFileVerifyRawData( 835 | hMpq: HANDLE, 836 | dwWhatToVerify: DWORD, 837 | szFileName: *const ::std::os::raw::c_char, 838 | ) -> DWORD; 839 | } 840 | extern "C" { 841 | pub fn SFileSignArchive(hMpq: HANDLE, dwSignatureType: DWORD) -> bool; 842 | } 843 | extern "C" { 844 | pub fn SFileVerifyArchive(hMpq: HANDLE) -> DWORD; 845 | } 846 | extern "C" { 847 | pub fn SFileFindFirstFile( 848 | hMpq: HANDLE, 849 | szMask: *const ::std::os::raw::c_char, 850 | lpFindFileData: *mut SFILE_FIND_DATA, 851 | szListFile: *const TCHAR, 852 | ) -> HANDLE; 853 | } 854 | extern "C" { 855 | pub fn SFileFindNextFile(hFind: HANDLE, lpFindFileData: *mut SFILE_FIND_DATA) -> bool; 856 | } 857 | extern "C" { 858 | pub fn SFileFindClose(hFind: HANDLE) -> bool; 859 | } 860 | extern "C" { 861 | pub fn SListFileFindFirstFile( 862 | hMpq: HANDLE, 863 | szListFile: *const TCHAR, 864 | szMask: *const ::std::os::raw::c_char, 865 | lpFindFileData: *mut SFILE_FIND_DATA, 866 | ) -> HANDLE; 867 | } 868 | extern "C" { 869 | pub fn SListFileFindNextFile(hFind: HANDLE, lpFindFileData: *mut SFILE_FIND_DATA) -> bool; 870 | } 871 | extern "C" { 872 | pub fn SListFileFindClose(hFind: HANDLE) -> bool; 873 | } 874 | extern "C" { 875 | pub fn SFileEnumLocales( 876 | hMpq: HANDLE, 877 | szFileName: *const ::std::os::raw::c_char, 878 | PtrFileLocales: *mut LCID, 879 | PtrMaxLocales: LPDWORD, 880 | dwSearchScope: DWORD, 881 | ) -> DWORD; 882 | } 883 | extern "C" { 884 | pub fn SFileCreateFile( 885 | hMpq: HANDLE, 886 | szArchivedName: *const ::std::os::raw::c_char, 887 | FileTime: ULONGLONG, 888 | dwFileSize: DWORD, 889 | lcFileLocale: LCID, 890 | dwFlags: DWORD, 891 | phFile: *mut HANDLE, 892 | ) -> bool; 893 | } 894 | extern "C" { 895 | pub fn SFileWriteFile( 896 | hFile: HANDLE, 897 | pvData: *const ::std::os::raw::c_void, 898 | dwSize: DWORD, 899 | dwCompression: DWORD, 900 | ) -> bool; 901 | } 902 | extern "C" { 903 | pub fn SFileFinishFile(hFile: HANDLE) -> bool; 904 | } 905 | extern "C" { 906 | pub fn SFileAddFileEx( 907 | hMpq: HANDLE, 908 | szFileName: *const TCHAR, 909 | szArchivedName: *const ::std::os::raw::c_char, 910 | dwFlags: DWORD, 911 | dwCompression: DWORD, 912 | dwCompressionNext: DWORD, 913 | ) -> bool; 914 | } 915 | extern "C" { 916 | pub fn SFileAddFile( 917 | hMpq: HANDLE, 918 | szFileName: *const TCHAR, 919 | szArchivedName: *const ::std::os::raw::c_char, 920 | dwFlags: DWORD, 921 | ) -> bool; 922 | } 923 | extern "C" { 924 | pub fn SFileAddWave( 925 | hMpq: HANDLE, 926 | szFileName: *const TCHAR, 927 | szArchivedName: *const ::std::os::raw::c_char, 928 | dwFlags: DWORD, 929 | dwQuality: DWORD, 930 | ) -> bool; 931 | } 932 | extern "C" { 933 | pub fn SFileRemoveFile( 934 | hMpq: HANDLE, 935 | szFileName: *const ::std::os::raw::c_char, 936 | dwSearchScope: DWORD, 937 | ) -> bool; 938 | } 939 | extern "C" { 940 | pub fn SFileRenameFile( 941 | hMpq: HANDLE, 942 | szOldFileName: *const ::std::os::raw::c_char, 943 | szNewFileName: *const ::std::os::raw::c_char, 944 | ) -> bool; 945 | } 946 | extern "C" { 947 | pub fn SFileSetFileLocale(hFile: HANDLE, lcNewLocale: LCID) -> bool; 948 | } 949 | extern "C" { 950 | pub fn SFileSetDataCompression(DataCompression: DWORD) -> bool; 951 | } 952 | extern "C" { 953 | pub fn SFileSetAddFileCallback( 954 | hMpq: HANDLE, 955 | AddFileCB: SFILE_ADDFILE_CALLBACK, 956 | pvUserData: *mut ::std::os::raw::c_void, 957 | ) -> bool; 958 | } 959 | extern "C" { 960 | pub fn SCompImplode( 961 | pvOutBuffer: *mut ::std::os::raw::c_void, 962 | pcbOutBuffer: *mut ::std::os::raw::c_int, 963 | pvInBuffer: *mut ::std::os::raw::c_void, 964 | cbInBuffer: ::std::os::raw::c_int, 965 | ) -> ::std::os::raw::c_int; 966 | } 967 | extern "C" { 968 | pub fn SCompExplode( 969 | pvOutBuffer: *mut ::std::os::raw::c_void, 970 | pcbOutBuffer: *mut ::std::os::raw::c_int, 971 | pvInBuffer: *mut ::std::os::raw::c_void, 972 | cbInBuffer: ::std::os::raw::c_int, 973 | ) -> ::std::os::raw::c_int; 974 | } 975 | extern "C" { 976 | pub fn SCompCompress( 977 | pvOutBuffer: *mut ::std::os::raw::c_void, 978 | pcbOutBuffer: *mut ::std::os::raw::c_int, 979 | pvInBuffer: *mut ::std::os::raw::c_void, 980 | cbInBuffer: ::std::os::raw::c_int, 981 | uCompressionMask: ::std::os::raw::c_uint, 982 | nCmpType: ::std::os::raw::c_int, 983 | nCmpLevel: ::std::os::raw::c_int, 984 | ) -> ::std::os::raw::c_int; 985 | } 986 | extern "C" { 987 | pub fn SCompDecompress( 988 | pvOutBuffer: *mut ::std::os::raw::c_void, 989 | pcbOutBuffer: *mut ::std::os::raw::c_int, 990 | pvInBuffer: *mut ::std::os::raw::c_void, 991 | cbInBuffer: ::std::os::raw::c_int, 992 | ) -> ::std::os::raw::c_int; 993 | } 994 | extern "C" { 995 | pub fn SCompDecompress2( 996 | pvOutBuffer: *mut ::std::os::raw::c_void, 997 | pcbOutBuffer: *mut ::std::os::raw::c_int, 998 | pvInBuffer: *mut ::std::os::raw::c_void, 999 | cbInBuffer: ::std::os::raw::c_int, 1000 | ) -> ::std::os::raw::c_int; 1001 | } 1002 | -------------------------------------------------------------------------------- /crates/stormlib-sys/src/bindings_macos.rs: -------------------------------------------------------------------------------- 1 | /* automatically generated by rust-bindgen 0.69.4 */ 2 | 3 | pub const ERROR_SUCCESS: u32 = 0; 4 | pub const ERROR_FILE_NOT_FOUND: u32 = 2; 5 | pub const ERROR_ACCESS_DENIED: u32 = 1; 6 | pub const ERROR_INVALID_HANDLE: u32 = 9; 7 | pub const ERROR_NOT_ENOUGH_MEMORY: u32 = 12; 8 | pub const ERROR_NOT_SUPPORTED: u32 = 45; 9 | pub const ERROR_INVALID_PARAMETER: u32 = 22; 10 | pub const ERROR_NEGATIVE_SEEK: u32 = 29; 11 | pub const ERROR_DISK_FULL: u32 = 28; 12 | pub const ERROR_ALREADY_EXISTS: u32 = 17; 13 | pub const ERROR_INSUFFICIENT_BUFFER: u32 = 55; 14 | pub const ERROR_BAD_FORMAT: u32 = 1000; 15 | pub const ERROR_NO_MORE_FILES: u32 = 1001; 16 | pub const ERROR_HANDLE_EOF: u32 = 1002; 17 | pub const ERROR_CAN_NOT_COMPLETE: u32 = 1003; 18 | pub const ERROR_FILE_CORRUPT: u32 = 1004; 19 | pub const ERROR_BUFFER_OVERFLOW: u32 = 1005; 20 | pub const STORMLIB_VERSION: u32 = 2329; 21 | pub const STORMLIB_VERSION_STRING: &[u8; 5] = b"9.25\0"; 22 | pub const ID_MPQ: u32 = 441536589; 23 | pub const ID_MPQ_USERDATA: u32 = 458313805; 24 | pub const ID_MPK: u32 = 441143373; 25 | pub const ERROR_AVI_FILE: u32 = 10000; 26 | pub const ERROR_UNKNOWN_FILE_KEY: u32 = 10001; 27 | pub const ERROR_CHECKSUM_ERROR: u32 = 10002; 28 | pub const ERROR_INTERNAL_FILE: u32 = 10003; 29 | pub const ERROR_BASE_FILE_MISSING: u32 = 10004; 30 | pub const ERROR_MARKED_FOR_DELETE: u32 = 10005; 31 | pub const ERROR_FILE_INCOMPLETE: u32 = 10006; 32 | pub const ERROR_UNKNOWN_FILE_NAMES: u32 = 10007; 33 | pub const ERROR_CANT_FIND_PATCH_PREFIX: u32 = 10008; 34 | pub const ERROR_FAKE_MPQ_HEADER: u32 = 10009; 35 | pub const HASH_TABLE_SIZE_MIN: u32 = 4; 36 | pub const HASH_TABLE_SIZE_DEFAULT: u32 = 4096; 37 | pub const HASH_TABLE_SIZE_MAX: u32 = 524288; 38 | pub const HASH_ENTRY_DELETED: u32 = 4294967294; 39 | pub const HASH_ENTRY_FREE: u32 = 4294967295; 40 | pub const HET_ENTRY_DELETED: u32 = 128; 41 | pub const HET_ENTRY_FREE: u32 = 0; 42 | pub const SFILE_OPEN_HARD_DISK_FILE: u32 = 2; 43 | pub const SFILE_OPEN_CDROM_FILE: u32 = 3; 44 | pub const SFILE_OPEN_FROM_MPQ: u32 = 0; 45 | pub const SFILE_OPEN_CHECK_EXISTS: u32 = 4294967292; 46 | pub const SFILE_OPEN_BASE_FILE: u32 = 4294967293; 47 | pub const SFILE_OPEN_ANY_LOCALE: u32 = 4294967294; 48 | pub const SFILE_OPEN_LOCAL_FILE: u32 = 4294967295; 49 | pub const MPQ_FLAG_READ_ONLY: u32 = 1; 50 | pub const MPQ_FLAG_CHANGED: u32 = 2; 51 | pub const MPQ_FLAG_MALFORMED: u32 = 4; 52 | pub const MPQ_FLAG_HASH_TABLE_CUT: u32 = 8; 53 | pub const MPQ_FLAG_BLOCK_TABLE_CUT: u32 = 16; 54 | pub const MPQ_FLAG_CHECK_SECTOR_CRC: u32 = 32; 55 | pub const MPQ_FLAG_SAVING_TABLES: u32 = 64; 56 | pub const MPQ_FLAG_PATCH: u32 = 128; 57 | pub const MPQ_FLAG_WAR3_MAP: u32 = 1024; 58 | pub const MPQ_FLAG_LISTFILE_NONE: u32 = 2048; 59 | pub const MPQ_FLAG_LISTFILE_NEW: u32 = 4096; 60 | pub const MPQ_FLAG_LISTFILE_FORCE: u32 = 8192; 61 | pub const MPQ_FLAG_ATTRIBUTES_NONE: u32 = 16384; 62 | pub const MPQ_FLAG_ATTRIBUTES_NEW: u32 = 32768; 63 | pub const MPQ_FLAG_SIGNATURE_NONE: u32 = 65536; 64 | pub const MPQ_FLAG_SIGNATURE_NEW: u32 = 131072; 65 | pub const MPQ_SUBTYPE_MPQ: u32 = 0; 66 | pub const MPQ_SUBTYPE_SQP: u32 = 1; 67 | pub const MPQ_SUBTYPE_MPK: u32 = 2; 68 | pub const SFILE_INVALID_SIZE: u32 = 4294967295; 69 | pub const SFILE_INVALID_POS: u32 = 4294967295; 70 | pub const SFILE_INVALID_ATTRIBUTES: u32 = 4294967295; 71 | pub const MPQ_FILE_IMPLODE: u32 = 256; 72 | pub const MPQ_FILE_COMPRESS: u32 = 512; 73 | pub const MPQ_FILE_ENCRYPTED: u32 = 65536; 74 | pub const MPQ_FILE_PATCH_FILE: u32 = 1048576; 75 | pub const MPQ_FILE_SINGLE_UNIT: u32 = 16777216; 76 | pub const MPQ_FILE_DELETE_MARKER: u32 = 33554432; 77 | pub const MPQ_FILE_SECTOR_CRC: u32 = 67108864; 78 | pub const MPQ_FILE_SIGNATURE: u32 = 268435456; 79 | pub const MPQ_FILE_EXISTS: u32 = 2147483648; 80 | pub const MPQ_FILE_REPLACEEXISTING: u32 = 2147483648; 81 | pub const MPQ_FILE_COMPRESS_MASK: u32 = 65280; 82 | pub const MPQ_FILE_DEFAULT_INTERNAL: u32 = 4294967295; 83 | pub const MPQ_FILE_FIX_KEY: u32 = 131072; 84 | pub const MPQ_FILE_VALID_FLAGS: u32 = 2534605568; 85 | pub const MPQ_FILE_VALID_FLAGS_W3X: u32 = 2516779776; 86 | pub const BLOCK_INDEX_MASK: u32 = 268435455; 87 | pub const MPQ_COMPRESSION_HUFFMANN: u32 = 1; 88 | pub const MPQ_COMPRESSION_ZLIB: u32 = 2; 89 | pub const MPQ_COMPRESSION_PKWARE: u32 = 8; 90 | pub const MPQ_COMPRESSION_BZIP2: u32 = 16; 91 | pub const MPQ_COMPRESSION_SPARSE: u32 = 32; 92 | pub const MPQ_COMPRESSION_ADPCM_MONO: u32 = 64; 93 | pub const MPQ_COMPRESSION_ADPCM_STEREO: u32 = 128; 94 | pub const MPQ_COMPRESSION_LZMA: u32 = 18; 95 | pub const MPQ_COMPRESSION_NEXT_SAME: u32 = 4294967295; 96 | pub const MPQ_WAVE_QUALITY_HIGH: u32 = 0; 97 | pub const MPQ_WAVE_QUALITY_MEDIUM: u32 = 1; 98 | pub const MPQ_WAVE_QUALITY_LOW: u32 = 2; 99 | pub const HET_TABLE_SIGNATURE: u32 = 441730376; 100 | pub const BET_TABLE_SIGNATURE: u32 = 441730370; 101 | pub const MPQ_KEY_HASH_TABLE: u32 = 3283040112; 102 | pub const MPQ_KEY_BLOCK_TABLE: u32 = 3968054179; 103 | pub const LISTFILE_NAME: &[u8; 11] = b"(listfile)\0"; 104 | pub const SIGNATURE_NAME: &[u8; 12] = b"(signature)\0"; 105 | pub const ATTRIBUTES_NAME: &[u8; 13] = b"(attributes)\0"; 106 | pub const PATCH_METADATA_NAME: &[u8; 17] = b"(patch_metadata)\0"; 107 | pub const MPQ_FORMAT_VERSION_1: u32 = 0; 108 | pub const MPQ_FORMAT_VERSION_2: u32 = 1; 109 | pub const MPQ_FORMAT_VERSION_3: u32 = 2; 110 | pub const MPQ_FORMAT_VERSION_4: u32 = 3; 111 | pub const MPQ_ATTRIBUTE_CRC32: u32 = 1; 112 | pub const MPQ_ATTRIBUTE_FILETIME: u32 = 2; 113 | pub const MPQ_ATTRIBUTE_MD5: u32 = 4; 114 | pub const MPQ_ATTRIBUTE_PATCH_BIT: u32 = 8; 115 | pub const MPQ_ATTRIBUTE_ALL: u32 = 15; 116 | pub const MPQ_ATTRIBUTES_V1: u32 = 100; 117 | pub const BASE_PROVIDER_FILE: u32 = 0; 118 | pub const BASE_PROVIDER_MAP: u32 = 1; 119 | pub const BASE_PROVIDER_HTTP: u32 = 2; 120 | pub const BASE_PROVIDER_MASK: u32 = 15; 121 | pub const STREAM_PROVIDER_FLAT: u32 = 0; 122 | pub const STREAM_PROVIDER_PARTIAL: u32 = 16; 123 | pub const STREAM_PROVIDER_MPQE: u32 = 32; 124 | pub const STREAM_PROVIDER_BLOCK4: u32 = 48; 125 | pub const STREAM_PROVIDER_MASK: u32 = 240; 126 | pub const STREAM_FLAG_READ_ONLY: u32 = 256; 127 | pub const STREAM_FLAG_WRITE_SHARE: u32 = 512; 128 | pub const STREAM_FLAG_USE_BITMAP: u32 = 1024; 129 | pub const STREAM_OPTIONS_MASK: u32 = 65280; 130 | pub const STREAM_PROVIDERS_MASK: u32 = 255; 131 | pub const STREAM_FLAGS_MASK: u32 = 65535; 132 | pub const MPQ_OPEN_NO_LISTFILE: u32 = 65536; 133 | pub const MPQ_OPEN_NO_ATTRIBUTES: u32 = 131072; 134 | pub const MPQ_OPEN_NO_HEADER_SEARCH: u32 = 262144; 135 | pub const MPQ_OPEN_FORCE_MPQ_V1: u32 = 524288; 136 | pub const MPQ_OPEN_CHECK_SECTOR_CRC: u32 = 1048576; 137 | pub const MPQ_OPEN_PATCH: u32 = 2097152; 138 | pub const MPQ_OPEN_FORCE_LISTFILE: u32 = 4194304; 139 | pub const MPQ_OPEN_READ_ONLY: u32 = 256; 140 | pub const MPQ_CREATE_LISTFILE: u32 = 1048576; 141 | pub const MPQ_CREATE_ATTRIBUTES: u32 = 2097152; 142 | pub const MPQ_CREATE_SIGNATURE: u32 = 4194304; 143 | pub const MPQ_CREATE_ARCHIVE_V1: u32 = 0; 144 | pub const MPQ_CREATE_ARCHIVE_V2: u32 = 16777216; 145 | pub const MPQ_CREATE_ARCHIVE_V3: u32 = 33554432; 146 | pub const MPQ_CREATE_ARCHIVE_V4: u32 = 50331648; 147 | pub const MPQ_CREATE_ARCHIVE_VMASK: u32 = 251658240; 148 | pub const FLAGS_TO_FORMAT_SHIFT: u32 = 24; 149 | pub const SFILE_VERIFY_SECTOR_CRC: u32 = 1; 150 | pub const SFILE_VERIFY_FILE_CRC: u32 = 2; 151 | pub const SFILE_VERIFY_FILE_MD5: u32 = 4; 152 | pub const SFILE_VERIFY_RAW_MD5: u32 = 8; 153 | pub const SFILE_VERIFY_ALL: u32 = 15; 154 | pub const VERIFY_OPEN_ERROR: u32 = 1; 155 | pub const VERIFY_READ_ERROR: u32 = 2; 156 | pub const VERIFY_FILE_HAS_SECTOR_CRC: u32 = 4; 157 | pub const VERIFY_FILE_SECTOR_CRC_ERROR: u32 = 8; 158 | pub const VERIFY_FILE_HAS_CHECKSUM: u32 = 16; 159 | pub const VERIFY_FILE_CHECKSUM_ERROR: u32 = 32; 160 | pub const VERIFY_FILE_HAS_MD5: u32 = 64; 161 | pub const VERIFY_FILE_MD5_ERROR: u32 = 128; 162 | pub const VERIFY_FILE_HAS_RAW_MD5: u32 = 256; 163 | pub const VERIFY_FILE_RAW_MD5_ERROR: u32 = 512; 164 | pub const VERIFY_FILE_ERROR_MASK: u32 = 683; 165 | pub const SFILE_VERIFY_MPQ_HEADER: u32 = 1; 166 | pub const SFILE_VERIFY_HET_TABLE: u32 = 2; 167 | pub const SFILE_VERIFY_BET_TABLE: u32 = 3; 168 | pub const SFILE_VERIFY_HASH_TABLE: u32 = 4; 169 | pub const SFILE_VERIFY_BLOCK_TABLE: u32 = 5; 170 | pub const SFILE_VERIFY_HIBLOCK_TABLE: u32 = 6; 171 | pub const SFILE_VERIFY_FILE: u32 = 7; 172 | pub const SIGNATURE_TYPE_NONE: u32 = 0; 173 | pub const SIGNATURE_TYPE_WEAK: u32 = 1; 174 | pub const SIGNATURE_TYPE_STRONG: u32 = 2; 175 | pub const ERROR_NO_SIGNATURE: u32 = 0; 176 | pub const ERROR_VERIFY_FAILED: u32 = 1; 177 | pub const ERROR_WEAK_SIGNATURE_OK: u32 = 2; 178 | pub const ERROR_WEAK_SIGNATURE_ERROR: u32 = 3; 179 | pub const ERROR_STRONG_SIGNATURE_OK: u32 = 4; 180 | pub const ERROR_STRONG_SIGNATURE_ERROR: u32 = 5; 181 | pub const MD5_DIGEST_SIZE: u32 = 16; 182 | pub const SHA1_DIGEST_SIZE: u32 = 20; 183 | pub const LANG_NEUTRAL: u32 = 0; 184 | pub const CCB_CHECKING_FILES: u32 = 1; 185 | pub const CCB_CHECKING_HASH_TABLE: u32 = 2; 186 | pub const CCB_COPYING_NON_MPQ_DATA: u32 = 3; 187 | pub const CCB_COMPACTING_FILES: u32 = 4; 188 | pub const CCB_CLOSING_ARCHIVE: u32 = 5; 189 | pub const MPQ_HEADER_SIZE_V1: u32 = 32; 190 | pub const MPQ_HEADER_SIZE_V2: u32 = 44; 191 | pub const MPQ_HEADER_SIZE_V3: u32 = 68; 192 | pub const MPQ_HEADER_SIZE_V4: u32 = 208; 193 | pub const MPQ_HEADER_DWORDS: u32 = 52; 194 | pub type LONG = ::std::os::raw::c_int; 195 | pub type DWORD = ::std::os::raw::c_uint; 196 | pub type ULONGLONG = ::std::os::raw::c_ulonglong; 197 | pub type HANDLE = *mut ::std::os::raw::c_void; 198 | pub type LPOVERLAPPED = *mut ::std::os::raw::c_void; 199 | pub type TCHAR = ::std::os::raw::c_char; 200 | pub type LCID = ::std::os::raw::c_uint; 201 | pub type LPDWORD = *mut DWORD; 202 | pub const _SFileInfoClass_SFileMpqFileName: _SFileInfoClass = 0; 203 | pub const _SFileInfoClass_SFileMpqStreamBitmap: _SFileInfoClass = 1; 204 | pub const _SFileInfoClass_SFileMpqUserDataOffset: _SFileInfoClass = 2; 205 | pub const _SFileInfoClass_SFileMpqUserDataHeader: _SFileInfoClass = 3; 206 | pub const _SFileInfoClass_SFileMpqUserData: _SFileInfoClass = 4; 207 | pub const _SFileInfoClass_SFileMpqHeaderOffset: _SFileInfoClass = 5; 208 | pub const _SFileInfoClass_SFileMpqHeaderSize: _SFileInfoClass = 6; 209 | pub const _SFileInfoClass_SFileMpqHeader: _SFileInfoClass = 7; 210 | pub const _SFileInfoClass_SFileMpqHetTableOffset: _SFileInfoClass = 8; 211 | pub const _SFileInfoClass_SFileMpqHetTableSize: _SFileInfoClass = 9; 212 | pub const _SFileInfoClass_SFileMpqHetHeader: _SFileInfoClass = 10; 213 | pub const _SFileInfoClass_SFileMpqHetTable: _SFileInfoClass = 11; 214 | pub const _SFileInfoClass_SFileMpqBetTableOffset: _SFileInfoClass = 12; 215 | pub const _SFileInfoClass_SFileMpqBetTableSize: _SFileInfoClass = 13; 216 | pub const _SFileInfoClass_SFileMpqBetHeader: _SFileInfoClass = 14; 217 | pub const _SFileInfoClass_SFileMpqBetTable: _SFileInfoClass = 15; 218 | pub const _SFileInfoClass_SFileMpqHashTableOffset: _SFileInfoClass = 16; 219 | pub const _SFileInfoClass_SFileMpqHashTableSize64: _SFileInfoClass = 17; 220 | pub const _SFileInfoClass_SFileMpqHashTableSize: _SFileInfoClass = 18; 221 | pub const _SFileInfoClass_SFileMpqHashTable: _SFileInfoClass = 19; 222 | pub const _SFileInfoClass_SFileMpqBlockTableOffset: _SFileInfoClass = 20; 223 | pub const _SFileInfoClass_SFileMpqBlockTableSize64: _SFileInfoClass = 21; 224 | pub const _SFileInfoClass_SFileMpqBlockTableSize: _SFileInfoClass = 22; 225 | pub const _SFileInfoClass_SFileMpqBlockTable: _SFileInfoClass = 23; 226 | pub const _SFileInfoClass_SFileMpqHiBlockTableOffset: _SFileInfoClass = 24; 227 | pub const _SFileInfoClass_SFileMpqHiBlockTableSize64: _SFileInfoClass = 25; 228 | pub const _SFileInfoClass_SFileMpqHiBlockTable: _SFileInfoClass = 26; 229 | pub const _SFileInfoClass_SFileMpqSignatures: _SFileInfoClass = 27; 230 | pub const _SFileInfoClass_SFileMpqStrongSignatureOffset: _SFileInfoClass = 28; 231 | pub const _SFileInfoClass_SFileMpqStrongSignatureSize: _SFileInfoClass = 29; 232 | pub const _SFileInfoClass_SFileMpqStrongSignature: _SFileInfoClass = 30; 233 | pub const _SFileInfoClass_SFileMpqArchiveSize64: _SFileInfoClass = 31; 234 | pub const _SFileInfoClass_SFileMpqArchiveSize: _SFileInfoClass = 32; 235 | pub const _SFileInfoClass_SFileMpqMaxFileCount: _SFileInfoClass = 33; 236 | pub const _SFileInfoClass_SFileMpqFileTableSize: _SFileInfoClass = 34; 237 | pub const _SFileInfoClass_SFileMpqSectorSize: _SFileInfoClass = 35; 238 | pub const _SFileInfoClass_SFileMpqNumberOfFiles: _SFileInfoClass = 36; 239 | pub const _SFileInfoClass_SFileMpqRawChunkSize: _SFileInfoClass = 37; 240 | pub const _SFileInfoClass_SFileMpqStreamFlags: _SFileInfoClass = 38; 241 | pub const _SFileInfoClass_SFileMpqFlags: _SFileInfoClass = 39; 242 | pub const _SFileInfoClass_SFileInfoPatchChain: _SFileInfoClass = 40; 243 | pub const _SFileInfoClass_SFileInfoFileEntry: _SFileInfoClass = 41; 244 | pub const _SFileInfoClass_SFileInfoHashEntry: _SFileInfoClass = 42; 245 | pub const _SFileInfoClass_SFileInfoHashIndex: _SFileInfoClass = 43; 246 | pub const _SFileInfoClass_SFileInfoNameHash1: _SFileInfoClass = 44; 247 | pub const _SFileInfoClass_SFileInfoNameHash2: _SFileInfoClass = 45; 248 | pub const _SFileInfoClass_SFileInfoNameHash3: _SFileInfoClass = 46; 249 | pub const _SFileInfoClass_SFileInfoLocale: _SFileInfoClass = 47; 250 | pub const _SFileInfoClass_SFileInfoFileIndex: _SFileInfoClass = 48; 251 | pub const _SFileInfoClass_SFileInfoByteOffset: _SFileInfoClass = 49; 252 | pub const _SFileInfoClass_SFileInfoFileTime: _SFileInfoClass = 50; 253 | pub const _SFileInfoClass_SFileInfoFileSize: _SFileInfoClass = 51; 254 | pub const _SFileInfoClass_SFileInfoCompressedSize: _SFileInfoClass = 52; 255 | pub const _SFileInfoClass_SFileInfoFlags: _SFileInfoClass = 53; 256 | pub const _SFileInfoClass_SFileInfoEncryptionKey: _SFileInfoClass = 54; 257 | pub const _SFileInfoClass_SFileInfoEncryptionKeyRaw: _SFileInfoClass = 55; 258 | pub const _SFileInfoClass_SFileInfoCRC32: _SFileInfoClass = 56; 259 | pub const _SFileInfoClass_SFileInfoInvalid: _SFileInfoClass = 4095; 260 | pub type _SFileInfoClass = ::std::os::raw::c_uint; 261 | pub use self::_SFileInfoClass as SFileInfoClass; 262 | pub type SFILE_DOWNLOAD_CALLBACK = ::std::option::Option< 263 | unsafe extern "C" fn( 264 | pvUserData: *mut ::std::os::raw::c_void, 265 | ByteOffset: ULONGLONG, 266 | dwTotalBytes: DWORD, 267 | ), 268 | >; 269 | pub type SFILE_ADDFILE_CALLBACK = ::std::option::Option< 270 | unsafe extern "C" fn( 271 | pvUserData: *mut ::std::os::raw::c_void, 272 | dwBytesWritten: DWORD, 273 | dwTotalBytes: DWORD, 274 | bFinalCall: bool, 275 | ), 276 | >; 277 | pub type SFILE_COMPACT_CALLBACK = ::std::option::Option< 278 | unsafe extern "C" fn( 279 | pvUserData: *mut ::std::os::raw::c_void, 280 | dwWorkType: DWORD, 281 | BytesProcessed: ULONGLONG, 282 | TotalBytes: ULONGLONG, 283 | ), 284 | >; 285 | #[repr(C)] 286 | #[derive(Debug, Copy, Clone)] 287 | pub struct _SFILE_FIND_DATA { 288 | pub cFileName: [::std::os::raw::c_char; 1024usize], 289 | pub szPlainName: *mut ::std::os::raw::c_char, 290 | pub dwHashIndex: DWORD, 291 | pub dwBlockIndex: DWORD, 292 | pub dwFileSize: DWORD, 293 | pub dwFileFlags: DWORD, 294 | pub dwCompSize: DWORD, 295 | pub dwFileTimeLo: DWORD, 296 | pub dwFileTimeHi: DWORD, 297 | pub lcLocale: LCID, 298 | } 299 | #[test] 300 | fn bindgen_test_layout__SFILE_FIND_DATA() { 301 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_FIND_DATA> = ::std::mem::MaybeUninit::uninit(); 302 | let ptr = UNINIT.as_ptr(); 303 | assert_eq!( 304 | ::std::mem::size_of::<_SFILE_FIND_DATA>(), 305 | 1064usize, 306 | concat!("Size of: ", stringify!(_SFILE_FIND_DATA)) 307 | ); 308 | assert_eq!( 309 | ::std::mem::align_of::<_SFILE_FIND_DATA>(), 310 | 8usize, 311 | concat!("Alignment of ", stringify!(_SFILE_FIND_DATA)) 312 | ); 313 | assert_eq!( 314 | unsafe { ::std::ptr::addr_of!((*ptr).cFileName) as usize - ptr as usize }, 315 | 0usize, 316 | concat!( 317 | "Offset of field: ", 318 | stringify!(_SFILE_FIND_DATA), 319 | "::", 320 | stringify!(cFileName) 321 | ) 322 | ); 323 | assert_eq!( 324 | unsafe { ::std::ptr::addr_of!((*ptr).szPlainName) as usize - ptr as usize }, 325 | 1024usize, 326 | concat!( 327 | "Offset of field: ", 328 | stringify!(_SFILE_FIND_DATA), 329 | "::", 330 | stringify!(szPlainName) 331 | ) 332 | ); 333 | assert_eq!( 334 | unsafe { ::std::ptr::addr_of!((*ptr).dwHashIndex) as usize - ptr as usize }, 335 | 1032usize, 336 | concat!( 337 | "Offset of field: ", 338 | stringify!(_SFILE_FIND_DATA), 339 | "::", 340 | stringify!(dwHashIndex) 341 | ) 342 | ); 343 | assert_eq!( 344 | unsafe { ::std::ptr::addr_of!((*ptr).dwBlockIndex) as usize - ptr as usize }, 345 | 1036usize, 346 | concat!( 347 | "Offset of field: ", 348 | stringify!(_SFILE_FIND_DATA), 349 | "::", 350 | stringify!(dwBlockIndex) 351 | ) 352 | ); 353 | assert_eq!( 354 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileSize) as usize - ptr as usize }, 355 | 1040usize, 356 | concat!( 357 | "Offset of field: ", 358 | stringify!(_SFILE_FIND_DATA), 359 | "::", 360 | stringify!(dwFileSize) 361 | ) 362 | ); 363 | assert_eq!( 364 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags) as usize - ptr as usize }, 365 | 1044usize, 366 | concat!( 367 | "Offset of field: ", 368 | stringify!(_SFILE_FIND_DATA), 369 | "::", 370 | stringify!(dwFileFlags) 371 | ) 372 | ); 373 | assert_eq!( 374 | unsafe { ::std::ptr::addr_of!((*ptr).dwCompSize) as usize - ptr as usize }, 375 | 1048usize, 376 | concat!( 377 | "Offset of field: ", 378 | stringify!(_SFILE_FIND_DATA), 379 | "::", 380 | stringify!(dwCompSize) 381 | ) 382 | ); 383 | assert_eq!( 384 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileTimeLo) as usize - ptr as usize }, 385 | 1052usize, 386 | concat!( 387 | "Offset of field: ", 388 | stringify!(_SFILE_FIND_DATA), 389 | "::", 390 | stringify!(dwFileTimeLo) 391 | ) 392 | ); 393 | assert_eq!( 394 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileTimeHi) as usize - ptr as usize }, 395 | 1056usize, 396 | concat!( 397 | "Offset of field: ", 398 | stringify!(_SFILE_FIND_DATA), 399 | "::", 400 | stringify!(dwFileTimeHi) 401 | ) 402 | ); 403 | assert_eq!( 404 | unsafe { ::std::ptr::addr_of!((*ptr).lcLocale) as usize - ptr as usize }, 405 | 1060usize, 406 | concat!( 407 | "Offset of field: ", 408 | stringify!(_SFILE_FIND_DATA), 409 | "::", 410 | stringify!(lcLocale) 411 | ) 412 | ); 413 | } 414 | pub type SFILE_FIND_DATA = _SFILE_FIND_DATA; 415 | #[repr(C)] 416 | #[derive(Debug, Copy, Clone)] 417 | pub struct _SFILE_CREATE_MPQ { 418 | pub cbSize: DWORD, 419 | pub dwMpqVersion: DWORD, 420 | pub pvUserData: *mut ::std::os::raw::c_void, 421 | pub cbUserData: DWORD, 422 | pub dwStreamFlags: DWORD, 423 | pub dwFileFlags1: DWORD, 424 | pub dwFileFlags2: DWORD, 425 | pub dwFileFlags3: DWORD, 426 | pub dwAttrFlags: DWORD, 427 | pub dwSectorSize: DWORD, 428 | pub dwRawChunkSize: DWORD, 429 | pub dwMaxFileCount: DWORD, 430 | } 431 | #[test] 432 | fn bindgen_test_layout__SFILE_CREATE_MPQ() { 433 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_CREATE_MPQ> = ::std::mem::MaybeUninit::uninit(); 434 | let ptr = UNINIT.as_ptr(); 435 | assert_eq!( 436 | ::std::mem::size_of::<_SFILE_CREATE_MPQ>(), 437 | 56usize, 438 | concat!("Size of: ", stringify!(_SFILE_CREATE_MPQ)) 439 | ); 440 | assert_eq!( 441 | ::std::mem::align_of::<_SFILE_CREATE_MPQ>(), 442 | 8usize, 443 | concat!("Alignment of ", stringify!(_SFILE_CREATE_MPQ)) 444 | ); 445 | assert_eq!( 446 | unsafe { ::std::ptr::addr_of!((*ptr).cbSize) as usize - ptr as usize }, 447 | 0usize, 448 | concat!( 449 | "Offset of field: ", 450 | stringify!(_SFILE_CREATE_MPQ), 451 | "::", 452 | stringify!(cbSize) 453 | ) 454 | ); 455 | assert_eq!( 456 | unsafe { ::std::ptr::addr_of!((*ptr).dwMpqVersion) as usize - ptr as usize }, 457 | 4usize, 458 | concat!( 459 | "Offset of field: ", 460 | stringify!(_SFILE_CREATE_MPQ), 461 | "::", 462 | stringify!(dwMpqVersion) 463 | ) 464 | ); 465 | assert_eq!( 466 | unsafe { ::std::ptr::addr_of!((*ptr).pvUserData) as usize - ptr as usize }, 467 | 8usize, 468 | concat!( 469 | "Offset of field: ", 470 | stringify!(_SFILE_CREATE_MPQ), 471 | "::", 472 | stringify!(pvUserData) 473 | ) 474 | ); 475 | assert_eq!( 476 | unsafe { ::std::ptr::addr_of!((*ptr).cbUserData) as usize - ptr as usize }, 477 | 16usize, 478 | concat!( 479 | "Offset of field: ", 480 | stringify!(_SFILE_CREATE_MPQ), 481 | "::", 482 | stringify!(cbUserData) 483 | ) 484 | ); 485 | assert_eq!( 486 | unsafe { ::std::ptr::addr_of!((*ptr).dwStreamFlags) as usize - ptr as usize }, 487 | 20usize, 488 | concat!( 489 | "Offset of field: ", 490 | stringify!(_SFILE_CREATE_MPQ), 491 | "::", 492 | stringify!(dwStreamFlags) 493 | ) 494 | ); 495 | assert_eq!( 496 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags1) as usize - ptr as usize }, 497 | 24usize, 498 | concat!( 499 | "Offset of field: ", 500 | stringify!(_SFILE_CREATE_MPQ), 501 | "::", 502 | stringify!(dwFileFlags1) 503 | ) 504 | ); 505 | assert_eq!( 506 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags2) as usize - ptr as usize }, 507 | 28usize, 508 | concat!( 509 | "Offset of field: ", 510 | stringify!(_SFILE_CREATE_MPQ), 511 | "::", 512 | stringify!(dwFileFlags2) 513 | ) 514 | ); 515 | assert_eq!( 516 | unsafe { ::std::ptr::addr_of!((*ptr).dwFileFlags3) as usize - ptr as usize }, 517 | 32usize, 518 | concat!( 519 | "Offset of field: ", 520 | stringify!(_SFILE_CREATE_MPQ), 521 | "::", 522 | stringify!(dwFileFlags3) 523 | ) 524 | ); 525 | assert_eq!( 526 | unsafe { ::std::ptr::addr_of!((*ptr).dwAttrFlags) as usize - ptr as usize }, 527 | 36usize, 528 | concat!( 529 | "Offset of field: ", 530 | stringify!(_SFILE_CREATE_MPQ), 531 | "::", 532 | stringify!(dwAttrFlags) 533 | ) 534 | ); 535 | assert_eq!( 536 | unsafe { ::std::ptr::addr_of!((*ptr).dwSectorSize) as usize - ptr as usize }, 537 | 40usize, 538 | concat!( 539 | "Offset of field: ", 540 | stringify!(_SFILE_CREATE_MPQ), 541 | "::", 542 | stringify!(dwSectorSize) 543 | ) 544 | ); 545 | assert_eq!( 546 | unsafe { ::std::ptr::addr_of!((*ptr).dwRawChunkSize) as usize - ptr as usize }, 547 | 44usize, 548 | concat!( 549 | "Offset of field: ", 550 | stringify!(_SFILE_CREATE_MPQ), 551 | "::", 552 | stringify!(dwRawChunkSize) 553 | ) 554 | ); 555 | assert_eq!( 556 | unsafe { ::std::ptr::addr_of!((*ptr).dwMaxFileCount) as usize - ptr as usize }, 557 | 48usize, 558 | concat!( 559 | "Offset of field: ", 560 | stringify!(_SFILE_CREATE_MPQ), 561 | "::", 562 | stringify!(dwMaxFileCount) 563 | ) 564 | ); 565 | } 566 | pub type SFILE_CREATE_MPQ = _SFILE_CREATE_MPQ; 567 | pub type PSFILE_CREATE_MPQ = *mut _SFILE_CREATE_MPQ; 568 | #[repr(C)] 569 | #[derive(Debug, Copy, Clone)] 570 | pub struct _SFILE_MARKERS { 571 | pub dwSize: DWORD, 572 | pub dwSignature: DWORD, 573 | pub szHashTableKey: *const ::std::os::raw::c_char, 574 | pub szBlockTableKey: *const ::std::os::raw::c_char, 575 | } 576 | #[test] 577 | fn bindgen_test_layout__SFILE_MARKERS() { 578 | const UNINIT: ::std::mem::MaybeUninit<_SFILE_MARKERS> = ::std::mem::MaybeUninit::uninit(); 579 | let ptr = UNINIT.as_ptr(); 580 | assert_eq!( 581 | ::std::mem::size_of::<_SFILE_MARKERS>(), 582 | 24usize, 583 | concat!("Size of: ", stringify!(_SFILE_MARKERS)) 584 | ); 585 | assert_eq!( 586 | ::std::mem::align_of::<_SFILE_MARKERS>(), 587 | 8usize, 588 | concat!("Alignment of ", stringify!(_SFILE_MARKERS)) 589 | ); 590 | assert_eq!( 591 | unsafe { ::std::ptr::addr_of!((*ptr).dwSize) as usize - ptr as usize }, 592 | 0usize, 593 | concat!( 594 | "Offset of field: ", 595 | stringify!(_SFILE_MARKERS), 596 | "::", 597 | stringify!(dwSize) 598 | ) 599 | ); 600 | assert_eq!( 601 | unsafe { ::std::ptr::addr_of!((*ptr).dwSignature) as usize - ptr as usize }, 602 | 4usize, 603 | concat!( 604 | "Offset of field: ", 605 | stringify!(_SFILE_MARKERS), 606 | "::", 607 | stringify!(dwSignature) 608 | ) 609 | ); 610 | assert_eq!( 611 | unsafe { ::std::ptr::addr_of!((*ptr).szHashTableKey) as usize - ptr as usize }, 612 | 8usize, 613 | concat!( 614 | "Offset of field: ", 615 | stringify!(_SFILE_MARKERS), 616 | "::", 617 | stringify!(szHashTableKey) 618 | ) 619 | ); 620 | assert_eq!( 621 | unsafe { ::std::ptr::addr_of!((*ptr).szBlockTableKey) as usize - ptr as usize }, 622 | 16usize, 623 | concat!( 624 | "Offset of field: ", 625 | stringify!(_SFILE_MARKERS), 626 | "::", 627 | stringify!(szBlockTableKey) 628 | ) 629 | ); 630 | } 631 | pub type SFILE_MARKERS = _SFILE_MARKERS; 632 | pub type PSFILE_MARKERS = *mut _SFILE_MARKERS; 633 | pub type SFILESETLOCALE = ::std::option::Option LCID>; 634 | pub type SFILEOPENARCHIVE = ::std::option::Option< 635 | unsafe extern "C" fn( 636 | arg1: *const ::std::os::raw::c_char, 637 | arg2: DWORD, 638 | arg3: DWORD, 639 | arg4: *mut HANDLE, 640 | ) -> bool, 641 | >; 642 | pub type SFILECLOSEARCHIVE = ::std::option::Option bool>; 643 | pub type SFILEOPENFILEEX = ::std::option::Option< 644 | unsafe extern "C" fn( 645 | arg1: HANDLE, 646 | arg2: *const ::std::os::raw::c_char, 647 | arg3: DWORD, 648 | arg4: *mut HANDLE, 649 | ) -> bool, 650 | >; 651 | pub type SFILECLOSEFILE = ::std::option::Option bool>; 652 | pub type SFILEGETFILESIZE = 653 | ::std::option::Option DWORD>; 654 | pub type SFILESETFILEPOINTER = ::std::option::Option< 655 | unsafe extern "C" fn(arg1: HANDLE, arg2: LONG, arg3: *mut LONG, arg4: DWORD) -> DWORD, 656 | >; 657 | pub type SFILEREADFILE = ::std::option::Option< 658 | unsafe extern "C" fn( 659 | arg1: HANDLE, 660 | arg2: *mut ::std::os::raw::c_void, 661 | arg3: DWORD, 662 | arg4: LPDWORD, 663 | arg5: LPOVERLAPPED, 664 | ) -> bool, 665 | >; 666 | extern "C" { 667 | pub fn SFileSetArchiveMarkers(pMarkers: PSFILE_MARKERS) -> bool; 668 | } 669 | extern "C" { 670 | pub fn SFileGetLocale() -> LCID; 671 | } 672 | extern "C" { 673 | pub fn SFileSetLocale(lcFileLocale: LCID) -> LCID; 674 | } 675 | extern "C" { 676 | pub fn SFileOpenArchive( 677 | szMpqName: *const TCHAR, 678 | dwPriority: DWORD, 679 | dwFlags: DWORD, 680 | phMpq: *mut HANDLE, 681 | ) -> bool; 682 | } 683 | extern "C" { 684 | pub fn SFileCreateArchive( 685 | szMpqName: *const TCHAR, 686 | dwCreateFlags: DWORD, 687 | dwMaxFileCount: DWORD, 688 | phMpq: *mut HANDLE, 689 | ) -> bool; 690 | } 691 | extern "C" { 692 | pub fn SFileCreateArchive2( 693 | szMpqName: *const TCHAR, 694 | pCreateInfo: PSFILE_CREATE_MPQ, 695 | phMpq: *mut HANDLE, 696 | ) -> bool; 697 | } 698 | extern "C" { 699 | pub fn SFileSetDownloadCallback( 700 | hMpq: HANDLE, 701 | DownloadCB: SFILE_DOWNLOAD_CALLBACK, 702 | pvUserData: *mut ::std::os::raw::c_void, 703 | ) -> bool; 704 | } 705 | extern "C" { 706 | pub fn SFileFlushArchive(hMpq: HANDLE) -> bool; 707 | } 708 | extern "C" { 709 | pub fn SFileCloseArchive(hMpq: HANDLE) -> bool; 710 | } 711 | extern "C" { 712 | pub fn SFileAddListFile(hMpq: HANDLE, szListFile: *const TCHAR) -> DWORD; 713 | } 714 | extern "C" { 715 | pub fn SFileAddListFileEntries( 716 | hMpq: HANDLE, 717 | listFileEntries: *mut *const ::std::os::raw::c_char, 718 | dwEntryCount: DWORD, 719 | ) -> DWORD; 720 | } 721 | extern "C" { 722 | pub fn SFileSetCompactCallback( 723 | hMpq: HANDLE, 724 | CompactCB: SFILE_COMPACT_CALLBACK, 725 | pvUserData: *mut ::std::os::raw::c_void, 726 | ) -> bool; 727 | } 728 | extern "C" { 729 | pub fn SFileCompactArchive(hMpq: HANDLE, szListFile: *const TCHAR, bReserved: bool) -> bool; 730 | } 731 | extern "C" { 732 | pub fn SFileGetMaxFileCount(hMpq: HANDLE) -> DWORD; 733 | } 734 | extern "C" { 735 | pub fn SFileSetMaxFileCount(hMpq: HANDLE, dwMaxFileCount: DWORD) -> bool; 736 | } 737 | extern "C" { 738 | pub fn SFileGetAttributes(hMpq: HANDLE) -> DWORD; 739 | } 740 | extern "C" { 741 | pub fn SFileSetAttributes(hMpq: HANDLE, dwFlags: DWORD) -> bool; 742 | } 743 | extern "C" { 744 | pub fn SFileUpdateFileAttributes(hMpq: HANDLE, szFileName: *const ::std::os::raw::c_char) 745 | -> bool; 746 | } 747 | extern "C" { 748 | pub fn SFileOpenPatchArchive( 749 | hMpq: HANDLE, 750 | szPatchMpqName: *const TCHAR, 751 | szPatchPathPrefix: *const ::std::os::raw::c_char, 752 | dwFlags: DWORD, 753 | ) -> bool; 754 | } 755 | extern "C" { 756 | pub fn SFileIsPatchedArchive(hMpq: HANDLE) -> bool; 757 | } 758 | extern "C" { 759 | pub fn SFileHasFile(hMpq: HANDLE, szFileName: *const ::std::os::raw::c_char) -> bool; 760 | } 761 | extern "C" { 762 | pub fn SFileOpenFileEx( 763 | hMpq: HANDLE, 764 | szFileName: *const ::std::os::raw::c_char, 765 | dwSearchScope: DWORD, 766 | phFile: *mut HANDLE, 767 | ) -> bool; 768 | } 769 | extern "C" { 770 | pub fn SFileGetFileSize(hFile: HANDLE, pdwFileSizeHigh: LPDWORD) -> DWORD; 771 | } 772 | extern "C" { 773 | pub fn SFileSetFilePointer( 774 | hFile: HANDLE, 775 | lFilePos: LONG, 776 | plFilePosHigh: *mut LONG, 777 | dwMoveMethod: DWORD, 778 | ) -> DWORD; 779 | } 780 | extern "C" { 781 | pub fn SFileReadFile( 782 | hFile: HANDLE, 783 | lpBuffer: *mut ::std::os::raw::c_void, 784 | dwToRead: DWORD, 785 | pdwRead: LPDWORD, 786 | lpOverlapped: LPOVERLAPPED, 787 | ) -> bool; 788 | } 789 | extern "C" { 790 | pub fn SFileCloseFile(hFile: HANDLE) -> bool; 791 | } 792 | extern "C" { 793 | pub fn SFileGetFileInfo( 794 | hMpqOrFile: HANDLE, 795 | InfoClass: SFileInfoClass, 796 | pvFileInfo: *mut ::std::os::raw::c_void, 797 | cbFileInfo: DWORD, 798 | pcbLengthNeeded: LPDWORD, 799 | ) -> bool; 800 | } 801 | extern "C" { 802 | pub fn SFileGetFileName(hFile: HANDLE, szFileName: *mut ::std::os::raw::c_char) -> bool; 803 | } 804 | extern "C" { 805 | pub fn SFileFreeFileInfo( 806 | pvFileInfo: *mut ::std::os::raw::c_void, 807 | InfoClass: SFileInfoClass, 808 | ) -> bool; 809 | } 810 | extern "C" { 811 | pub fn SFileExtractFile( 812 | hMpq: HANDLE, 813 | szToExtract: *const ::std::os::raw::c_char, 814 | szExtracted: *const TCHAR, 815 | dwSearchScope: DWORD, 816 | ) -> bool; 817 | } 818 | extern "C" { 819 | pub fn SFileGetFileChecksums( 820 | hMpq: HANDLE, 821 | szFileName: *const ::std::os::raw::c_char, 822 | pdwCrc32: LPDWORD, 823 | pMD5: *mut ::std::os::raw::c_char, 824 | ) -> bool; 825 | } 826 | extern "C" { 827 | pub fn SFileVerifyFile( 828 | hMpq: HANDLE, 829 | szFileName: *const ::std::os::raw::c_char, 830 | dwFlags: DWORD, 831 | ) -> DWORD; 832 | } 833 | extern "C" { 834 | pub fn SFileVerifyRawData( 835 | hMpq: HANDLE, 836 | dwWhatToVerify: DWORD, 837 | szFileName: *const ::std::os::raw::c_char, 838 | ) -> DWORD; 839 | } 840 | extern "C" { 841 | pub fn SFileSignArchive(hMpq: HANDLE, dwSignatureType: DWORD) -> bool; 842 | } 843 | extern "C" { 844 | pub fn SFileVerifyArchive(hMpq: HANDLE) -> DWORD; 845 | } 846 | extern "C" { 847 | pub fn SFileFindFirstFile( 848 | hMpq: HANDLE, 849 | szMask: *const ::std::os::raw::c_char, 850 | lpFindFileData: *mut SFILE_FIND_DATA, 851 | szListFile: *const TCHAR, 852 | ) -> HANDLE; 853 | } 854 | extern "C" { 855 | pub fn SFileFindNextFile(hFind: HANDLE, lpFindFileData: *mut SFILE_FIND_DATA) -> bool; 856 | } 857 | extern "C" { 858 | pub fn SFileFindClose(hFind: HANDLE) -> bool; 859 | } 860 | extern "C" { 861 | pub fn SListFileFindFirstFile( 862 | hMpq: HANDLE, 863 | szListFile: *const TCHAR, 864 | szMask: *const ::std::os::raw::c_char, 865 | lpFindFileData: *mut SFILE_FIND_DATA, 866 | ) -> HANDLE; 867 | } 868 | extern "C" { 869 | pub fn SListFileFindNextFile(hFind: HANDLE, lpFindFileData: *mut SFILE_FIND_DATA) -> bool; 870 | } 871 | extern "C" { 872 | pub fn SListFileFindClose(hFind: HANDLE) -> bool; 873 | } 874 | extern "C" { 875 | pub fn SFileEnumLocales( 876 | hMpq: HANDLE, 877 | szFileName: *const ::std::os::raw::c_char, 878 | PtrFileLocales: *mut LCID, 879 | PtrMaxLocales: LPDWORD, 880 | dwSearchScope: DWORD, 881 | ) -> DWORD; 882 | } 883 | extern "C" { 884 | pub fn SFileCreateFile( 885 | hMpq: HANDLE, 886 | szArchivedName: *const ::std::os::raw::c_char, 887 | FileTime: ULONGLONG, 888 | dwFileSize: DWORD, 889 | lcFileLocale: LCID, 890 | dwFlags: DWORD, 891 | phFile: *mut HANDLE, 892 | ) -> bool; 893 | } 894 | extern "C" { 895 | pub fn SFileWriteFile( 896 | hFile: HANDLE, 897 | pvData: *const ::std::os::raw::c_void, 898 | dwSize: DWORD, 899 | dwCompression: DWORD, 900 | ) -> bool; 901 | } 902 | extern "C" { 903 | pub fn SFileFinishFile(hFile: HANDLE) -> bool; 904 | } 905 | extern "C" { 906 | pub fn SFileAddFileEx( 907 | hMpq: HANDLE, 908 | szFileName: *const TCHAR, 909 | szArchivedName: *const ::std::os::raw::c_char, 910 | dwFlags: DWORD, 911 | dwCompression: DWORD, 912 | dwCompressionNext: DWORD, 913 | ) -> bool; 914 | } 915 | extern "C" { 916 | pub fn SFileAddFile( 917 | hMpq: HANDLE, 918 | szFileName: *const TCHAR, 919 | szArchivedName: *const ::std::os::raw::c_char, 920 | dwFlags: DWORD, 921 | ) -> bool; 922 | } 923 | extern "C" { 924 | pub fn SFileAddWave( 925 | hMpq: HANDLE, 926 | szFileName: *const TCHAR, 927 | szArchivedName: *const ::std::os::raw::c_char, 928 | dwFlags: DWORD, 929 | dwQuality: DWORD, 930 | ) -> bool; 931 | } 932 | extern "C" { 933 | pub fn SFileRemoveFile( 934 | hMpq: HANDLE, 935 | szFileName: *const ::std::os::raw::c_char, 936 | dwSearchScope: DWORD, 937 | ) -> bool; 938 | } 939 | extern "C" { 940 | pub fn SFileRenameFile( 941 | hMpq: HANDLE, 942 | szOldFileName: *const ::std::os::raw::c_char, 943 | szNewFileName: *const ::std::os::raw::c_char, 944 | ) -> bool; 945 | } 946 | extern "C" { 947 | pub fn SFileSetFileLocale(hFile: HANDLE, lcNewLocale: LCID) -> bool; 948 | } 949 | extern "C" { 950 | pub fn SFileSetDataCompression(DataCompression: DWORD) -> bool; 951 | } 952 | extern "C" { 953 | pub fn SFileSetAddFileCallback( 954 | hMpq: HANDLE, 955 | AddFileCB: SFILE_ADDFILE_CALLBACK, 956 | pvUserData: *mut ::std::os::raw::c_void, 957 | ) -> bool; 958 | } 959 | extern "C" { 960 | pub fn SCompImplode( 961 | pvOutBuffer: *mut ::std::os::raw::c_void, 962 | pcbOutBuffer: *mut ::std::os::raw::c_int, 963 | pvInBuffer: *mut ::std::os::raw::c_void, 964 | cbInBuffer: ::std::os::raw::c_int, 965 | ) -> ::std::os::raw::c_int; 966 | } 967 | extern "C" { 968 | pub fn SCompExplode( 969 | pvOutBuffer: *mut ::std::os::raw::c_void, 970 | pcbOutBuffer: *mut ::std::os::raw::c_int, 971 | pvInBuffer: *mut ::std::os::raw::c_void, 972 | cbInBuffer: ::std::os::raw::c_int, 973 | ) -> ::std::os::raw::c_int; 974 | } 975 | extern "C" { 976 | pub fn SCompCompress( 977 | pvOutBuffer: *mut ::std::os::raw::c_void, 978 | pcbOutBuffer: *mut ::std::os::raw::c_int, 979 | pvInBuffer: *mut ::std::os::raw::c_void, 980 | cbInBuffer: ::std::os::raw::c_int, 981 | uCompressionMask: ::std::os::raw::c_uint, 982 | nCmpType: ::std::os::raw::c_int, 983 | nCmpLevel: ::std::os::raw::c_int, 984 | ) -> ::std::os::raw::c_int; 985 | } 986 | extern "C" { 987 | pub fn SCompDecompress( 988 | pvOutBuffer: *mut ::std::os::raw::c_void, 989 | pcbOutBuffer: *mut ::std::os::raw::c_int, 990 | pvInBuffer: *mut ::std::os::raw::c_void, 991 | cbInBuffer: ::std::os::raw::c_int, 992 | ) -> ::std::os::raw::c_int; 993 | } 994 | extern "C" { 995 | pub fn SCompDecompress2( 996 | pvOutBuffer: *mut ::std::os::raw::c_void, 997 | pcbOutBuffer: *mut ::std::os::raw::c_int, 998 | pvInBuffer: *mut ::std::os::raw::c_void, 999 | cbInBuffer: ::std::os::raw::c_int, 1000 | ) -> ::std::os::raw::c_int; 1001 | } 1002 | -------------------------------------------------------------------------------- /crates/stormlib-sys/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)] 2 | 3 | #[cfg(target_os = "windows")] 4 | include!("./bindings_windows.rs"); 5 | #[cfg(target_os = "linux")] 6 | include!("./bindings_linux.rs"); 7 | #[cfg(target_os = "macos")] 8 | include!("./bindings_macos.rs"); 9 | 10 | extern "C" { 11 | pub fn SetLastError(dwErrCode: u32); 12 | } 13 | extern "C" { 14 | pub fn GetLastError() -> u32; 15 | } 16 | 17 | #[test] 18 | fn test_w3x() { 19 | use std::ffi::*; 20 | use std::ptr; 21 | 22 | #[cfg(not(target_os = "windows"))] 23 | let path = CString::new("../../samples/test_tft.w3x").unwrap(); 24 | #[cfg(target_os = "windows")] 25 | let path: Vec<_> = { 26 | "../../samples/test_tft.w3x" 27 | .as_bytes() 28 | .iter() 29 | .cloned() 30 | .map(u16::from) 31 | .chain(std::iter::once(0)) 32 | .collect() 33 | }; 34 | 35 | let file = CString::new("war3map.j").unwrap(); 36 | unsafe { 37 | let mut handle: HANDLE = ptr::null_mut(); 38 | let ok = SFileOpenArchive( 39 | path.as_ptr(), 40 | 0, 41 | MPQ_OPEN_NO_LISTFILE | MPQ_OPEN_NO_ATTRIBUTES, 42 | &mut handle as *mut HANDLE, 43 | ); 44 | 45 | assert!(ok); 46 | 47 | let mut file_handle: HANDLE = ptr::null_mut(); 48 | let ok = SFileOpenFileEx(handle, file.as_ptr(), 0, &mut file_handle as *mut HANDLE); 49 | assert!(ok); 50 | 51 | let mut size_high: DWORD = 0; 52 | let size = SFileGetFileSize(file_handle, &mut size_high as *mut DWORD); 53 | assert!(ok); 54 | 55 | println!("file size = {}", size); 56 | 57 | let mut buf = Vec::::with_capacity(size as usize); 58 | buf.resize(buf.capacity(), 0); 59 | 60 | let mut read: DWORD = 0; 61 | let ok = SFileReadFile( 62 | file_handle, 63 | std::mem::transmute(buf.as_mut_ptr()), 64 | size, 65 | &mut read as *mut DWORD, 66 | ptr::null_mut(), 67 | ); 68 | assert!(ok); 69 | 70 | println!("read size = {}", read); 71 | 72 | assert_eq!(buf, std::fs::read("../../samples/war3map.j").unwrap()); 73 | 74 | assert!(SFileCloseFile(file_handle)); 75 | 76 | assert!(SFileCloseArchive(handle)); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /crates/stormlib/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "stormlib" 3 | version = "0.1.1" 4 | authors = ["Flux Xu "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | stormlib-sys = { path = "../stormlib-sys" } 11 | bitflags = "1.2" 12 | libc = "0.2" 13 | thiserror = "1" 14 | 15 | [target.'cfg(windows)'.dependencies] 16 | widestring = "0.4" 17 | -------------------------------------------------------------------------------- /crates/stormlib/src/constants.rs: -------------------------------------------------------------------------------- 1 | use bitflags::bitflags; 2 | use stormlib_sys; 3 | 4 | bitflags! { 5 | pub struct OpenArchiveFlags: u32 { 6 | const STREAM_PROVIDER_PARTIAL = stormlib_sys::STREAM_PROVIDER_PARTIAL; 7 | const STREAM_PROVIDER_MPQE = stormlib_sys::STREAM_PROVIDER_MPQE; 8 | const STREAM_PROVIDER_BLOCK4 = stormlib_sys::STREAM_PROVIDER_BLOCK4; 9 | const STREAM_PROVIDER_MASK = stormlib_sys::STREAM_PROVIDER_MASK; 10 | 11 | const BASE_PROVIDER_FILE = stormlib_sys::BASE_PROVIDER_FILE; 12 | const BASE_PROVIDER_MAP = stormlib_sys::BASE_PROVIDER_MAP ; 13 | const BASE_PROVIDER_HTTP = stormlib_sys::BASE_PROVIDER_HTTP; 14 | const BASE_PROVIDER_MASK = stormlib_sys::BASE_PROVIDER_MASK; 15 | 16 | const STREAM_FLAG_READ_ONLY = stormlib_sys::STREAM_FLAG_READ_ONLY; 17 | const STREAM_FLAG_WRITE_SHARE = stormlib_sys::STREAM_FLAG_WRITE_SHARE; 18 | 19 | const MPQ_OPEN_NO_LISTFILE = stormlib_sys::MPQ_OPEN_NO_LISTFILE; 20 | const MPQ_OPEN_NO_ATTRIBUTES = stormlib_sys::MPQ_OPEN_NO_ATTRIBUTES; 21 | const MPQ_OPEN_NO_HEADER_SEARCH = stormlib_sys::MPQ_OPEN_NO_HEADER_SEARCH; 22 | const MPQ_OPEN_FORCE_MPQ_V1 = stormlib_sys::MPQ_OPEN_FORCE_MPQ_V1; 23 | const MPQ_OPEN_CHECK_SECTOR_CRC = stormlib_sys::MPQ_OPEN_CHECK_SECTOR_CRC; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /crates/stormlib/src/error.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | use std::ffi::NulError; 3 | 4 | #[derive(Debug)] 5 | pub struct ErrorCode(pub u32); 6 | 7 | #[derive(Error, Debug)] 8 | pub enum StormError { 9 | #[error("FileNotFound")] 10 | FileNotFound, 11 | #[error("AccessDenied")] 12 | AccessDenied, 13 | #[error("InvalidHandle")] 14 | InvalidHandle, 15 | #[error("NotEnoughMemory")] 16 | NotEnoughMemory, 17 | #[error("NotSupported")] 18 | NotSupported, 19 | #[error("InvalidParameter")] 20 | InvalidParameter, 21 | #[cfg(target_os = "windows")] 22 | #[error("NegativeSeek")] 23 | NegativeSeek, 24 | #[error("DiskFull")] 25 | DiskFull, 26 | #[error("AlreadyExists")] 27 | AlreadyExists, 28 | #[error("InsufficientBuffer")] 29 | InsufficientBuffer, 30 | #[error("BadFormat")] 31 | BadFormat, 32 | #[error("NoMoreFiles")] 33 | NoMoreFiles, 34 | #[error("HandleEof")] 35 | HandleEof, 36 | #[error("CanNotComplete")] 37 | CanNotComplete, 38 | #[error("FileCorrupt")] 39 | FileCorrupt, 40 | #[error("UnknownCode({0:?})")] 41 | UnknownCode(ErrorCode), 42 | #[cfg(not(target_os = "windows"))] 43 | #[error("non-utf-8 encoding is not supported")] 44 | NonUtf8, 45 | #[error("an interior nul byte was found")] 46 | InteriorNul, 47 | } 48 | 49 | pub type Result = std::result::Result; 50 | 51 | impl From for StormError { 52 | fn from(ErrorCode(code): ErrorCode) -> Self { 53 | use StormError::*; 54 | match code { 55 | stormlib_sys::ERROR_FILE_NOT_FOUND => FileNotFound, 56 | stormlib_sys::ERROR_ACCESS_DENIED => AccessDenied, 57 | stormlib_sys::ERROR_INVALID_HANDLE => InvalidHandle, 58 | stormlib_sys::ERROR_NOT_ENOUGH_MEMORY => NotEnoughMemory, 59 | stormlib_sys::ERROR_NOT_SUPPORTED => NotSupported, 60 | stormlib_sys::ERROR_INVALID_PARAMETER => InvalidParameter, 61 | #[cfg(target_os = "windows")] 62 | stormlib_sys::ERROR_NEGATIVE_SEEK => NegativeSeek, 63 | stormlib_sys::ERROR_DISK_FULL => DiskFull, 64 | stormlib_sys::ERROR_ALREADY_EXISTS => AlreadyExists, 65 | stormlib_sys::ERROR_INSUFFICIENT_BUFFER => InsufficientBuffer, 66 | stormlib_sys::ERROR_BAD_FORMAT => BadFormat, 67 | stormlib_sys::ERROR_NO_MORE_FILES => NoMoreFiles, 68 | stormlib_sys::ERROR_HANDLE_EOF => HandleEof, 69 | stormlib_sys::ERROR_CAN_NOT_COMPLETE => CanNotComplete, 70 | stormlib_sys::ERROR_FILE_CORRUPT => FileCorrupt, 71 | other => UnknownCode(ErrorCode(other)), 72 | } 73 | } 74 | } 75 | 76 | impl From for StormError { 77 | fn from(_: NulError) -> Self { 78 | StormError::InteriorNul 79 | } 80 | } -------------------------------------------------------------------------------- /crates/stormlib/src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::ffi::*; 2 | use std::path::Path; 3 | use std::ptr; 4 | use stormlib_sys::*; 5 | 6 | #[macro_use] 7 | mod util; 8 | 9 | mod constants; 10 | pub use constants::*; 11 | 12 | pub mod error; 13 | use error::*; 14 | 15 | /// MPQ archive 16 | #[derive(Debug)] 17 | pub struct Archive { 18 | handle: HANDLE, 19 | } 20 | 21 | impl Archive { 22 | /// Opens a MPQ archive 23 | pub fn open>(path: P, flags: OpenArchiveFlags) -> Result { 24 | #[cfg(not(target_os = "windows"))] 25 | let cpath = { 26 | let pathstr = path.as_ref().to_str().ok_or_else(|| StormError::NonUtf8)?; 27 | CString::new(pathstr)? 28 | }; 29 | #[cfg(target_os = "windows")] 30 | let cpath = { 31 | use widestring::U16CString; 32 | U16CString::from_os_str(path.as_ref()).map_err(|_| StormError::InteriorNul)?.into_vec() 33 | }; 34 | let mut handle: HANDLE = ptr::null_mut(); 35 | unsafe { 36 | unsafe_try_call!(SFileOpenArchive( 37 | cpath.as_ptr(), 38 | 0, 39 | flags.bits(), 40 | &mut handle as *mut HANDLE, 41 | )); 42 | Ok(Archive { handle }) 43 | } 44 | } 45 | 46 | /// Quick check if the file exists within MPQ archive, without opening it 47 | pub fn has_file(&mut self, path: &str) -> Result { 48 | let cpath = CString::new(path)?; 49 | unsafe { 50 | let r = SFileHasFile(self.handle, cpath.as_ptr()); 51 | let err = GetLastError(); 52 | if !r && err != ERROR_FILE_NOT_FOUND { 53 | return Err(From::from(ErrorCode(err))); 54 | } 55 | Ok(r) 56 | } 57 | } 58 | 59 | /// Opens a file from MPQ archive 60 | pub fn open_file<'a>(&'a mut self, path: &str) -> Result> { 61 | let mut file_handle: HANDLE = ptr::null_mut(); 62 | let cpath = CString::new(path)?; 63 | unsafe_try_call!(SFileOpenFileEx( 64 | self.handle, 65 | cpath.as_ptr(), 66 | 0, 67 | &mut file_handle as *mut HANDLE 68 | )); 69 | Ok(File { 70 | archive: self, 71 | file_handle, 72 | size: None, 73 | need_reset: false, 74 | }) 75 | } 76 | } 77 | 78 | impl std::ops::Drop for Archive { 79 | fn drop(&mut self) { 80 | unsafe { 81 | SFileCloseArchive(self.handle); 82 | } 83 | } 84 | } 85 | 86 | /// Opened file 87 | #[derive(Debug)] 88 | pub struct File<'a> { 89 | archive: &'a Archive, 90 | file_handle: HANDLE, 91 | size: Option, 92 | need_reset: bool, 93 | } 94 | 95 | impl<'a> File<'a> { 96 | /// Retrieves a size of the file within archive 97 | pub fn get_size(&mut self) -> Result { 98 | if let Some(size) = self.size.clone() { 99 | Ok(size) 100 | } else { 101 | let mut high: DWORD = 0; 102 | let low = unsafe { SFileGetFileSize(self.file_handle, &mut high as *mut DWORD) }; 103 | if low == SFILE_INVALID_SIZE { 104 | return Err(From::from(ErrorCode(unsafe { GetLastError() }))); 105 | } 106 | let high = (high as u64) << 32; 107 | let size = high | (low as u64); 108 | self.size = Some(size); 109 | return Ok(size); 110 | } 111 | } 112 | 113 | /// Reads all data from the file 114 | pub fn read_all(&mut self) -> Result> { 115 | if self.need_reset { 116 | unsafe { 117 | if SFileSetFilePointer(self.file_handle, 0, ptr::null_mut(), 0) == SFILE_INVALID_SIZE { 118 | return Err(From::from(ErrorCode(GetLastError()))); 119 | } 120 | } 121 | } 122 | 123 | let size = self.get_size()?; 124 | let mut buf = Vec::::with_capacity(size as usize); 125 | buf.resize(buf.capacity(), 0); 126 | let mut read: DWORD = 0; 127 | self.need_reset = true; 128 | unsafe_try_call!(SFileReadFile( 129 | self.file_handle, 130 | std::mem::transmute(buf.as_mut_ptr()), 131 | size as u32, 132 | &mut read as *mut DWORD, 133 | ptr::null_mut(), 134 | )); 135 | if (read as u64) < size { 136 | buf.truncate(read as usize); 137 | } 138 | Ok(buf) 139 | } 140 | } 141 | 142 | impl<'a> std::ops::Drop for File<'a> { 143 | fn drop(&mut self) { 144 | unsafe { 145 | SFileCloseFile(self.file_handle); 146 | } 147 | } 148 | } 149 | 150 | #[test] 151 | fn test_read() { 152 | let mut archive = Archive::open( 153 | "../../samples/test_tft.w3x", 154 | OpenArchiveFlags::MPQ_OPEN_NO_LISTFILE | OpenArchiveFlags::MPQ_OPEN_NO_ATTRIBUTES, 155 | ) 156 | .unwrap(); 157 | 158 | assert_eq!(archive.has_file("invalid").unwrap(), false); 159 | assert_eq!(archive.has_file("war3map.j").unwrap(), true); 160 | let mut f = archive.open_file("war3map.j").unwrap(); 161 | assert_eq!(f.get_size().unwrap(), 14115); 162 | assert_eq!( 163 | f.read_all().unwrap(), 164 | std::fs::read("../../samples/war3map.j").unwrap() 165 | ); 166 | } 167 | 168 | #[cfg(target_os = "windows")] 169 | #[test] 170 | fn test_read_unicode() { 171 | use widestring::U16CString; 172 | use std::os::windows::ffi::OsStringExt; 173 | let mut archive = Archive::open( 174 | OsString::from_wide(&U16CString::from_str("../../samples/中文.w3x").unwrap().into_vec()), 175 | OpenArchiveFlags::MPQ_OPEN_NO_LISTFILE | OpenArchiveFlags::MPQ_OPEN_NO_ATTRIBUTES, 176 | ) 177 | .unwrap(); 178 | let mut f = archive.open_file("war3map.j").unwrap(); 179 | assert_eq!( 180 | f.read_all().unwrap(), 181 | std::fs::read("../../samples/war3map.j").unwrap() 182 | ); 183 | } 184 | 185 | #[cfg(target_os = "macos")] 186 | #[test] 187 | fn test_read_utf8() { 188 | let mut archive = Archive::open( 189 | "../../samples/中文.w3x", 190 | OpenArchiveFlags::MPQ_OPEN_NO_LISTFILE | OpenArchiveFlags::MPQ_OPEN_NO_ATTRIBUTES, 191 | ) 192 | .unwrap(); 193 | let mut f = archive.open_file("war3map.j").unwrap(); 194 | assert_eq!( 195 | f.read_all().unwrap(), 196 | std::fs::read("../../samples/war3map.j").unwrap() 197 | ); 198 | } 199 | -------------------------------------------------------------------------------- /crates/stormlib/src/util.rs: -------------------------------------------------------------------------------- 1 | /// Check ffi function call result, propagates the error 2 | macro_rules! unsafe_try_call { 3 | ($r:expr) => { 4 | #[allow(unused_unsafe)] 5 | unsafe { 6 | if !$r { 7 | return Err($crate::error::ErrorCode(stormlib_sys::GetLastError()).into()); 8 | } 9 | } 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 2 -------------------------------------------------------------------------------- /samples/test_tft.w3x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wc3tools/stormlib-rs/6155544a8e71f84934b669724e8eda607fc5f8e0/samples/test_tft.w3x -------------------------------------------------------------------------------- /samples/war3map.j: -------------------------------------------------------------------------------- 1 | //=========================================================================== 2 | // 3 | // Small Wars 4 | // 5 | // Warcraft III map script 6 | // Generated by the Warcraft III World Editor 7 | // Date: Thu Apr 29 20:03:59 2010 8 | // Map Author: Rorslae 9 | // 10 | //=========================================================================== 11 | 12 | //*************************************************************************** 13 | //* 14 | //* Global Variables 15 | //* 16 | //*************************************************************************** 17 | 18 | globals 19 | endglobals 20 | 21 | function InitGlobals takes nothing returns nothing 22 | endfunction 23 | 24 | //*************************************************************************** 25 | //* 26 | //* Unit Creation 27 | //* 28 | //*************************************************************************** 29 | 30 | //=========================================================================== 31 | function CreateBuildingsForPlayer0 takes nothing returns nothing 32 | local player p = Player(0) 33 | local unit u 34 | local integer unitID 35 | local trigger t 36 | local real life 37 | 38 | set u = CreateUnit( p, 'hgtw', -1408.0, 832.0, 270.000 ) 39 | set u = CreateUnit( p, 'hgtw', 1344.0, 704.0, 270.000 ) 40 | set u = CreateUnit( p, 'hbar', -192.0, 1216.0, 270.000 ) 41 | set u = CreateUnit( p, 'hars', 192.0, 1216.0, 270.000 ) 42 | set u = CreateUnit( p, 'hgra', 576.0, 1216.0, 270.000 ) 43 | set u = CreateUnit( p, 'hhou', 1152.0, 1088.0, 270.000 ) 44 | set u = CreateUnit( p, 'hhou', 1280.0, 1088.0, 270.000 ) 45 | set u = CreateUnit( p, 'hhou', 1152.0, 1216.0, 270.000 ) 46 | set u = CreateUnit( p, 'hhou', 1280.0, 1216.0, 270.000 ) 47 | set u = CreateUnit( p, 'hhou', 1024.0, 1216.0, 270.000 ) 48 | set u = CreateUnit( p, 'hhou', 1280.0, 960.0, 270.000 ) 49 | set u = CreateUnit( p, 'hhou', 1024.0, 960.0, 270.000 ) 50 | set u = CreateUnit( p, 'hgtw', -960.0, -64.0, 270.000 ) 51 | set u = CreateUnit( p, 'hgtw', 960.0, -64.0, 270.000 ) 52 | set u = CreateUnit( p, 'hbla', -192.0, 832.0, 270.000 ) 53 | set u = CreateUnit( p, 'hhou', 1024.0, 1088.0, 270.000 ) 54 | set u = CreateUnit( p, 'htow', -1664.0, 1152.0, 270.000 ) 55 | set u = CreateUnit( p, 'hlum', 160.0, 864.0, 270.000 ) 56 | set u = CreateUnit( p, 'halt', 544.0, 864.0, 270.000 ) 57 | set u = CreateUnit( p, 'harm', 896.0, 704.0, 270.000 ) 58 | set u = CreateUnit( p, 'hgtw', -64.0, 320.0, 270.000 ) 59 | set u = CreateUnit( p, 'hgtw', 64.0, 320.0, 270.000 ) 60 | endfunction 61 | 62 | //=========================================================================== 63 | function CreateUnitsForPlayer0 takes nothing returns nothing 64 | local player p = Player(0) 65 | local unit u 66 | local integer unitID 67 | local trigger t 68 | local real life 69 | 70 | set u = CreateUnit( p, 'hkni', -816.7, -59.8, 270.000 ) 71 | set u = CreateUnit( p, 'hkni', -699.5, -69.7, 270.000 ) 72 | set u = CreateUnit( p, 'hkni', -571.2, -74.7, 270.000 ) 73 | set u = CreateUnit( p, 'hkni', -443.4, -69.7, 270.000 ) 74 | set u = CreateUnit( p, 'hkni', -310.3, -77.1, 270.000 ) 75 | set u = CreateUnit( p, 'hkni', -189.8, -79.6, 270.000 ) 76 | set u = CreateUnit( p, 'hkni', -48.5, -82.1, 270.000 ) 77 | set u = CreateUnit( p, 'hkni', 70.5, -69.7, 270.000 ) 78 | set u = CreateUnit( p, 'hkni', 196.3, -72.2, 270.000 ) 79 | set u = CreateUnit( p, 'hkni', 322.9, -69.3, 270.000 ) 80 | set u = CreateUnit( p, 'hkni', 461.4, -74.3, 270.000 ) 81 | set u = CreateUnit( p, 'hkni', 557.8, -76.7, 270.000 ) 82 | set u = CreateUnit( p, 'hkni', 695.3, -74.3, 270.000 ) 83 | set u = CreateUnit( p, 'hkni', 829.0, -66.1, 270.000 ) 84 | set u = CreateUnit( p, 'hrif', 841.4, 64.5, 270.000 ) 85 | set u = CreateUnit( p, 'hrif', 716.5, 64.5, 270.000 ) 86 | set u = CreateUnit( p, 'hrif', 578.6, 73.4, 270.000 ) 87 | set u = CreateUnit( p, 'hrif', 436.6, 73.4, 270.000 ) 88 | set u = CreateUnit( p, 'hrif', 311.3, 73.4, 270.000 ) 89 | set u = CreateUnit( p, 'hrif', 202.8, 73.4, 270.000 ) 90 | set u = CreateUnit( p, 'hrif', 64.1, 73.4, 270.000 ) 91 | set u = CreateUnit( p, 'hrif', -59.9, 75.7, 270.000 ) 92 | set u = CreateUnit( p, 'hrif', -195.7, 67.6, 270.000 ) 93 | set u = CreateUnit( p, 'hrif', -312.7, 71.6, 270.000 ) 94 | set u = CreateUnit( p, 'hrif', -418.6, 71.6, 270.000 ) 95 | set u = CreateUnit( p, 'hrif', -565.7, 63.6, 270.000 ) 96 | set u = CreateUnit( p, 'hrif', -698.3, 67.7, 270.000 ) 97 | set u = CreateUnit( p, 'hrif', -819.1, 61.9, 270.000 ) 98 | set u = CreateUnit( p, 'Hpal', 51.6, -181.2, 270.000 ) 99 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 100 | set u = CreateUnit( p, 'Hblm', -72.1, 211.2, 270.000 ) 101 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 102 | set u = CreateUnit( p, 'Hmkg', -60.4, -194.9, 270.000 ) 103 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 104 | set u = CreateUnit( p, 'Hamg', 63.0, 189.8, 270.000 ) 105 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 106 | set u = CreateUnit( p, 'hgry', -139.9, 39.6, 311.230 ) 107 | set u = CreateUnit( p, 'hgry', 119.3, 39.6, 87.443 ) 108 | set u = CreateUnit( p, 'hpea', -1358.6, 1287.1, 90.420 ) 109 | set u = CreateUnit( p, 'hpea', -1356.6, 1204.5, 358.286 ) 110 | set u = CreateUnit( p, 'hpea', -1355.7, 1105.9, 112.119 ) 111 | set u = CreateUnit( p, 'hpea', -1350.4, 1003.3, 257.363 ) 112 | endfunction 113 | 114 | //=========================================================================== 115 | function CreateBuildingsForPlayer1 takes nothing returns nothing 116 | local player p = Player(1) 117 | local unit u 118 | local integer unitID 119 | local trigger t 120 | local real life 121 | 122 | set u = CreateUnit( p, 'eaow', -832.0, -1664.0, 270.000 ) 123 | set u = CreateUnit( p, 'eaoe', -384.0, -1664.0, 270.000 ) 124 | set u = CreateUnit( p, 'eaom', 64.0, -1664.0, 270.000 ) 125 | set u = CreateUnit( p, 'etrp', -992.0, -480.0, 270.000 ) 126 | set u = CreateUnit( p, 'etrp', 992.0, -480.0, 270.000 ) 127 | set u = CreateUnit( p, 'emow', -1120.0, -1696.0, 270.000 ) 128 | set u = CreateUnit( p, 'emow', -1120.0, -1504.0, 270.000 ) 129 | set u = CreateUnit( p, 'emow', -1504.0, -1312.0, 270.000 ) 130 | set u = CreateUnit( p, 'emow', -1312.0, -1696.0, 270.000 ) 131 | set u = CreateUnit( p, 'emow', -1504.0, -1504.0, 270.000 ) 132 | set u = CreateUnit( p, 'emow', -1312.0, -1504.0, 270.000 ) 133 | set u = CreateUnit( p, 'emow', -1120.0, -1312.0, 270.000 ) 134 | set u = CreateUnit( p, 'emow', -1504.0, -1696.0, 270.000 ) 135 | set u = CreateUnit( p, 'etol', 1280.0, -1664.0, 270.000 ) 136 | set u = CreateUnit( p, 'edob', -832.0, -1344.0, 270.000 ) 137 | set u = CreateUnit( p, 'edos', -384.0, -1280.0, 270.000 ) 138 | set u = CreateUnit( p, 'eate', 96.0, -1248.0, 270.000 ) 139 | set u = CreateUnit( p, 'etrp', 1440.0, -1312.0, 270.000 ) 140 | set u = CreateUnit( p, 'etrp', -1440.0, -1056.0, 270.000 ) 141 | set u = CreateUnit( p, 'etrp', -96.0, -864.0, 270.000 ) 142 | set u = CreateUnit( p, 'etrp', 96.0, -864.0, 270.000 ) 143 | endfunction 144 | 145 | //=========================================================================== 146 | function CreateUnitsForPlayer1 takes nothing returns nothing 147 | local player p = Player(1) 148 | local unit u 149 | local integer unitID 150 | local trigger t 151 | local real life 152 | 153 | set u = CreateUnit( p, 'esen', -807.3, -482.7, 90.000 ) 154 | set u = CreateUnit( p, 'esen', -695.8, -482.7, 90.000 ) 155 | set u = CreateUnit( p, 'esen', -554.1, -492.0, 90.000 ) 156 | set u = CreateUnit( p, 'esen', -428.1, -488.3, 90.000 ) 157 | set u = CreateUnit( p, 'esen', -309.2, -488.3, 90.000 ) 158 | set u = CreateUnit( p, 'esen', -170.4, -484.5, 90.000 ) 159 | set u = CreateUnit( p, 'esen', -49.8, -484.5, 90.000 ) 160 | set u = CreateUnit( p, 'esen', 76.9, -497.6, 90.000 ) 161 | set u = CreateUnit( p, 'esen', 217.6, -492.0, 90.000 ) 162 | set u = CreateUnit( p, 'esen', 350.4, -481.5, 90.000 ) 163 | set u = CreateUnit( p, 'esen', 468.8, -500.4, 90.000 ) 164 | set u = CreateUnit( p, 'esen', 577.4, -489.1, 90.000 ) 165 | set u = CreateUnit( p, 'esen', 704.8, -506.1, 90.000 ) 166 | set u = CreateUnit( p, 'esen', 836.2, -478.0, 90.000 ) 167 | set u = CreateUnit( p, 'earc', -822.2, -622.5, 90.000 ) 168 | set u = CreateUnit( p, 'earc', -690.4, -622.5, 90.000 ) 169 | set u = CreateUnit( p, 'earc', -556.6, -627.8, 90.000 ) 170 | set u = CreateUnit( p, 'earc', -435.8, -620.7, 90.000 ) 171 | set u = CreateUnit( p, 'earc', -311.4, -611.9, 90.000 ) 172 | set u = CreateUnit( p, 'earc', -180.5, -610.1, 90.000 ) 173 | set u = CreateUnit( p, 'earc', -82.3, -610.1, 90.000 ) 174 | set u = CreateUnit( p, 'earc', 57.6, -610.1, 90.000 ) 175 | set u = CreateUnit( p, 'earc', 212.0, -611.9, 90.000 ) 176 | set u = CreateUnit( p, 'earc', 341.8, -607.7, 90.000 ) 177 | set u = CreateUnit( p, 'earc', 464.6, -616.7, 90.000 ) 178 | set u = CreateUnit( p, 'earc', 589.9, -616.7, 90.000 ) 179 | set u = CreateUnit( p, 'earc', 697.1, -618.5, 90.000 ) 180 | set u = CreateUnit( p, 'earc', 822.4, -618.2, 90.000 ) 181 | set u = CreateUnit( p, 'Edem', 80.6, -363.8, 90.000 ) 182 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 183 | set u = CreateUnit( p, 'Ewar', -54.5, -355.9, 90.000 ) 184 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 185 | set u = CreateUnit( p, 'Emoo', 82.9, -724.8, 90.000 ) 186 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 187 | set u = CreateUnit( p, 'Ekee', -48.4, -734.4, 90.000 ) 188 | call SetUnitState( u, UNIT_STATE_MANA, 0 ) 189 | set u = CreateUnit( p, 'ewsp', 916.2, -1796.1, 76.127 ) 190 | set u = CreateUnit( p, 'ewsp', 936.5, -1689.6, 206.967 ) 191 | set u = CreateUnit( p, 'ewsp', 923.8, -1564.5, 222.842 ) 192 | set u = CreateUnit( p, 'ewsp', 823.2, -1598.5, 256.231 ) 193 | set u = CreateUnit( p, 'ewsp', 817.2, -1698.0, 198.870 ) 194 | set u = CreateUnit( p, 'ewsp', 817.9, -1798.5, 89.739 ) 195 | set u = CreateUnit( p, 'ehpr', -242.5, -531.3, 193.948 ) 196 | set u = CreateUnit( p, 'ehpr', -21.6, -529.6, 340.543 ) 197 | set u = CreateUnit( p, 'ehpr', 198.0, -549.6, 254.045 ) 198 | endfunction 199 | 200 | //=========================================================================== 201 | function CreateNeutralPassiveBuildings takes nothing returns nothing 202 | local player p = Player(PLAYER_NEUTRAL_PASSIVE) 203 | local unit u 204 | local integer unitID 205 | local trigger t 206 | local real life 207 | 208 | set u = CreateUnit( p, 'ngol', 512.0, -1664.0, 270.000 ) 209 | call SetResourceAmount( u, 12500 ) 210 | set u = CreateUnit( p, 'ngol', -640.0, 1152.0, 270.000 ) 211 | call SetResourceAmount( u, 12500 ) 212 | endfunction 213 | 214 | //=========================================================================== 215 | function CreatePlayerBuildings takes nothing returns nothing 216 | call CreateBuildingsForPlayer0( ) 217 | call CreateBuildingsForPlayer1( ) 218 | endfunction 219 | 220 | //=========================================================================== 221 | function CreatePlayerUnits takes nothing returns nothing 222 | call CreateUnitsForPlayer0( ) 223 | call CreateUnitsForPlayer1( ) 224 | endfunction 225 | 226 | //=========================================================================== 227 | function CreateAllUnits takes nothing returns nothing 228 | call CreateNeutralPassiveBuildings( ) 229 | call CreatePlayerBuildings( ) 230 | call CreatePlayerUnits( ) 231 | endfunction 232 | 233 | //*************************************************************************** 234 | //* 235 | //* Players 236 | //* 237 | //*************************************************************************** 238 | 239 | function InitCustomPlayerSlots takes nothing returns nothing 240 | 241 | // Player 0 242 | call SetPlayerStartLocation( Player(0), 0 ) 243 | call ForcePlayerStartLocation( Player(0), 0 ) 244 | call SetPlayerColor( Player(0), ConvertPlayerColor(0) ) 245 | call SetPlayerRacePreference( Player(0), RACE_PREF_HUMAN ) 246 | call SetPlayerRaceSelectable( Player(0), true ) 247 | call SetPlayerController( Player(0), MAP_CONTROL_USER ) 248 | 249 | // Player 1 250 | call SetPlayerStartLocation( Player(1), 1 ) 251 | call ForcePlayerStartLocation( Player(1), 1 ) 252 | call SetPlayerColor( Player(1), ConvertPlayerColor(1) ) 253 | call SetPlayerRacePreference( Player(1), RACE_PREF_NIGHTELF ) 254 | call SetPlayerRaceSelectable( Player(1), true ) 255 | call SetPlayerController( Player(1), MAP_CONTROL_COMPUTER ) 256 | 257 | endfunction 258 | 259 | function InitCustomTeams takes nothing returns nothing 260 | // Force: TRIGSTR_002 261 | call SetPlayerTeam( Player(0), 0 ) 262 | call SetPlayerTeam( Player(1), 0 ) 263 | 264 | endfunction 265 | 266 | //*************************************************************************** 267 | //* 268 | //* Main Initialization 269 | //* 270 | //*************************************************************************** 271 | 272 | //=========================================================================== 273 | function main takes nothing returns nothing 274 | call SetCameraBounds( -1920.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -1920.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 1920.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 1408.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -1920.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 1408.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 1920.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -1920.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) ) 275 | call SetDayNightModels( "Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" ) 276 | call NewSoundEnvironment( "Default" ) 277 | call SetAmbientDaySound( "LordaeronSummerDay" ) 278 | call SetAmbientNightSound( "LordaeronSummerNight" ) 279 | call SetMapMusic( "Music", true, 0 ) 280 | call CreateAllUnits( ) 281 | call InitBlizzard( ) 282 | call InitGlobals( ) 283 | 284 | endfunction 285 | 286 | //*************************************************************************** 287 | //* 288 | //* Map Configuration 289 | //* 290 | //*************************************************************************** 291 | 292 | function config takes nothing returns nothing 293 | call SetMapName( "TRIGSTR_004" ) 294 | call SetMapDescription( "TRIGSTR_008" ) 295 | call SetPlayers( 2 ) 296 | call SetTeams( 2 ) 297 | call SetGamePlacement( MAP_PLACEMENT_USE_MAP_SETTINGS ) 298 | 299 | call DefineStartLocation( 0, -1664.0, 1152.0 ) 300 | call DefineStartLocation( 1, 1280.0, -1664.0 ) 301 | 302 | // Player setup 303 | call InitCustomPlayerSlots( ) 304 | call SetPlayerSlotAvailable( Player(0), MAP_CONTROL_USER ) 305 | call SetPlayerSlotAvailable( Player(1), MAP_CONTROL_COMPUTER ) 306 | call InitGenericPlayerSlots( ) 307 | endfunction 308 | 309 | -------------------------------------------------------------------------------- /samples/中文.w3x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wc3tools/stormlib-rs/6155544a8e71f84934b669724e8eda607fc5f8e0/samples/中文.w3x --------------------------------------------------------------------------------