• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
GetCurrentTeb()144 inline TEB* GetCurrentTeb() {
145   return reinterpret_cast<TEB*>(NtCurrentTeb());
146 }
147 
148 // Retrieves the current process' PEB.
GetCurrentPeb()149 inline PEB* GetCurrentPeb() {
150   return GetCurrentTeb()->ProcessEnvironmentBlock;
151 }
152 
153 // Returns true iff the current thread owns critsec.
OwnsCriticalSection(CRITICAL_SECTION * 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.
GetLoaderLock()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.
OwnsLoaderLock()169 inline bool OwnsLoaderLock() {
170   return OwnsCriticalSection(GetLoaderLock());
171 }
172 
173 }  // namespace nt_loader
174 
175 #endif  // CHROME_FRAME_NT_LOADER_H_
176