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