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, pub pad004: u32, pub threadSafeParent: *mut TESFile, pub threadSafeFileMap: *mut c_void, pub unk018: u64, pub unk020: u64, pub unk028: u8, pub unk029: u8, pub pad02A: u16, pub pad02C: u32, pub lockedFile: *mut BSFile, pub file: *mut BSFile, pub formUserDataBitArray: *mut TESBitArrayFile, pub formVersionBitArray: *mut TESBitArrayFile, pub formIDBitArray: *mut TESBitArrayFile, pub fileName: [u8; 260_usize], pub path: [u8; 260_usize], pub buffer: *mut u8, pub bufferAllocSize: u32, pub firstCellOffset: u32, pub currCellOffset: u32, pub unk274: u32, pub currCell: *mut TESObjectCELL, pub currRefOffset: u32, pub currentform: FORM, pub currentchunkID: u32, pub actualChunkSize: u32, pub filesize: u32, pub fileOffset: u32, pub formoffset: u32, pub chunkoffset: u32, pub saveform: FORM, pub saveFormOffset: u32, pub saveChunkOffset: u64, pub unk2D8: u64, pub unk2E0: u64, pub unk2E8: u8, pub isBigEndian: bool, pub unk2EA: u8, pub pad2EB: u8, pub fileData: WIN32_FIND_DATAA, pub unk42C: f32, pub unk430: u32, pub flags: u32, pub recordFlags: RecordFlags, pub pad43C: u32, pub masters: BSSimpleList<*const u8>, pub mastersData: BSSimpleList<*mut u64>, pub masterCount: u32, pub pad464: u32, pub masterPtrs: *mut *mut TESFile, pub deletedFormTime: FILETIME, pub compileIndex: u8, pub pad479: u8, pub smallFileCompileIndex: u16, pub pad47C: u32, pub createdBy: BSString, pub summary: BSString, pub decompressedFormBuffer: *mut u8, pub decompressedFormBufferSize: u32, pub pad4AC: u32, pub reservedDecompressionBuffer: *mut c_void, pub reservedDecompressionBufferSize: u32, pub pad4BC: u32, pub unk4C0: *mut c_void, }
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};