xref: /reactos/sdk/include/ndk/ldrtypes.h (revision 845faec4)
1 /*++ NDK Version: 0098
2 
3 Copyright (c) Alex Ionescu.  All rights reserved.
4 
5 Header Name:
6 
7     ldrtypes.h
8 
9 Abstract:
10 
11     Type definitions for the Loader.
12 
13 Author:
14 
15     Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16 
17 --*/
18 
19 #ifndef _LDRTYPES_H
20 #define _LDRTYPES_H
21 
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 
27 //
28 // Resource Type Levels
29 //
30 #define RESOURCE_TYPE_LEVEL                     0
31 #define RESOURCE_NAME_LEVEL                     1
32 #define RESOURCE_LANGUAGE_LEVEL                 2
33 #define RESOURCE_DATA_LEVEL                     3
34 
35 //
36 // Loader Data Table Entry Flags
37 //
38 #define LDRP_STATIC_LINK                        0x00000002
39 #define LDRP_IMAGE_DLL                          0x00000004
40 #define LDRP_LOAD_IN_PROGRESS                   0x00001000
41 #define LDRP_UNLOAD_IN_PROGRESS                 0x00002000
42 #define LDRP_ENTRY_PROCESSED                    0x00004000
43 #define LDRP_ENTRY_INSERTED                     0x00008000
44 #define LDRP_CURRENT_LOAD                       0x00010000
45 #define LDRP_FAILED_BUILTIN_LOAD                0x00020000
46 #define LDRP_DONT_CALL_FOR_THREADS              0x00040000
47 #define LDRP_PROCESS_ATTACH_CALLED              0x00080000
48 #define LDRP_DEBUG_SYMBOLS_LOADED               0x00100000
49 #define LDRP_IMAGE_NOT_AT_BASE                  0x00200000
50 #define LDRP_COR_IMAGE                          0x00400000
51 #define LDR_COR_OWNS_UNMAP                      0x00800000
52 #define LDRP_SYSTEM_MAPPED                      0x01000000
53 #define LDRP_IMAGE_VERIFYING                    0x02000000
54 #define LDRP_DRIVER_DEPENDENT_DLL               0x04000000
55 #define LDRP_ENTRY_NATIVE                       0x08000000
56 #define LDRP_REDIRECTED                         0x10000000
57 #define LDRP_NON_PAGED_DEBUG_INFO               0x20000000
58 #define LDRP_MM_LOADED                          0x40000000
59 #define LDRP_COMPAT_DATABASE_PROCESSED          0x80000000
60 
61 //
62 // Dll Characteristics for LdrLoadDll
63 //
64 #define LDR_IGNORE_CODE_AUTHZ_LEVEL                 0x00001000
65 
66 //
67 // LdrAddRef Flags
68 //
69 #define LDR_ADDREF_DLL_PIN                          0x00000001
70 
71 //
72 // LdrLockLoaderLock Flags
73 //
74 #define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS   0x00000001
75 #define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY          0x00000002
76 
77 //
78 // LdrUnlockLoaderLock Flags
79 //
80 #define LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001
81 
82 //
83 // LdrGetDllHandleEx Flags
84 //
85 #define LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT    0x00000001
86 #define LDR_GET_DLL_HANDLE_EX_PIN                   0x00000002
87 
88 
89 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_INVALID           0
90 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED     1
91 #define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED 2
92 
93 //
94 // FIXME: THIS SHOULD *NOT* BE USED!
95 //
96 #define IMAGE_SCN_TYPE_NOLOAD                   0x00000002
97 
98 //
99 // Loader datafile/imagemapping macros
100 //
101 #define LDR_IS_DATAFILE(handle)     (((ULONG_PTR)(handle)) & (ULONG_PTR)1)
102 #define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2)
103 #define LDR_IS_RESOURCE(handle)     (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle))
104 
105 //
106 // Activation Context
107 //
108 typedef PVOID PACTIVATION_CONTEXT;
109 
110 //
111 // Loader Data stored in the PEB
112 //
113 typedef struct _PEB_LDR_DATA
114 {
115     ULONG Length;
116     BOOLEAN Initialized;
117     PVOID SsHandle;
118     LIST_ENTRY InLoadOrderModuleList;
119     LIST_ENTRY InMemoryOrderModuleList;
120     LIST_ENTRY InInitializationOrderModuleList;
121     PVOID EntryInProgress;
122 #if (NTDDI_VERSION >= NTDDI_WIN7)
123     UCHAR ShutdownInProgress;
124     PVOID ShutdownThreadId;
125 #endif
126 } PEB_LDR_DATA, *PPEB_LDR_DATA;
127 
128 //
129 // Loader Data Table Entry
130 //
131 // NOTE: The field 'InMemoryOrderLinks' MUST have that name.
132 // It's hard-coded into WinDbg for PEB dumping!
133 //
134 typedef struct _LDR_DATA_TABLE_ENTRY
135 {
136     LIST_ENTRY InLoadOrderLinks;
137     LIST_ENTRY InMemoryOrderLinks;
138     LIST_ENTRY InInitializationOrderLinks;
139     PVOID DllBase;
140     PVOID EntryPoint;
141     ULONG SizeOfImage;
142     UNICODE_STRING FullDllName;
143     UNICODE_STRING BaseDllName;
144     ULONG Flags;
145     USHORT LoadCount;
146     USHORT TlsIndex;
147     union
148     {
149         LIST_ENTRY HashLinks;
150         struct
151         {
152             PVOID SectionPointer;
153             ULONG CheckSum;
154         };
155     };
156     union
157     {
158         ULONG TimeDateStamp;
159         PVOID LoadedImports;
160     };
161     PACTIVATION_CONTEXT EntryPointActivationContext;
162     PVOID PatchInformation;
163 } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
164 
165 //
166 // Loaded Imports Reference Counting in Kernel
167 //
168 typedef struct _LOAD_IMPORTS
169 {
170     SIZE_T Count;
171     PLDR_DATA_TABLE_ENTRY Entry[1];
172 } LOAD_IMPORTS, *PLOAD_IMPORTS;
173 
174 //
175 // Loader Resource Information
176 //
177 typedef struct _LDR_RESOURCE_INFO
178 {
179     ULONG_PTR Type;
180     ULONG_PTR Name;
181     ULONG_PTR Language;
182 } LDR_RESOURCE_INFO, *PLDR_RESOURCE_INFO;
183 
184 typedef struct _LDR_ENUM_RESOURCE_INFO
185 {
186     ULONG_PTR Type;
187     ULONG_PTR Name;
188     ULONG_PTR Language;
189     PVOID Data;
190     SIZE_T Size;
191     ULONG_PTR Reserved;
192 } LDR_ENUM_RESOURCE_INFO, *PLDR_ENUM_RESOURCE_INFO;
193 
194 //
195 // DLL Notifications
196 //
197 typedef struct _LDR_DLL_LOADED_NOTIFICATION_DATA
198 {
199     ULONG Flags;
200     PUNICODE_STRING FullDllName;
201     PUNICODE_STRING BaseDllName;
202     PVOID DllBase;
203     ULONG SizeOfImage;
204 } LDR_DLL_LOADED_NOTIFICATION_DATA, *PLDR_DLL_LOADED_NOTIFICATION_DATA;
205 
206 typedef VOID
207 (NTAPI *PLDR_DLL_LOADED_NOTIFICATION_CALLBACK)(
208     _In_ BOOLEAN Type,
209     _In_ struct _LDR_DLL_LOADED_NOTIFICATION_DATA *Data
210 );
211 
212 typedef struct _LDR_DLL_LOADED_NOTIFICATION_ENTRY
213 {
214     LIST_ENTRY NotificationListEntry;
215     PLDR_DLL_LOADED_NOTIFICATION_CALLBACK Callback;
216 } LDR_DLL_LOADED_NOTIFICATION_ENTRY, *PLDR_DLL_LOADED_NOTIFICATION_ENTRY;
217 
218 //
219 // Alternate Resources Support
220 //
221 typedef struct _ALT_RESOURCE_MODULE
222 {
223     LANGID LangId;
224     PVOID ModuleBase;
225 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
226     PVOID ModuleManifest;
227 #endif
228     PVOID AlternateModule;
229 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
230     HANDLE AlternateFileHandle;
231     ULONG ModuleCheckSum;
232     ULONG ErrorCode;
233 #endif
234 } ALT_RESOURCE_MODULE, *PALT_RESOURCE_MODULE;
235 
236 //
237 // Callback function for LdrEnumerateLoadedModules
238 //
239 typedef VOID (NTAPI LDR_ENUM_CALLBACK)(_In_ PLDR_DATA_TABLE_ENTRY ModuleInformation, _In_ PVOID Parameter, _Out_ BOOLEAN *Stop);
240 typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK;
241 
242 //
243 // Manifest prober routine set via LdrSetDllManifestProber
244 //
245 typedef NTSTATUS (NTAPI LDR_MANIFEST_PROBER_ROUTINE)(_In_ PVOID DllHandle, _In_ PCWSTR FullDllName, _Out_ PVOID *ActCtx);
246 typedef LDR_MANIFEST_PROBER_ROUTINE *PLDR_MANIFEST_PROBER_ROUTINE;
247 
248 //
249 // DLL Main Routine
250 //
251 typedef BOOLEAN
252 (NTAPI *PDLL_INIT_ROUTINE)(
253     _In_ PVOID DllHandle,
254     _In_ ULONG Reason,
255     _In_opt_ PCONTEXT Context
256 );
257 
258 #endif
259