1use core::mem::size_of;
2use crate::ntapi_base::CLIENT_ID32;
3use crate::ntldr::{LDR_DDAG_STATE, LDR_DLL_LOAD_REASON};
4use crate::ntpsapi::GDI_HANDLE_BUFFER32;
5use crate::ntrtl::RTL_MAX_DRIVE_LETTERS;
6use crate::string::{UTF16Const, UTF8Const};
7use winapi::shared::guiddef::GUID;
8use winapi::shared::ntdef::{
9 BOOLEAN, CHAR, LARGE_INTEGER, LCID, LIST_ENTRY32, LONG, NTSTATUS, PROCESSOR_NUMBER,
10 SINGLE_LIST_ENTRY32, STRING32, UCHAR, ULARGE_INTEGER, ULONG, ULONGLONG, UNICODE_STRING,
11 UNICODE_STRING32, USHORT, WCHAR,
12};
13use winapi::um::winnt::{FLS_MAXIMUM_AVAILABLE, NT_TIB32};
14pub const WOW64_SYSTEM_DIRECTORY: UTF8Const = UTF8Const("SysWOW64\0");
15pub const WOW64_SYSTEM_DIRECTORY_U: UTF16Const = UTF16Const(&[
17 0x0053, 0x0079, 0x0073, 0x0057, 0x004F, 0x0057, 0x0036, 0x0034, 0u16,
18]);
19pub const WOW64_X86_TAG: UTF8Const = UTF8Const(" (x86)\0");
20pub const WOW64_X86_TAG_U: UTF16Const = UTF16Const(&[
22 0x0020, 0x0028, 0x0078, 0x0038, 0x0036, 0x0029, 0u16,
23]);
24ENUM!{enum WOW64_SHARED_INFORMATION {
25 SharedNtdll32LdrInitializeThunk = 0,
26 SharedNtdll32KiUserExceptionDispatcher = 1,
27 SharedNtdll32KiUserApcDispatcher = 2,
28 SharedNtdll32KiUserCallbackDispatcher = 3,
29 SharedNtdll32ExpInterlockedPopEntrySListFault = 4,
30 SharedNtdll32ExpInterlockedPopEntrySListResume = 5,
31 SharedNtdll32ExpInterlockedPopEntrySListEnd = 6,
32 SharedNtdll32RtlUserThreadStart = 7,
33 SharedNtdll32pQueryProcessDebugInformationRemote = 8,
34 SharedNtdll32BaseAddress = 9,
35 SharedNtdll32LdrSystemDllInitBlock = 10,
36 Wow64SharedPageEntriesCount = 11,
37}}
38STRUCT!{struct RTL_BALANCED_NODE32_u_s {
39 Left: ULONG, Right: ULONG, }}
42UNION!{union RTL_BALANCED_NODE32_u {
43 Children: [ULONG; 2], s: RTL_BALANCED_NODE32_u_s,
45}}
46STRUCT!{struct RTL_BALANCED_NODE32 {
47 u: RTL_BALANCED_NODE32_u,
48 ParentValue: ULONG,
49}}
50pub type PRTL_BALANCED_NODE32 = *mut RTL_BALANCED_NODE32;
51STRUCT!{struct RTL_RB_TREE32 {
52 Root: ULONG, Min: ULONG, }}
55pub type PRTL_RB_TREE32 = *mut RTL_RB_TREE32;
56STRUCT!{struct PEB_LDR_DATA32 {
57 Length: ULONG,
58 Initialized: BOOLEAN,
59 SsHandle: ULONG,
60 InLoadOrderModuleList: LIST_ENTRY32,
61 InMemoryOrderModuleList: LIST_ENTRY32,
62 InInitializationOrderModuleList: LIST_ENTRY32,
63 EntryInProgress: ULONG,
64 ShutdownInProgress: BOOLEAN,
65 ShutdownThreadId: ULONG,
66}}
67pub type PPEB_LDR_DATA32 = *mut PEB_LDR_DATA32;
68STRUCT!{struct LDR_SERVICE_TAG_RECORD32 {
69 Next: ULONG,
70 ServiceTag: ULONG,
71}}
72pub type PLDR_SERVICE_TAG_RECORD32 = *mut LDR_SERVICE_TAG_RECORD32;
73STRUCT!{struct LDRP_CSLIST32 {
74 Tail: ULONG, }}
76pub type PLDRP_CSLIST32 = *mut LDRP_CSLIST32;
77UNION!{union LDR_DDAG_NODE32_u {
78 Dependencies: LDRP_CSLIST32,
79 RemovalLink: SINGLE_LIST_ENTRY32,
80}}
81STRUCT!{struct LDR_DDAG_NODE32 {
82 Modules: LIST_ENTRY32,
83 ServiceTagList: ULONG, LoadCount: ULONG,
85 LoadWhileUnloadingCount: ULONG,
86 LowestLink: ULONG,
87 u: LDR_DDAG_NODE32_u,
88 IncomingDependencies: LDRP_CSLIST32,
89 State: LDR_DDAG_STATE,
90 CondenseLink: SINGLE_LIST_ENTRY32,
91 PreorderNumber: ULONG,
92}}
93pub type PLDR_DDAG_NODE32 = *mut LDR_DDAG_NODE32;
94pub const LDR_DATA_TABLE_ENTRY_SIZE_WINXP_32: usize = 80;
95pub const LDR_DATA_TABLE_ENTRY_SIZE_WIN7_32: usize = 144;
96pub const LDR_DATA_TABLE_ENTRY_SIZE_WIN8_32: usize = 152;
97UNION!{union LDR_DATA_TABLE_ENTRY32_u1 {
98 InInitializationOrderLinks: LIST_ENTRY32,
99 InProgressLinks: LIST_ENTRY32,
100}}
101UNION!{union LDR_DATA_TABLE_ENTRY32_u2 {
102 FlagGroup: [UCHAR; 4],
103 Flags: ULONG,
104}}
105STRUCT!{struct LDR_DATA_TABLE_ENTRY32 {
106 InLoadOrderLinks: LIST_ENTRY32,
107 InMemoryOrderLinks: LIST_ENTRY32,
108 u1: LDR_DATA_TABLE_ENTRY32_u1,
109 DllBase: ULONG, EntryPoint: ULONG, SizeOfImage: ULONG,
112 FullDllName: UNICODE_STRING32,
113 BaseDllName: UNICODE_STRING32,
114 u2: LDR_DATA_TABLE_ENTRY32_u2,
115 ObsoleteLoadCount: USHORT,
116 TlsIndex: USHORT,
117 HashLinks: LIST_ENTRY32,
118 TimeDateStamp: ULONG,
119 EntryPointActivationContext: ULONG, Lock: ULONG, DdagNode: ULONG, NodeModuleLink: LIST_ENTRY32,
123 LoadContext: ULONG, ParentDllBase: ULONG, SwitchBackContext: ULONG, BaseAddressIndexNode: RTL_BALANCED_NODE32,
127 MappingInfoIndexNode: RTL_BALANCED_NODE32,
128 OriginalBase: ULONG,
129 LoadTime: LARGE_INTEGER,
130 BaseNameHashValue: ULONG,
131 LoadReason: LDR_DLL_LOAD_REASON,
132 ImplicitPathOptions: ULONG,
133 ReferenceCount: ULONG,
134 DependentLoadFlags: ULONG,
135 SigningLevel: UCHAR,
136}}
137BITFIELD!{unsafe LDR_DATA_TABLE_ENTRY32_u2 Flags: ULONG [
138 PackagedBinary set_PackagedBinary[0..1],
139 MarkedForRemoval set_MarkedForRemoval[1..2],
140 ImageDll set_ImageDll[2..3],
141 LoadNotificationsSent set_LoadNotificationsSent[3..4],
142 TelemetryEntryProcessed set_TelemetryEntryProcessed[4..5],
143 ProcessStaticImport set_ProcessStaticImport[5..6],
144 InLegacyLists set_InLegacyLists[6..7],
145 InIndexes set_InIndexes[7..8],
146 ShimDll set_ShimDll[8..9],
147 InExceptionTable set_InExceptionTable[9..10],
148 ReservedFlags1 set_ReservedFlags1[10..12],
149 LoadInProgress set_LoadInProgress[12..13],
150 LoadConfigProcessed set_LoadConfigProcessed[13..14],
151 EntryProcessed set_EntryProcessed[14..15],
152 ProtectDelayLoad set_ProtectDelayLoad[15..16],
153 ReservedFlags3 set_ReservedFlags3[16..18],
154 DontCallForThreads set_DontCallForThreads[18..19],
155 ProcessAttachCalled set_ProcessAttachCalled[19..20],
156 ProcessAttachFailed set_ProcessAttachFailed[20..21],
157 CorDeferredValidate set_CorDeferredValidate[21..22],
158 CorImage set_CorImage[22..23],
159 DontRelocate set_DontRelocate[23..24],
160 CorILOnly set_CorILOnly[24..25],
161 ReservedFlags5 set_ReservedFlags5[25..28],
162 Redirected set_Redirected[28..29],
163 ReservedFlags6 set_ReservedFlags6[29..31],
164 CompatDatabaseProcessed set_CompatDatabaseProcessed[31..32],
165]}
166pub type PLDR_DATA_TABLE_ENTRY32 = *mut LDR_DATA_TABLE_ENTRY32;
167STRUCT!{struct CURDIR32 {
168 DosPath: UNICODE_STRING32,
169 Handle: ULONG, }}
171pub type PCURDIR32 = *mut CURDIR32;
172STRUCT!{struct RTL_DRIVE_LETTER_CURDIR32 {
173 Flags: USHORT,
174 Length: USHORT,
175 TimeStamp: ULONG,
176 DosPath: STRING32,
177}}
178pub type PRTL_DRIVE_LETTER_CURDIR32 = *mut RTL_DRIVE_LETTER_CURDIR32;
179STRUCT!{struct RTL_USER_PROCESS_PARAMETERS32 {
180 MaximumLength: ULONG,
181 Length: ULONG,
182 Flags: ULONG,
183 DebugFlags: ULONG,
184 ConsoleHandle: ULONG, ConsoleFlags: ULONG,
186 StandardInput: ULONG, StandardOutput: ULONG, StandardError: ULONG, CurrentDirectory: CURDIR32,
190 DllPath: UNICODE_STRING32,
191 ImagePathName: UNICODE_STRING32,
192 CommandLine: UNICODE_STRING32,
193 Environment: ULONG, StartingX: ULONG,
195 StartingY: ULONG,
196 CountX: ULONG,
197 CountY: ULONG,
198 CountCharsX: ULONG,
199 CountCharsY: ULONG,
200 FillAttribute: ULONG,
201 WindowFlags: ULONG,
202 ShowWindowFlags: ULONG,
203 WindowTitle: UNICODE_STRING32,
204 DesktopInfo: UNICODE_STRING32,
205 ShellInfo: UNICODE_STRING32,
206 RuntimeData: UNICODE_STRING32,
207 CurrentDirectories: [RTL_DRIVE_LETTER_CURDIR32; RTL_MAX_DRIVE_LETTERS],
208 EnvironmentSize: ULONG,
209 EnvironmentVersion: ULONG,
210 PackageDependencyData: ULONG, ProcessGroupId: ULONG,
212 LoaderThreads: ULONG,
213}}
214pub type PRTL_USER_PROCESS_PARAMETERS32 = *mut RTL_USER_PROCESS_PARAMETERS32;
215UNION!{union PEB32_u {
216 KernelCallbackTable: ULONG, UserSharedInfoPtr: ULONG, }}
219STRUCT!{struct PEB32 {
220 InheritedAddressSpace: BOOLEAN,
221 ReadImageFileExecOptions: BOOLEAN,
222 BeingDebugged: BOOLEAN,
223 BitField: BOOLEAN,
224 Mutant: ULONG, ImageBaseAddress: ULONG, Ldr: ULONG, ProcessParameters: ULONG, SubSystemData: ULONG, ProcessHeap: ULONG, FastPebLock: ULONG, AtlThunkSListPtr: ULONG, IFEOKey: ULONG, CrossProcessFlags: ULONG,
234 u: PEB32_u,
235 SystemReserved: [ULONG; 1],
236 AtlThunkSListPtr32: ULONG,
237 ApiSetMap: ULONG, TlsExpansionCounter: ULONG,
239 TlsBitmap: ULONG, TlsBitmapBits: [ULONG; 2],
241 ReadOnlySharedMemoryBase: ULONG, HotpatchInformation: ULONG, ReadOnlyStaticServerData: ULONG, AnsiCodePageData: ULONG, OemCodePageData: ULONG, UnicodeCaseTableData: ULONG, NumberOfProcessors: ULONG,
248 NtGlobalFlag: ULONG,
249 CriticalSectionTimeout: LARGE_INTEGER,
250 HeapSegmentReserve: ULONG,
251 HeapSegmentCommit: ULONG,
252 HeapDeCommitTotalFreeThreshold: ULONG,
253 HeapDeCommitFreeBlockThreshold: ULONG,
254 NumberOfHeaps: ULONG,
255 MaximumNumberOfHeaps: ULONG,
256 ProcessHeaps: ULONG, GdiSharedHandleTable: ULONG, ProcessStarterHelper: ULONG, GdiDCAttributeList: ULONG,
260 LoaderLock: ULONG, OSMajorVersion: ULONG,
262 OSMinorVersion: ULONG,
263 OSBuildNumber: USHORT,
264 OSCSDVersion: USHORT,
265 OSPlatformId: ULONG,
266 ImageSubsystem: ULONG,
267 ImageSubsystemMajorVersion: ULONG,
268 ImageSubsystemMinorVersion: ULONG,
269 ActiveProcessAffinityMask: ULONG,
270 GdiHandleBuffer: GDI_HANDLE_BUFFER32,
271 PostProcessInitRoutine: ULONG, TlsExpansionBitmap: ULONG, TlsExpansionBitmapBits: [ULONG; 32],
274 SessionId: ULONG,
275 AppCompatFlags: ULARGE_INTEGER,
276 AppCompatFlagsUser: ULARGE_INTEGER,
277 pShimData: ULONG, AppCompatInfo: ULONG, CSDVersion: UNICODE_STRING32,
280 ActivationContextData: ULONG, ProcessAssemblyStorageMap: ULONG, SystemDefaultActivationContextData: ULONG, SystemAssemblyStorageMap: ULONG, MinimumStackCommit: ULONG,
285 FlsCallback: ULONG, FlsListHead: LIST_ENTRY32,
287 FlsBitmap: ULONG, FlsBitmapBits: [ULONG; FLS_MAXIMUM_AVAILABLE as usize / (size_of::<ULONG>() * 8)],
289 FlsHighIndex: ULONG,
290 WerRegistrationData: ULONG, WerShipAssertPtr: ULONG, pContextData: ULONG, pImageHeaderHash: ULONG, TracingFlags: ULONG,
295 CsrServerReadOnlySharedMemoryBase: ULONGLONG,
296 TppWorkerpListLock: ULONG, TppWorkerpList: LIST_ENTRY32,
298 WaitOnAddressHashTable: [ULONG; 128], TelemetryCoverageHeader: ULONG, CloudFileFlags: ULONG,
301 CloudFileDiagFlags: ULONG,
302 PlaceholderCompatibilityMode: CHAR,
303 PlaceholderCompatibilityModeReserved: [CHAR; 7],
304}}
305BITFIELD!{PEB32 BitField: BOOLEAN [
306 ImageUsesLargePages set_ImageUsesLargePages[0..1],
307 IsProtectedProcess set_IsProtectedProcess[1..2],
308 IsImageDynamicallyRelocated set_IsImageDynamicallyRelocated[2..3],
309 SkipPatchingUser32Forwarders set_SkipPatchingUser32Forwarders[3..4],
310 IsPackagedProcess set_IsPackagedProcess[4..5],
311 IsAppContainer set_IsAppContainer[5..6],
312 IsProtectedProcessLight set_IsProtectedProcessLight[6..7],
313 IsLongPathAwareProcess set_IsLongPathAwareProcess[7..8],
314]}
315BITFIELD!{PEB32 CrossProcessFlags: ULONG [
316 ProcessInJob set_ProcessInJob[0..1],
317 ProcessInitializing set_ProcessInitializing[1..2],
318 ProcessUsingVEH set_ProcessUsingVEH[2..3],
319 ProcessUsingVCH set_ProcessUsingVCH[3..4],
320 ProcessUsingFTH set_ProcessUsingFTH[4..5],
321 ReservedBits0 set_ReservedBits0[5..32],
322]}
323BITFIELD!{PEB32 TracingFlags: ULONG [
324 HeapTracingEnabled set_HeapTracingEnabled[0..1],
325 CritSecTracingEnabled set_CritSecTracingEnabled[1..2],
326 LibLoaderTracingEnabled set_LibLoaderTracingEnabled[2..3],
327 SpareTracingBits set_SpareTracingBits[3..32],
328]}
329pub type PPEB32 = *mut PEB32;
330pub const GDI_BATCH_BUFFER_SIZE: usize = 310;
331STRUCT!{struct GDI_TEB_BATCH32 {
332 Offset: ULONG,
333 HDC: ULONG,
334 Buffer: [ULONG; GDI_BATCH_BUFFER_SIZE],
335}}
336pub type PGDI_TEB_BATCH32 = *mut GDI_TEB_BATCH32;
337STRUCT!{struct TEB32_u_s {
338 ReservedPad0: UCHAR,
339 ReservedPad1: UCHAR,
340 ReservedPad2: UCHAR,
341 IdealProcessor: UCHAR,
342}}
343UNION!{union TEB32_u {
344 CurrentIdealProcessor: PROCESSOR_NUMBER,
345 IdealProcessorValue: ULONG,
346 s: TEB32_u_s,
347}}
348STRUCT!{struct TEB32 {
349 NtTib: NT_TIB32,
350 EnvironmentPointer: ULONG, ClientId: CLIENT_ID32,
352 ActiveRpcHandle: ULONG, ThreadLocalStoragePointer: ULONG, ProcessEnvironmentBlock: ULONG, LastErrorValue: ULONG,
356 CountOfOwnedCriticalSections: ULONG,
357 CsrClientThread: ULONG, Win32ThreadInfo: ULONG, User32Reserved: [ULONG; 26],
360 UserReserved: [ULONG; 5],
361 WOW32Reserved: ULONG, CurrentLocale: LCID,
363 FpSoftwareStatusRegister: ULONG,
364 ReservedForDebuggerInstrumentation: [ULONG; 16], SystemReserved1: [ULONG; 36], WorkingOnBehalfTicket: [UCHAR; 8],
367 ExceptionCode: NTSTATUS,
368 ActivationContextStackPointer: ULONG, InstrumentationCallbackSp: ULONG,
370 InstrumentationCallbackPreviousPc: ULONG,
371 InstrumentationCallbackPreviousSp: ULONG,
372 InstrumentationCallbackDisabled: BOOLEAN,
373 SpareBytes: [UCHAR; 23],
374 TxFsContext: ULONG,
375 GdiTebBatch: GDI_TEB_BATCH32,
376 RealClientId: CLIENT_ID32,
377 GdiCachedProcessHandle: ULONG, GdiClientPID: ULONG,
379 GdiClientTID: ULONG,
380 GdiThreadLocalInfo: ULONG, Win32ClientInfo: [ULONG; 62],
382 glDispatchTable: [ULONG; 233], glReserved1: [ULONG; 29], glReserved2: ULONG, glSectionInfo: ULONG, glSection: ULONG, glTable: ULONG, glCurrentRC: ULONG, glContext: ULONG, LastStatusValue: NTSTATUS,
391 StaticUnicodeString: UNICODE_STRING32,
392 StaticUnicodeBuffer: [WCHAR; 261],
393 DeallocationStack: ULONG, TlsSlots: [ULONG; 64], TlsLinks: LIST_ENTRY32,
396 Vdm: ULONG, ReservedForNtRpc: ULONG, DbgSsReserved: [ULONG; 2], HardErrorMode: ULONG,
400 Instrumentation: [ULONG; 9], ActivityId: GUID,
402 SubProcessTag: ULONG, PerflibData: ULONG, EtwTraceData: ULONG, WinSockData: ULONG, GdiBatchCount: ULONG,
407 u: TEB32_u,
408 GuaranteedStackBytes: ULONG,
409 ReservedForPerf: ULONG, ReservedForOle: ULONG, WaitingOnLoaderLock: ULONG,
412 SavedPriorityState: ULONG, ReservedForCodeCoverage: ULONG,
414 ThreadPoolData: ULONG, TlsExpansionSlots: ULONG, MuiGeneration: ULONG,
417 IsImpersonating: ULONG,
418 NlsCache: ULONG, pShimData: ULONG, HeapVirtualAffinity: USHORT,
421 LowFragHeapDataSlot: USHORT,
422 CurrentTransactionHandle: ULONG, ActiveFrame: ULONG, FlsData: ULONG, PreferredLanguages: ULONG, UserPrefLanguages: ULONG, MergedPrefLanguages: ULONG, MuiImpersonation: ULONG,
429 CrossTebFlags: USHORT,
430 SameTebFlags: USHORT,
431 TxnScopeEnterCallback: ULONG, TxnScopeExitCallback: ULONG, TxnScopeContext: ULONG, LockCount: ULONG,
435 WowTebOffset: LONG,
436 ResourceRetValue: ULONG, ReservedForWdf: ULONG, ReservedForCrt: ULONGLONG,
439 EffectiveContainerId: GUID,
440}}
441BITFIELD!{TEB32 SameTebFlags: USHORT [
442 SafeThunkCall set_SafeThunkCall[0..1],
443 InDebugPrint set_InDebugPrint[1..2],
444 HasFiberData set_HasFiberData[2..3],
445 SkipThreadAttach set_SkipThreadAttach[3..4],
446 WerInShipAssertCode set_WerInShipAssertCode[4..5],
447 RanProcessInit set_RanProcessInit[5..6],
448 ClonedThread set_ClonedThread[6..7],
449 SuppressDebugMsg set_SuppressDebugMsg[7..8],
450 DisableUserStackWalk set_DisableUserStackWalk[8..9],
451 RtlExceptionAttached set_RtlExceptionAttached[9..10],
452 InitialThread set_InitialThread[10..11],
453 SessionAware set_SessionAware[11..12],
454 LoadOwner set_LoadOwner[12..13],
455 LoaderWorker set_LoaderWorker[13..14],
456 SpareSameTebBits set_SpareSameTebBits[14..16],
457]}
458pub type PTEB32 = *mut TEB32;
459#[inline]
460pub fn UStr32ToUStr(
461 Destination: &mut UNICODE_STRING,
462 Source: &UNICODE_STRING32,
463) {
464 Destination.Length = Source.Length;
465 Destination.MaximumLength = Source.MaximumLength;
466 Destination.Buffer = Source.Buffer as *mut u16;
467}
468#[inline]
469pub fn UStrToUStr32(
470 Destination: &mut UNICODE_STRING32,
471 Source: &UNICODE_STRING,
472) {
473 Destination.Length = Source.Length;
474 Destination.MaximumLength = Source.MaximumLength;
475 Destination.Buffer = Source.Buffer as u32;
476}