OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Crashpad Authors. All rights reserved. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 | |
15 #ifndef CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ | |
16 #define CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ | |
17 | |
18 #include <windows.h> | |
19 | |
20 namespace crashpad { | |
21 namespace process_types { | |
22 | |
23 namespace internal { | |
24 | |
25 struct Traits32 { | |
26 using Pad = DWORD; | |
27 using Integral = DWORD; | |
Mark Mentovai
2015/03/09 22:44:44
Let’s have both signed and unsigned. Anything that
scottmg
2015/03/09 23:23:57
Done. I don't believe there are any that are signe
| |
28 using Pointer = DWORD; | |
29 }; | |
30 | |
31 struct Traits64 { | |
32 using Pad = DWORD64; | |
33 using Integral = DWORD64; | |
34 using Pointer = DWORD64; | |
35 }; | |
36 | |
37 } // namespace internal | |
38 | |
39 //! \{ | |
40 | |
41 //! \brief Selected structures from winternl.h, ntddk.h, and `dt ntdll!xxx`, | |
42 //! customized to have both x86 and x64 sizes available. | |
43 //! | |
44 //! The structure and field names follow the Windows names for clarity. We do, | |
45 //! however, use plain integral types rather than pointer types. This is both | |
46 //! easier to define, and avoids accidentally treating them as pointers into the | |
47 //! current address space. | |
48 //! | |
49 //! The templates below should be instantiated with either internal::Traits32 | |
50 //! for structures targeting x86, or internal::Traits64 for x64. | |
51 | |
52 // We set packing to 1 so that we can explicitly control the layout to make it | |
53 // match the OS defined structures. | |
54 #pragma pack(push, 1) | |
55 | |
56 template <class Traits> | |
57 struct PROCESS_BASIC_INFORMATION { | |
58 union { | |
59 DWORD ExitStatus; | |
60 typename Traits::Pad padding_for_x64_0; | |
61 }; | |
62 typename Traits::Pointer PebBaseAddress; | |
63 typename Traits::Integral AffinityMask; | |
64 union { | |
65 DWORD BasePriority; | |
66 typename Traits::Pad padding_for_x64_1; | |
67 }; | |
68 typename Traits::Integral UniqueProcessId; | |
69 typename Traits::Integral InheritedFromUniqueProcessId; | |
70 }; | |
71 | |
72 template <class Traits> | |
73 struct LIST_ENTRY { | |
74 typename Traits::Pointer Flink; | |
75 typename Traits::Pointer Blink; | |
76 }; | |
77 | |
78 template <class Traits> | |
79 struct UNICODE_STRING { | |
80 union { | |
81 struct { | |
82 USHORT Length; | |
83 USHORT MaximumLength; | |
84 }; | |
85 typename Traits::Pad padding_for_x64; | |
86 }; | |
87 typename Traits::Pointer Buffer; | |
88 }; | |
89 | |
90 template <class Traits> | |
91 struct PEB_LDR_DATA { | |
92 ULONG Length; | |
93 DWORD Initialized; | |
94 typename Traits::Pointer SsHandle; | |
95 LIST_ENTRY<Traits> InLoadOrderModuleList; | |
96 LIST_ENTRY<Traits> InMemoryOrderModuleList; | |
97 LIST_ENTRY<Traits> InInitializationOrderModuleList; | |
98 }; | |
99 | |
100 template <class Traits> | |
101 struct LDR_DATA_TABLE_ENTRY { | |
102 LIST_ENTRY<Traits> InLoadOrderLinks; | |
103 LIST_ENTRY<Traits> InMemoryOrderLinks; | |
104 LIST_ENTRY<Traits> InInitializationOrderLinks; | |
105 typename Traits::Pointer DllBase; | |
106 typename Traits::Pointer EntryPoint; | |
107 union { | |
108 ULONG SizeOfImage; | |
109 typename Traits::Pad padding_for_x86; | |
Mark Mentovai
2015/03/09 22:44:44
x86 but not x64? Same question once later in the f
scottmg
2015/03/09 23:23:57
Oops, fixed.
| |
110 }; | |
111 UNICODE_STRING<Traits> FullDllName; | |
112 UNICODE_STRING<Traits> BaseDllName; | |
113 ULONG Flags; | |
114 USHORT ObsoleteLoadCount; | |
115 USHORT TlsIndex; | |
116 LIST_ENTRY<Traits> HashLinks; | |
117 ULONG TimeDateStamp; | |
118 }; | |
119 | |
120 template <class Traits> | |
121 struct CURDIR { | |
122 UNICODE_STRING<Traits> DosPath; | |
123 typename Traits::Pointer Handle; | |
124 }; | |
125 | |
126 template <class Traits> | |
127 struct STRING { | |
128 union { | |
129 struct { | |
130 DWORD Length; | |
131 DWORD MaximumLength; | |
132 }; | |
133 typename Traits::Pad padding_for_x64; | |
134 }; | |
135 typename Traits::Pointer Buffer; | |
136 }; | |
137 | |
138 template <class Traits> | |
139 struct RTL_DRIVE_LETTER_CURDIR { | |
140 WORD Flags; | |
141 WORD Length; | |
142 DWORD TimeStamp; | |
143 STRING<Traits> DosPath; | |
144 }; | |
145 | |
146 template <class Traits> | |
147 struct RTL_USER_PROCESS_PARAMETERS { | |
148 DWORD MaximumLength; | |
149 DWORD Length; | |
150 DWORD Flags; | |
151 DWORD DebugFlags; | |
152 typename Traits::Pointer ConsoleHandle; | |
153 union { | |
154 DWORD ConsoleFlags; | |
155 typename Traits::Pad padding_for_x86; | |
156 }; | |
157 typename Traits::Pointer StandardInput; | |
158 typename Traits::Pointer StandardOutput; | |
159 typename Traits::Pointer StandardError; | |
160 CURDIR<Traits> CurrentDirectory; | |
161 UNICODE_STRING<Traits> DllPath; | |
162 UNICODE_STRING<Traits> ImagePathName; | |
163 UNICODE_STRING<Traits> CommandLine; | |
164 typename Traits::Pointer Environment; | |
165 DWORD StartingX; | |
166 DWORD StartingY; | |
167 DWORD CountX; | |
168 DWORD CountY; | |
169 DWORD CountCharsX; | |
170 DWORD CountCharsY; | |
171 DWORD FillAttribute; | |
172 DWORD WindowFlags; | |
173 DWORD ShowWindowFlags; | |
174 UNICODE_STRING<Traits> WindowTitle; | |
175 UNICODE_STRING<Traits> DesktopInfo; | |
176 UNICODE_STRING<Traits> ShellInfo; | |
177 UNICODE_STRING<Traits> RuntimeData; | |
178 RTL_DRIVE_LETTER_CURDIR<Traits> CurrentDirectores[32]; // sic. | |
179 }; | |
180 | |
181 template <class T> | |
182 struct GdiHandleBufferCountForBitness; | |
183 | |
184 template <> | |
185 struct GdiHandleBufferCountForBitness<internal::Traits32> { | |
186 enum { value = 34 }; | |
187 }; | |
188 template <> | |
189 struct GdiHandleBufferCountForBitness<internal::Traits64> { | |
190 enum { value = 60 }; | |
191 }; | |
192 | |
193 template <class Traits> | |
194 struct PEB { | |
195 union { | |
196 struct { | |
197 BYTE InheritedAddressSpace; | |
198 BYTE ReadImageFileExecOptions; | |
199 BYTE BeingDebugged; | |
200 BYTE BitField; | |
201 }; | |
202 typename Traits::Pad padding_for_x64_0; | |
203 }; | |
204 typename Traits::Pointer Mutant; | |
205 typename Traits::Pointer ImageBaseAddress; | |
206 typename Traits::Pointer Ldr; | |
207 typename Traits::Pointer ProcessParameters; | |
208 typename Traits::Pointer SubSystemData; | |
209 typename Traits::Pointer ProcessHeap; | |
210 typename Traits::Pointer FastPebLock; | |
211 typename Traits::Pointer AtlThunkSListPtr; | |
212 typename Traits::Pointer IFEOKey; | |
213 union { | |
214 DWORD CrossProcessFlags; | |
215 typename Traits::Pad padding_for_x64_1; | |
216 }; | |
217 typename Traits::Pointer KernelCallbackTable; | |
218 DWORD SystemReserved; | |
219 DWORD AtlThunkSListPtr32; | |
220 typename Traits::Pointer ApiSetMap; | |
221 union { | |
222 DWORD TlsExpansionCounter; | |
223 typename Traits::Pad padding_for_x64_2; | |
224 }; | |
225 typename Traits::Pointer TlsBitmap; | |
226 DWORD TlsBitmapBits[2]; | |
227 typename Traits::Pointer ReadOnlySharedMemoryBase; | |
228 typename Traits::Pointer SparePvoid0; | |
229 typename Traits::Pointer ReadOnlyStaticServerData; | |
230 typename Traits::Pointer AnsiCodePageData; | |
231 typename Traits::Pointer OemCodePageData; | |
232 typename Traits::Pointer UnicodeCaseTableData; | |
233 DWORD NumberOfProcessors; | |
234 DWORD NtGlobalFlag; | |
235 LARGE_INTEGER CriticalSectionTimeout; | |
236 typename Traits::Integral HeapSegmentReserve; | |
237 typename Traits::Integral HeapSegmentCommit; | |
238 typename Traits::Integral HeapDeCommitTotalFreeThreshold; | |
239 typename Traits::Integral HeapDeCommitFreeBlockThreshold; | |
240 DWORD NumberOfHeaps; | |
241 DWORD MaximumNumberOfHeaps; | |
242 typename Traits::Pointer ProcessHeaps; | |
243 typename Traits::Pointer GdiSharedHandleTable; | |
244 typename Traits::Pointer ProcessStarterHelper; | |
245 DWORD GdiDCAttributeList; | |
246 typename Traits::Pointer LoaderLock; | |
247 DWORD OSMajorVersion; | |
248 DWORD OSMinorVersion; | |
249 WORD OSBuildNumber; | |
250 WORD OSCSDVersion; | |
251 DWORD OSPlatformId; | |
252 DWORD ImageSubsystem; | |
253 DWORD ImageSubsystemMajorVersion; | |
254 union { | |
255 DWORD ImageSubsystemMinorVersion; | |
256 typename Traits::Pad padding_for_x64_3; | |
257 }; | |
258 typename Traits::Integral ActiveProcessAffinityMask; | |
259 DWORD GdiHandleBuffer[GdiHandleBufferCountForBitness<Traits>::value]; | |
260 typename Traits::Pointer PostProcessInitRoutine; | |
261 typename Traits::Pointer TlsExpansionBitmap; | |
262 DWORD TlsExpansionBitmapBits[32]; | |
263 union { | |
264 DWORD SessionId; | |
265 typename Traits::Pad padding_for_x64_4; | |
266 }; | |
267 ULARGE_INTEGER AppCompatFlags; | |
268 ULARGE_INTEGER AppCompatFlagsUser; | |
269 typename Traits::Pointer pShimData; | |
270 typename Traits::Pointer AppCompatInfo; | |
271 UNICODE_STRING<Traits> CSDVersion; | |
272 typename Traits::Pointer ActivationContextData; | |
273 typename Traits::Pointer ProcessAssemblyStorageMap; | |
274 typename Traits::Pointer SystemDefaultActivationContextData; | |
275 typename Traits::Pointer SystemAssemblyStorageMap; | |
276 typename Traits::Integral MinimumStackCommit; | |
277 typename Traits::Pointer FlsCallback; | |
278 LIST_ENTRY<Traits> FlsListHead; | |
279 typename Traits::Pointer FlsBitmap; | |
280 DWORD FlsBitmapBits[4]; | |
281 DWORD FlsHighIndex; | |
282 }; | |
283 | |
284 #pragma pack(pop) | |
285 | |
286 //! \} | |
287 | |
288 } // namespace process_types | |
289 } // namespace crashpad | |
290 | |
291 #endif // CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ | |
OLD | NEW |