├── .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 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 | 1607399247231
161 |
162 |
163 | 1607399247231
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
182 |
183 |
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 | [](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
--------------------------------------------------------------------------------