summaryrefslogtreecommitdiffstats
path: root/chrome_frame/crash_reporting/nt_loader.h
blob: c7512158fc8cc887d4fe48c9c0e91078a5ef1494 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_FRAME_NT_LOADER_H_
#define CHROME_FRAME_NT_LOADER_H_

#include <windows.h>
#include <winnt.h>
#include <winternl.h>

namespace nt_loader {

// These structures are gleaned from public symbol information.
struct _PEB;
struct _PEB_LDR_DATA;
struct _RTL_USER_PROCESS_PARAMETERS;
struct _PEB_FREE_BLOCK;


typedef struct _NT_TIB {
  _EXCEPTION_REGISTRATION_RECORD* ExceptionList;  // 0x000
  void *StackBase;  // 0x004
  void* StackLimit;  // 0x008
  void* SubSystemTib;  // 0x00c
  union {
    void *FiberData;  // 0x010
    DWORD Version;  // 0x010
  };
  void* ArbitraryUserPointer;  // 0x014
  _NT_TIB* Self;  // 0x018
} _NT_TIB, NT_TIB;

typedef struct _CLIENT_ID {
  void* UniqueProcess;  // 0x000
  void* UniqueThread;  // 0x004
} _CLIENT_ID, CLIENT_ID;

typedef struct _TEB {
  _NT_TIB NtTib;  // 0x000
  void* EnvironmentPointer;  // 0x01c
  _CLIENT_ID ClientId;  // 0x020
  void* ActiveRpcHandle;  // 0x028
  void* ThreadLocalStoragePointer;  // 0x02c
  _PEB* ProcessEnvironmentBlock;  // 0x030
  // There is more in a TEB, but this is all we need.
} _TEB, TEB;

typedef struct _PEB {
  BYTE InheritedAddressSpace;  // 0x000
  BYTE ReadImageFileExecOptions;  // 0x001
  BYTE BeingDebugged;  // 0x002
  BYTE SpareBool;  // 0x003
  void* Mutant;  // 0x004
  void* ImageBaseAddress;  // 0x008
  _PEB_LDR_DATA* Ldr;  // 0x00c
  _RTL_USER_PROCESS_PARAMETERS* ProcessParameters;  // 0x010
  void* SubSystemData;  // 0x014
  void* ProcessHeap;  // 0x018
  _RTL_CRITICAL_SECTION* FastPebLock;  // 0x01c
  void* FastPebLockRoutine;  // 0x020
  void* FastPebUnlockRoutine;  // 0x024
  ULONG EnvironmentUpdateCount;  // 0x028
  void* KernelCallbackTable;  // 0x02c
  ULONG SystemReserved[1]; // 0x030
  ULONG AtlThunkSListPtr32;  // 0x034
  _PEB_FREE_BLOCK* FreeList;  // 0x038
  ULONG TlsExpansionCounter;  // 0x03c
  void* TlsBitmap;  // 0x040
  ULONG TlsBitmapBits[2]; // 0x044
  void* ReadOnlySharedMemoryBase;  // 0x04c
  void* ReadOnlySharedMemoryHeap;  // 0x050
  void** ReadOnlyStaticServerData;  // 0x054
  void* AnsiCodePageData;  // 0x058
  void* OemCodePageData;  // 0x05c
  void* UnicodeCaseTableData;  // 0x060
  ULONG NumberOfProcessors;  // 0x064
  ULONG NtGlobalFlag;  // 0x068
  _LARGE_INTEGER CriticalSectionTimeout;  // 0x070
  ULONG HeapSegmentReserve;  // 0x078
  ULONG HeapSegmentCommit;  // 0x07c
  ULONG HeapDeCommitTotalFreeThreshold;  // 0x080
  ULONG HeapDeCommitFreeBlockThreshold;  // 0x084
  ULONG NumberOfHeaps;  // 0x088
  ULONG MaximumNumberOfHeaps;  // 0x08c
  void** ProcessHeaps;  // 0x090
  void* GdiSharedHandleTable;  // 0x094
  void* ProcessStarterHelper;  // 0x098
  ULONG GdiDCAttributeList;  // 0x09c
  RTL_CRITICAL_SECTION* LoaderLock;  // 0x0a0
  // There is more in a PEB, but this is all we need.
} _PEB, PEB;

struct _PEB_LDR_DATA {
  ULONG Length;  // 0x000
  BYTE Initialized;  // 0x004
  void* SsHandle;  // 0x008
  LIST_ENTRY InLoadOrderModuleList;  // 0x00c
  LIST_ENTRY InMemoryOrderModuleList;  // 0x014
  LIST_ENTRY InInitializationOrderModuleList;  // 0x01c
  // There is more data in this structure, but this is all we need.
};

// These flags are gleaned from the !dlls Windbg extension.
#define LDRP_STATIC_LINK            0x00000002
#define LDRP_IMAGE_DLL              0x00000004
#define LDRP_LOAD_IN_PROGRESS       0x00001000
#define LDRP_UNLOAD_IN_PROGRESS     0x00002000
#define LDRP_ENTRY_PROCESSED        0x00004000
#define LDRP_DONT_CALL_FOR_THREADS  0x00040000
#define LDRP_PROCESS_ATTACH_CALLED  0x00080000
#define LDRP_COR_IMAGE              0x00400000
#define LDRP_COR_OWNS_UNMAP         0x00800000
#define LDRP_COR_IL_ONLY            0x01000000
#define LDRP_REDIRECTED             0x10000000

typedef struct _LDR_DATA_TABLE_ENTRY {
  LIST_ENTRY InLoadOrderLinks;  // 0x000
  LIST_ENTRY InMemoryOrderLinks;  // 0x008
  LIST_ENTRY InInitializationOrderLinks; //  0x010
  void* DllBase;  // 0x018
  void* EntryPoint;  // 0x01c
  ULONG SizeOfImage;  // 0x020
  UNICODE_STRING FullDllName;  // 0x024
  UNICODE_STRING BaseDllName;  // 0x02c
  ULONG Flags;  // 0x034
  USHORT LoadCount;  // 0x038
  USHORT TlsIndex;  // 0x03a
  union {
    LIST_ENTRY HashLinks;  // 0x03c
    struct {
      void* SectionPointer;  // 0x03c
      ULONG CheckSum;  // 0x040
    };
  };
  union {
    ULONG TimeDateStamp;  // 0x044
    void* LoadedImports;  // 0x044
  };
  void *EntryPointActivationContext;  // 0x048
  void* PatchInformation;  // 0x04c
} _LDR_DATA_TABLE_ENTRY, LDR_DATA_TABLE_ENTRY;

// Retrieves the current thread's TEB.
inline TEB* GetCurrentTeb() {
  return reinterpret_cast<TEB*>(NtCurrentTeb());
}

// Retrieves the current process' PEB.
inline PEB* GetCurrentPeb() {
  return GetCurrentTeb()->ProcessEnvironmentBlock;
}

// Returns true iff the current thread owns critsec.
inline bool OwnsCriticalSection(CRITICAL_SECTION* critsec) {
  return reinterpret_cast<DWORD>(critsec->OwningThread) ==
      GetCurrentThreadId();
}

// Finds a loader table entry for module.
// Note: must hold the loader's lock on entry.
LDR_DATA_TABLE_ENTRY* GetLoaderEntry(HMODULE module);

// Returns the loader's lock.
inline CRITICAL_SECTION* GetLoaderLock() {
  return GetCurrentPeb()->LoaderLock;
}

// Returns true iff the current thread owns the loader's lock on call.
inline bool OwnsLoaderLock() {
  return OwnsCriticalSection(GetLoaderLock());
}

}  // namespace nt_loader

#endif  // CHROME_FRAME_NT_LOADER_H_