| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 #ifndef CHROME_FRAME_NT_LOADER_H_ | |
| 5 #define CHROME_FRAME_NT_LOADER_H_ | |
| 6 | |
| 7 #include <windows.h> | |
| 8 #include <winnt.h> | |
| 9 #include <winternl.h> | |
| 10 | |
| 11 namespace nt_loader { | |
| 12 | |
| 13 // These structures are gleaned from public symbol information. | |
| 14 struct _PEB; | |
| 15 struct _PEB_LDR_DATA; | |
| 16 struct _RTL_USER_PROCESS_PARAMETERS; | |
| 17 struct _PEB_FREE_BLOCK; | |
| 18 | |
| 19 | |
| 20 typedef struct _NT_TIB { | |
| 21 _EXCEPTION_REGISTRATION_RECORD* ExceptionList; // 0x000 | |
| 22 void *StackBase; // 0x004 | |
| 23 void* StackLimit; // 0x008 | |
| 24 void* SubSystemTib; // 0x00c | |
| 25 union { | |
| 26 void *FiberData; // 0x010 | |
| 27 DWORD Version; // 0x010 | |
| 28 }; | |
| 29 void* ArbitraryUserPointer; // 0x014 | |
| 30 _NT_TIB* Self; // 0x018 | |
| 31 } _NT_TIB, NT_TIB; | |
| 32 | |
| 33 typedef struct _CLIENT_ID { | |
| 34 void* UniqueProcess; // 0x000 | |
| 35 void* UniqueThread; // 0x004 | |
| 36 } _CLIENT_ID, CLIENT_ID; | |
| 37 | |
| 38 typedef struct _TEB { | |
| 39 _NT_TIB NtTib; // 0x000 | |
| 40 void* EnvironmentPointer; // 0x01c | |
| 41 _CLIENT_ID ClientId; // 0x020 | |
| 42 void* ActiveRpcHandle; // 0x028 | |
| 43 void* ThreadLocalStoragePointer; // 0x02c | |
| 44 _PEB* ProcessEnvironmentBlock; // 0x030 | |
| 45 // There is more in a TEB, but this is all we need. | |
| 46 } _TEB, TEB; | |
| 47 | |
| 48 typedef struct _PEB { | |
| 49 BYTE InheritedAddressSpace; // 0x000 | |
| 50 BYTE ReadImageFileExecOptions; // 0x001 | |
| 51 BYTE BeingDebugged; // 0x002 | |
| 52 BYTE SpareBool; // 0x003 | |
| 53 void* Mutant; // 0x004 | |
| 54 void* ImageBaseAddress; // 0x008 | |
| 55 _PEB_LDR_DATA* Ldr; // 0x00c | |
| 56 _RTL_USER_PROCESS_PARAMETERS* ProcessParameters; // 0x010 | |
| 57 void* SubSystemData; // 0x014 | |
| 58 void* ProcessHeap; // 0x018 | |
| 59 _RTL_CRITICAL_SECTION* FastPebLock; // 0x01c | |
| 60 void* FastPebLockRoutine; // 0x020 | |
| 61 void* FastPebUnlockRoutine; // 0x024 | |
| 62 ULONG EnvironmentUpdateCount; // 0x028 | |
| 63 void* KernelCallbackTable; // 0x02c | |
| 64 ULONG SystemReserved[1]; // 0x030 | |
| 65 ULONG AtlThunkSListPtr32; // 0x034 | |
| 66 _PEB_FREE_BLOCK* FreeList; // 0x038 | |
| 67 ULONG TlsExpansionCounter; // 0x03c | |
| 68 void* TlsBitmap; // 0x040 | |
| 69 ULONG TlsBitmapBits[2]; // 0x044 | |
| 70 void* ReadOnlySharedMemoryBase; // 0x04c | |
| 71 void* ReadOnlySharedMemoryHeap; // 0x050 | |
| 72 void** ReadOnlyStaticServerData; // 0x054 | |
| 73 void* AnsiCodePageData; // 0x058 | |
| 74 void* OemCodePageData; // 0x05c | |
| 75 void* UnicodeCaseTableData; // 0x060 | |
| 76 ULONG NumberOfProcessors; // 0x064 | |
| 77 ULONG NtGlobalFlag; // 0x068 | |
| 78 _LARGE_INTEGER CriticalSectionTimeout; // 0x070 | |
| 79 ULONG HeapSegmentReserve; // 0x078 | |
| 80 ULONG HeapSegmentCommit; // 0x07c | |
| 81 ULONG HeapDeCommitTotalFreeThreshold; // 0x080 | |
| 82 ULONG HeapDeCommitFreeBlockThreshold; // 0x084 | |
| 83 ULONG NumberOfHeaps; // 0x088 | |
| 84 ULONG MaximumNumberOfHeaps; // 0x08c | |
| 85 void** ProcessHeaps; // 0x090 | |
| 86 void* GdiSharedHandleTable; // 0x094 | |
| 87 void* ProcessStarterHelper; // 0x098 | |
| 88 ULONG GdiDCAttributeList; // 0x09c | |
| 89 RTL_CRITICAL_SECTION* LoaderLock; // 0x0a0 | |
| 90 // There is more in a PEB, but this is all we need. | |
| 91 } _PEB, PEB; | |
| 92 | |
| 93 struct _PEB_LDR_DATA { | |
| 94 ULONG Length; // 0x000 | |
| 95 BYTE Initialized; // 0x004 | |
| 96 void* SsHandle; // 0x008 | |
| 97 LIST_ENTRY InLoadOrderModuleList; // 0x00c | |
| 98 LIST_ENTRY InMemoryOrderModuleList; // 0x014 | |
| 99 LIST_ENTRY InInitializationOrderModuleList; // 0x01c | |
| 100 // There is more data in this structure, but this is all we need. | |
| 101 }; | |
| 102 | |
| 103 // These flags are gleaned from the !dlls Windbg extension. | |
| 104 #define LDRP_STATIC_LINK 0x00000002 | |
| 105 #define LDRP_IMAGE_DLL 0x00000004 | |
| 106 #define LDRP_LOAD_IN_PROGRESS 0x00001000 | |
| 107 #define LDRP_UNLOAD_IN_PROGRESS 0x00002000 | |
| 108 #define LDRP_ENTRY_PROCESSED 0x00004000 | |
| 109 #define LDRP_DONT_CALL_FOR_THREADS 0x00040000 | |
| 110 #define LDRP_PROCESS_ATTACH_CALLED 0x00080000 | |
| 111 #define LDRP_COR_IMAGE 0x00400000 | |
| 112 #define LDRP_COR_OWNS_UNMAP 0x00800000 | |
| 113 #define LDRP_COR_IL_ONLY 0x01000000 | |
| 114 #define LDRP_REDIRECTED 0x10000000 | |
| 115 | |
| 116 typedef struct _LDR_DATA_TABLE_ENTRY { | |
| 117 LIST_ENTRY InLoadOrderLinks; // 0x000 | |
| 118 LIST_ENTRY InMemoryOrderLinks; // 0x008 | |
| 119 LIST_ENTRY InInitializationOrderLinks; // 0x010 | |
| 120 void* DllBase; // 0x018 | |
| 121 void* EntryPoint; // 0x01c | |
| 122 ULONG SizeOfImage; // 0x020 | |
| 123 UNICODE_STRING FullDllName; // 0x024 | |
| 124 UNICODE_STRING BaseDllName; // 0x02c | |
| 125 ULONG Flags; // 0x034 | |
| 126 USHORT LoadCount; // 0x038 | |
| 127 USHORT TlsIndex; // 0x03a | |
| 128 union { | |
| 129 LIST_ENTRY HashLinks; // 0x03c | |
| 130 struct { | |
| 131 void* SectionPointer; // 0x03c | |
| 132 ULONG CheckSum; // 0x040 | |
| 133 }; | |
| 134 }; | |
| 135 union { | |
| 136 ULONG TimeDateStamp; // 0x044 | |
| 137 void* LoadedImports; // 0x044 | |
| 138 }; | |
| 139 void *EntryPointActivationContext; // 0x048 | |
| 140 void* PatchInformation; // 0x04c | |
| 141 } _LDR_DATA_TABLE_ENTRY, LDR_DATA_TABLE_ENTRY; | |
| 142 | |
| 143 // Retrieves the current thread's TEB. | |
| 144 inline TEB* GetCurrentTeb() { | |
| 145 return reinterpret_cast<TEB*>(NtCurrentTeb()); | |
| 146 } | |
| 147 | |
| 148 // Retrieves the current process' PEB. | |
| 149 inline PEB* GetCurrentPeb() { | |
| 150 return GetCurrentTeb()->ProcessEnvironmentBlock; | |
| 151 } | |
| 152 | |
| 153 // Returns true iff the current thread owns critsec. | |
| 154 inline bool OwnsCriticalSection(CRITICAL_SECTION* critsec) { | |
| 155 return reinterpret_cast<DWORD>(critsec->OwningThread) == | |
| 156 GetCurrentThreadId(); | |
| 157 } | |
| 158 | |
| 159 // Finds a loader table entry for module. | |
| 160 // Note: must hold the loader's lock on entry. | |
| 161 LDR_DATA_TABLE_ENTRY* GetLoaderEntry(HMODULE module); | |
| 162 | |
| 163 // Returns the loader's lock. | |
| 164 inline CRITICAL_SECTION* GetLoaderLock() { | |
| 165 return GetCurrentPeb()->LoaderLock; | |
| 166 } | |
| 167 | |
| 168 // Returns true iff the current thread owns the loader's lock on call. | |
| 169 inline bool OwnsLoaderLock() { | |
| 170 return OwnsCriticalSection(GetLoaderLock()); | |
| 171 } | |
| 172 | |
| 173 } // namespace nt_loader | |
| 174 | |
| 175 #endif // CHROME_FRAME_NT_LOADER_H_ | |
| OLD | NEW |