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 |