3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Loader.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
28 // Resource Type Levels
30 #define RESOURCE_TYPE_LEVEL 0
31 #define RESOURCE_NAME_LEVEL 1
32 #define RESOURCE_LANGUAGE_LEVEL 2
33 #define RESOURCE_DATA_LEVEL 3
36 // Loader Data Table Entry Flags
38 #define LDRP_STATIC_LINK 0x00000002
39 #define LDRP_IMAGE_DLL 0x00000004
40 #define LDRP_SHIMENG_SUPPRESSED_ENTRY 0x00000008
41 #define LDRP_IMAGE_INTEGRITY_FORCED 0x00000020
42 #define LDRP_LOAD_IN_PROGRESS 0x00001000
43 #define LDRP_UNLOAD_IN_PROGRESS 0x00002000
44 #define LDRP_ENTRY_PROCESSED 0x00004000
45 #define LDRP_ENTRY_INSERTED 0x00008000
46 #define LDRP_CURRENT_LOAD 0x00010000
47 #define LDRP_FAILED_BUILTIN_LOAD 0x00020000
48 #define LDRP_DONT_CALL_FOR_THREADS 0x00040000
49 #define LDRP_PROCESS_ATTACH_CALLED 0x00080000
50 #define LDRP_DEBUG_SYMBOLS_LOADED 0x00100000
51 #define LDRP_IMAGE_NOT_AT_BASE 0x00200000
52 #define LDRP_COR_IMAGE 0x00400000
53 #define LDR_COR_OWNS_UNMAP 0x00800000
54 #define LDRP_SYSTEM_MAPPED 0x01000000
55 #define LDRP_IMAGE_VERIFYING 0x02000000
56 #define LDRP_DRIVER_DEPENDENT_DLL 0x04000000
57 #define LDRP_ENTRY_NATIVE 0x08000000
58 #define LDRP_REDIRECTED 0x10000000
59 #define LDRP_NON_PAGED_DEBUG_INFO 0x20000000
60 #define LDRP_MM_LOADED 0x40000000
61 #define LDRP_COMPAT_DATABASE_PROCESSED 0x80000000
64 // Dll Characteristics for LdrLoadDll
66 #define LDR_IGNORE_CODE_AUTHZ_LEVEL 0x00001000
71 #define LDR_ADDREF_DLL_PIN 0x00000001
74 // LdrLockLoaderLock Flags
76 #define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001
77 #define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY 0x00000002
80 // LdrUnlockLoaderLock Flags
82 #define LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001
85 // LdrGetDllHandleEx Flags
87 #define LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT 0x00000001
88 #define LDR_GET_DLL_HANDLE_EX_PIN 0x00000002
91 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_INVALID 0
92 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED 1
93 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED 2
96 // FIXME: THIS SHOULD *NOT* BE USED!
98 #define IMAGE_SCN_TYPE_NOLOAD 0x00000002
101 // Loader datafile/imagemapping macros
103 #define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1)
104 #define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2)
105 #define LDR_IS_RESOURCE(handle) (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle))
108 // Activation Context
110 typedef PVOID PACTIVATION_CONTEXT
;
113 // Loader Data stored in the PEB
115 typedef struct _PEB_LDR_DATA
120 LIST_ENTRY InLoadOrderModuleList
;
121 LIST_ENTRY InMemoryOrderModuleList
;
122 LIST_ENTRY InInitializationOrderModuleList
;
123 PVOID EntryInProgress
;
124 #if (NTDDI_VERSION >= NTDDI_WIN7)
125 UCHAR ShutdownInProgress
;
126 PVOID ShutdownThreadId
;
128 } PEB_LDR_DATA
, *PPEB_LDR_DATA
;
131 // Loader Data Table Entry
133 // NOTE: The field 'InMemoryOrderLinks' MUST have that name.
134 // It's hard-coded into WinDbg for PEB dumping!
136 typedef struct _LDR_DATA_TABLE_ENTRY
138 LIST_ENTRY InLoadOrderLinks
;
139 LIST_ENTRY InMemoryOrderLinks
;
140 LIST_ENTRY InInitializationOrderLinks
;
144 UNICODE_STRING FullDllName
;
145 UNICODE_STRING BaseDllName
;
151 LIST_ENTRY HashLinks
;
154 PVOID SectionPointer
;
163 PACTIVATION_CONTEXT EntryPointActivationContext
;
164 PVOID PatchInformation
;
165 } LDR_DATA_TABLE_ENTRY
, *PLDR_DATA_TABLE_ENTRY
;
168 // Loaded Imports Reference Counting in Kernel
170 typedef struct _LOAD_IMPORTS
173 PLDR_DATA_TABLE_ENTRY Entry
[1];
174 } LOAD_IMPORTS
, *PLOAD_IMPORTS
;
177 // Loader Resource Information
179 typedef struct _LDR_RESOURCE_INFO
184 } LDR_RESOURCE_INFO
, *PLDR_RESOURCE_INFO
;
186 typedef struct _LDR_ENUM_RESOURCE_INFO
194 } LDR_ENUM_RESOURCE_INFO
, *PLDR_ENUM_RESOURCE_INFO
;
199 typedef struct _LDR_DLL_LOADED_NOTIFICATION_DATA
202 PUNICODE_STRING FullDllName
;
203 PUNICODE_STRING BaseDllName
;
206 } LDR_DLL_LOADED_NOTIFICATION_DATA
, *PLDR_DLL_LOADED_NOTIFICATION_DATA
;
209 (NTAPI
*PLDR_DLL_LOADED_NOTIFICATION_CALLBACK
)(
211 _In_
struct _LDR_DLL_LOADED_NOTIFICATION_DATA
*Data
214 typedef struct _LDR_DLL_LOADED_NOTIFICATION_ENTRY
216 LIST_ENTRY NotificationListEntry
;
217 PLDR_DLL_LOADED_NOTIFICATION_CALLBACK Callback
;
218 } LDR_DLL_LOADED_NOTIFICATION_ENTRY
, *PLDR_DLL_LOADED_NOTIFICATION_ENTRY
;
221 // Alternate Resources Support
223 typedef struct _ALT_RESOURCE_MODULE
227 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
228 PVOID ModuleManifest
;
230 PVOID AlternateModule
;
231 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
232 HANDLE AlternateFileHandle
;
233 ULONG ModuleCheckSum
;
236 } ALT_RESOURCE_MODULE
, *PALT_RESOURCE_MODULE
;
239 // Callback function for LdrEnumerateLoadedModules
241 typedef VOID (NTAPI LDR_ENUM_CALLBACK
)(_In_ PLDR_DATA_TABLE_ENTRY ModuleInformation
, _In_ PVOID Parameter
, _Out_ BOOLEAN
*Stop
);
242 typedef LDR_ENUM_CALLBACK
*PLDR_ENUM_CALLBACK
;
245 // Manifest prober routine set via LdrSetDllManifestProber
247 typedef NTSTATUS (NTAPI LDR_MANIFEST_PROBER_ROUTINE
)(_In_ PVOID DllHandle
, _In_ PCWSTR FullDllName
, _Out_ PVOID
*ActCtx
);
248 typedef LDR_MANIFEST_PROBER_ROUTINE
*PLDR_MANIFEST_PROBER_ROUTINE
;
254 (NTAPI
*PDLL_INIT_ROUTINE
)(
255 _In_ PVOID DllHandle
,
257 _In_opt_ PCONTEXT Context