Loosen up heuristics for detecting account creation forms.
[chromium-blink-merge.git] / chrome_frame / crash_reporting / nt_loader.h
blobc7512158fc8cc887d4fe48c9c0e91078a5ef1494
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_
7 #include <windows.h>
8 #include <winnt.h>
9 #include <winternl.h>
11 namespace nt_loader {
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;
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
29 void* ArbitraryUserPointer; // 0x014
30 _NT_TIB* Self; // 0x018
31 } _NT_TIB, NT_TIB;
33 typedef struct _CLIENT_ID {
34 void* UniqueProcess; // 0x000
35 void* UniqueThread; // 0x004
36 } _CLIENT_ID, CLIENT_ID;
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;
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;
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.
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
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
135 union {
136 ULONG TimeDateStamp; // 0x044
137 void* LoadedImports; // 0x044
139 void *EntryPointActivationContext; // 0x048
140 void* PatchInformation; // 0x04c
141 } _LDR_DATA_TABLE_ENTRY, LDR_DATA_TABLE_ENTRY;
143 // Retrieves the current thread's TEB.
144 inline TEB* GetCurrentTeb() {
145 return reinterpret_cast<TEB*>(NtCurrentTeb());
148 // Retrieves the current process' PEB.
149 inline PEB* GetCurrentPeb() {
150 return GetCurrentTeb()->ProcessEnvironmentBlock;
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();
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);
163 // Returns the loader's lock.
164 inline CRITICAL_SECTION* GetLoaderLock() {
165 return GetCurrentPeb()->LoaderLock;
168 // Returns true iff the current thread owns the loader's lock on call.
169 inline bool OwnsLoaderLock() {
170 return OwnsCriticalSection(GetLoaderLock());
173 } // namespace nt_loader
175 #endif // CHROME_FRAME_NT_LOADER_H_