commonlibsse_ng\re\t/
TESFile.rs

1use crate::re::BSFile::BSFile;
2use crate::re::BSString::BSString;
3use crate::re::BSTList::BSSimpleList;
4use crate::re::FORM::FORM;
5use crate::re::TESBitArrayFile::TESBitArrayFile;
6use crate::re::TESObjectCELL::TESObjectCELL;
7use core::ffi::c_void;
8use windows::Win32::{Foundation::FILETIME, Storage::FileSystem::WIN32_FIND_DATAA};
9
10#[commonlibsse_ng_derive_internal::ffi_enum]
11#[repr(u32)]
12#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub enum Error {
14    None = 0,
15    NotFound = 1,
16    NoFile = 2,
17    NoForm = 3,
18    NoChunk = 4,
19    NoID = 5,
20    BadFile = 6,
21    BadID = 7,
22    FormOpen = 8,
23    FileOpen = 9,
24    WriteFailure = 10,
25    InvalidFile = 11,
26    FileInUse = 12,
27    CreateFailure = 13,
28}
29
30bitflags::bitflags! {
31    #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
32    pub struct RecordFlags: u32 {
33        const None = 0;
34        const Master = 1 << 0;
35        const Altered = 1 << 1;
36        const Checked = 1 << 2;
37        const Active = 1 << 3;
38        const OptimizedFile = 1 << 4;
39        const TempIDOwner = 1 << 5;
40        const Delocalized = 1 << 7;
41        const PrecalcDataOnly = 1 << 8;
42        const SmallFile = 1 << 9;
43    }
44}
45
46#[repr(C)]
47#[derive(Debug, PartialEq)]
48pub struct TESFile {
49    pub lastError: Error,                           // 000
50    pub pad004: u32,                                // 004
51    pub threadSafeParent: *mut TESFile,             // 008
52    pub threadSafeFileMap: *mut c_void,             // 010
53    pub unk018: u64,                                // 018
54    pub unk020: u64,                                // 020
55    pub unk028: u8,                                 // 028
56    pub unk029: u8,                                 // 029
57    pub pad02A: u16,                                // 02A
58    pub pad02C: u32,                                // 02C
59    pub lockedFile: *mut BSFile,                    // 030
60    pub file: *mut BSFile,                          // 038
61    pub formUserDataBitArray: *mut TESBitArrayFile, // 040
62    pub formVersionBitArray: *mut TESBitArrayFile,  // 048
63    pub formIDBitArray: *mut TESBitArrayFile,       // 050
64    pub fileName: [u8; 260_usize],                  // 058
65    pub path: [u8; 260_usize],                      // 15C
66    pub buffer: *mut u8,                            // 260
67    pub bufferAllocSize: u32,                       // 268
68    pub firstCellOffset: u32,                       // 26C
69    pub currCellOffset: u32,                        // 270
70    pub unk274: u32,                                // 274
71    pub currCell: *mut TESObjectCELL,               // 278
72    pub currRefOffset: u32,                         // 280
73    pub currentform: FORM,                          // 284
74    pub currentchunkID: u32,                        // 29C
75    pub actualChunkSize: u32,                       // 2A0
76    pub filesize: u32,                              // 2A4
77    pub fileOffset: u32,                            // 2A8
78    pub formoffset: u32,                            // 2AC
79    pub chunkoffset: u32,                           // 2B0
80    pub saveform: FORM,                             // 2B4
81    pub saveFormOffset: u32,                        // 2CC
82    pub saveChunkOffset: u64,                       // 2D0
83    pub unk2D8: u64,                                // 2D8
84    pub unk2E0: u64,                                // 2E0
85    pub unk2E8: u8,                                 // 2E8
86    pub isBigEndian: bool,                          // 2E9
87    pub unk2EA: u8,                                 // 2EA
88    pub pad2EB: u8,                                 // 2EB
89    pub fileData: WIN32_FIND_DATAA,                 // 2EC
90    pub unk42C: f32,                                // 42C
91    pub unk430: u32,                                // 430
92    pub flags: u32,                                 // 434
93    pub recordFlags: RecordFlags,                   // 438
94    pub pad43C: u32,                                // 43C
95    pub masters: BSSimpleList<*const u8>,           // 440
96    pub mastersData: BSSimpleList<*mut u64>,        // 450
97    pub masterCount: u32,                           // 460
98    pub pad464: u32,                                // 464
99    pub masterPtrs: *mut *mut TESFile,              // 468
100    pub deletedFormTime: FILETIME,                  // 470
101    pub compileIndex: u8,                           // 478
102    pub pad479: u8,                                 // 479
103    pub smallFileCompileIndex: u16,                 // 47A
104    pub pad47C: u32,                                // 47C
105    pub createdBy: BSString,                        // 480
106    pub summary: BSString,                          // 490
107    pub decompressedFormBuffer: *mut u8,            // 4A0
108    pub decompressedFormBufferSize: u32,            // 4A8
109    pub pad4AC: u32,                                // 4AC
110    pub reservedDecompressionBuffer: *mut c_void,   // 4B0
111    pub reservedDecompressionBufferSize: u32,       // 4B8
112    pub pad4BC: u32,                                // 4BC
113    pub unk4C0: *mut c_void,                        // 4C0
114}
115
116const_assert_eq!(core::mem::size_of::<TESFile>(), 0x4C8);
117
118const _: () = {
119    assert!(core::mem::offset_of!(TESFile, lastError) == 0x000);
120    assert!(core::mem::offset_of!(TESFile, pad004) == 0x004);
121    assert!(core::mem::offset_of!(TESFile, threadSafeParent) == 0x008);
122    assert!(core::mem::offset_of!(TESFile, threadSafeFileMap) == 0x010);
123    assert!(core::mem::offset_of!(TESFile, unk018) == 0x018);
124    assert!(core::mem::offset_of!(TESFile, unk020) == 0x020);
125    assert!(core::mem::offset_of!(TESFile, unk028) == 0x028);
126    assert!(core::mem::offset_of!(TESFile, unk029) == 0x029);
127    assert!(core::mem::offset_of!(TESFile, pad02A) == 0x02A);
128    assert!(core::mem::offset_of!(TESFile, pad02C) == 0x02C);
129    assert!(core::mem::offset_of!(TESFile, lockedFile) == 0x030);
130    assert!(core::mem::offset_of!(TESFile, file) == 0x038);
131    assert!(core::mem::offset_of!(TESFile, formUserDataBitArray) == 0x040);
132    assert!(core::mem::offset_of!(TESFile, formVersionBitArray) == 0x048);
133    assert!(core::mem::offset_of!(TESFile, formIDBitArray) == 0x050);
134    assert!(core::mem::offset_of!(TESFile, fileName) == 0x058);
135    assert!(core::mem::offset_of!(TESFile, path) == 0x15C);
136    assert!(core::mem::offset_of!(TESFile, buffer) == 0x260);
137    assert!(core::mem::offset_of!(TESFile, bufferAllocSize) == 0x268);
138    assert!(core::mem::offset_of!(TESFile, firstCellOffset) == 0x26C);
139    assert!(core::mem::offset_of!(TESFile, currCellOffset) == 0x270);
140    assert!(core::mem::offset_of!(TESFile, unk274) == 0x274);
141    assert!(core::mem::offset_of!(TESFile, currCell) == 0x278);
142    assert!(core::mem::offset_of!(TESFile, currRefOffset) == 0x280);
143    assert!(core::mem::offset_of!(TESFile, currentform) == 0x284);
144    assert!(core::mem::offset_of!(TESFile, currentchunkID) == 0x29C);
145    assert!(core::mem::offset_of!(TESFile, actualChunkSize) == 0x2A0);
146    assert!(core::mem::offset_of!(TESFile, filesize) == 0x2A4);
147    assert!(core::mem::offset_of!(TESFile, fileOffset) == 0x2A8);
148    assert!(core::mem::offset_of!(TESFile, formoffset) == 0x2AC);
149    assert!(core::mem::offset_of!(TESFile, chunkoffset) == 0x2B0);
150    assert!(core::mem::offset_of!(TESFile, saveform) == 0x2B4);
151    assert!(core::mem::offset_of!(TESFile, saveFormOffset) == 0x2CC);
152    assert!(core::mem::offset_of!(TESFile, saveChunkOffset) == 0x2D0);
153    assert!(core::mem::offset_of!(TESFile, unk2D8) == 0x2D8);
154    assert!(core::mem::offset_of!(TESFile, unk2E0) == 0x2E0);
155    assert!(core::mem::offset_of!(TESFile, unk2E8) == 0x2E8);
156    assert!(core::mem::offset_of!(TESFile, isBigEndian) == 0x2E9);
157    assert!(core::mem::offset_of!(TESFile, unk2EA) == 0x2EA);
158    assert!(core::mem::offset_of!(TESFile, pad2EB) == 0x2EB);
159    assert!(core::mem::offset_of!(TESFile, fileData) == 0x2EC);
160    assert!(core::mem::offset_of!(TESFile, unk42C) == 0x42C);
161    assert!(core::mem::offset_of!(TESFile, unk430) == 0x430);
162    assert!(core::mem::offset_of!(TESFile, flags) == 0x434);
163    assert!(core::mem::offset_of!(TESFile, recordFlags) == 0x438);
164    assert!(core::mem::offset_of!(TESFile, pad43C) == 0x43C);
165    assert!(core::mem::offset_of!(TESFile, masters) == 0x440);
166    assert!(core::mem::offset_of!(TESFile, mastersData) == 0x450);
167    assert!(core::mem::offset_of!(TESFile, masterCount) == 0x460);
168    assert!(core::mem::offset_of!(TESFile, pad464) == 0x464);
169    assert!(core::mem::offset_of!(TESFile, masterPtrs) == 0x468);
170    assert!(core::mem::offset_of!(TESFile, deletedFormTime) == 0x470);
171    assert!(core::mem::offset_of!(TESFile, compileIndex) == 0x478);
172    assert!(core::mem::offset_of!(TESFile, pad479) == 0x479);
173    assert!(core::mem::offset_of!(TESFile, smallFileCompileIndex) == 0x47A);
174    assert!(core::mem::offset_of!(TESFile, pad47C) == 0x47C);
175    assert!(core::mem::offset_of!(TESFile, createdBy) == 0x480);
176    assert!(core::mem::offset_of!(TESFile, summary) == 0x490);
177    assert!(core::mem::offset_of!(TESFile, decompressedFormBuffer) == 0x4A0);
178    assert!(core::mem::offset_of!(TESFile, decompressedFormBufferSize) == 0x4A8);
179    assert!(core::mem::offset_of!(TESFile, pad4AC) == 0x4AC);
180    assert!(core::mem::offset_of!(TESFile, reservedDecompressionBuffer) == 0x4B0);
181    assert!(core::mem::offset_of!(TESFile, reservedDecompressionBufferSize) == 0x4B8);
182    assert!(core::mem::offset_of!(TESFile, pad4BC) == 0x4BC);
183    assert!(core::mem::offset_of!(TESFile, unk4C0) == 0x4C0);
184};