Chromium Code Reviews| Index: util/win/process_structs.h |
| diff --git a/util/win/process_structs.h b/util/win/process_structs.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f51f82db94957313cde9c114a967253f9a7d99da |
| --- /dev/null |
| +++ b/util/win/process_structs.h |
| @@ -0,0 +1,291 @@ |
| +// Copyright 2015 The Crashpad Authors. All rights reserved. |
| +// |
| +// Licensed under the Apache License, Version 2.0 (the "License"); |
| +// you may not use this file except in compliance with the License. |
| +// You may obtain a copy of the License at |
| +// |
| +// http://www.apache.org/licenses/LICENSE-2.0 |
| +// |
| +// Unless required by applicable law or agreed to in writing, software |
| +// distributed under the License is distributed on an "AS IS" BASIS, |
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| +// See the License for the specific language governing permissions and |
| +// limitations under the License. |
| + |
| +#ifndef CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ |
| +#define CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ |
| + |
| +#include <windows.h> |
| + |
| +namespace crashpad { |
| +namespace process_types { |
| + |
| +namespace internal { |
| + |
| +struct Traits32 { |
| + using Pad = DWORD; |
| + 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
|
| + using Pointer = DWORD; |
| +}; |
| + |
| +struct Traits64 { |
| + using Pad = DWORD64; |
| + using Integral = DWORD64; |
| + using Pointer = DWORD64; |
| +}; |
| + |
| +} // namespace internal |
| + |
| +//! \{ |
| + |
| +//! \brief Selected structures from winternl.h, ntddk.h, and `dt ntdll!xxx`, |
| +//! customized to have both x86 and x64 sizes available. |
| +//! |
| +//! The structure and field names follow the Windows names for clarity. We do, |
| +//! however, use plain integral types rather than pointer types. This is both |
| +//! easier to define, and avoids accidentally treating them as pointers into the |
| +//! current address space. |
| +//! |
| +//! The templates below should be instantiated with either internal::Traits32 |
| +//! for structures targeting x86, or internal::Traits64 for x64. |
| + |
| +// We set packing to 1 so that we can explicitly control the layout to make it |
| +// match the OS defined structures. |
| +#pragma pack(push, 1) |
| + |
| +template <class Traits> |
| +struct PROCESS_BASIC_INFORMATION { |
| + union { |
| + DWORD ExitStatus; |
| + typename Traits::Pad padding_for_x64_0; |
| + }; |
| + typename Traits::Pointer PebBaseAddress; |
| + typename Traits::Integral AffinityMask; |
| + union { |
| + DWORD BasePriority; |
| + typename Traits::Pad padding_for_x64_1; |
| + }; |
| + typename Traits::Integral UniqueProcessId; |
| + typename Traits::Integral InheritedFromUniqueProcessId; |
| +}; |
| + |
| +template <class Traits> |
| +struct LIST_ENTRY { |
| + typename Traits::Pointer Flink; |
| + typename Traits::Pointer Blink; |
| +}; |
| + |
| +template <class Traits> |
| +struct UNICODE_STRING { |
| + union { |
| + struct { |
| + USHORT Length; |
| + USHORT MaximumLength; |
| + }; |
| + typename Traits::Pad padding_for_x64; |
| + }; |
| + typename Traits::Pointer Buffer; |
| +}; |
| + |
| +template <class Traits> |
| +struct PEB_LDR_DATA { |
| + ULONG Length; |
| + DWORD Initialized; |
| + typename Traits::Pointer SsHandle; |
| + LIST_ENTRY<Traits> InLoadOrderModuleList; |
| + LIST_ENTRY<Traits> InMemoryOrderModuleList; |
| + LIST_ENTRY<Traits> InInitializationOrderModuleList; |
| +}; |
| + |
| +template <class Traits> |
| +struct LDR_DATA_TABLE_ENTRY { |
| + LIST_ENTRY<Traits> InLoadOrderLinks; |
| + LIST_ENTRY<Traits> InMemoryOrderLinks; |
| + LIST_ENTRY<Traits> InInitializationOrderLinks; |
| + typename Traits::Pointer DllBase; |
| + typename Traits::Pointer EntryPoint; |
| + union { |
| + ULONG SizeOfImage; |
| + 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.
|
| + }; |
| + UNICODE_STRING<Traits> FullDllName; |
| + UNICODE_STRING<Traits> BaseDllName; |
| + ULONG Flags; |
| + USHORT ObsoleteLoadCount; |
| + USHORT TlsIndex; |
| + LIST_ENTRY<Traits> HashLinks; |
| + ULONG TimeDateStamp; |
| +}; |
| + |
| +template <class Traits> |
| +struct CURDIR { |
| + UNICODE_STRING<Traits> DosPath; |
| + typename Traits::Pointer Handle; |
| +}; |
| + |
| +template <class Traits> |
| +struct STRING { |
| + union { |
| + struct { |
| + DWORD Length; |
| + DWORD MaximumLength; |
| + }; |
| + typename Traits::Pad padding_for_x64; |
| + }; |
| + typename Traits::Pointer Buffer; |
| +}; |
| + |
| +template <class Traits> |
| +struct RTL_DRIVE_LETTER_CURDIR { |
| + WORD Flags; |
| + WORD Length; |
| + DWORD TimeStamp; |
| + STRING<Traits> DosPath; |
| +}; |
| + |
| +template <class Traits> |
| +struct RTL_USER_PROCESS_PARAMETERS { |
| + DWORD MaximumLength; |
| + DWORD Length; |
| + DWORD Flags; |
| + DWORD DebugFlags; |
| + typename Traits::Pointer ConsoleHandle; |
| + union { |
| + DWORD ConsoleFlags; |
| + typename Traits::Pad padding_for_x86; |
| + }; |
| + typename Traits::Pointer StandardInput; |
| + typename Traits::Pointer StandardOutput; |
| + typename Traits::Pointer StandardError; |
| + CURDIR<Traits> CurrentDirectory; |
| + UNICODE_STRING<Traits> DllPath; |
| + UNICODE_STRING<Traits> ImagePathName; |
| + UNICODE_STRING<Traits> CommandLine; |
| + typename Traits::Pointer Environment; |
| + DWORD StartingX; |
| + DWORD StartingY; |
| + DWORD CountX; |
| + DWORD CountY; |
| + DWORD CountCharsX; |
| + DWORD CountCharsY; |
| + DWORD FillAttribute; |
| + DWORD WindowFlags; |
| + DWORD ShowWindowFlags; |
| + UNICODE_STRING<Traits> WindowTitle; |
| + UNICODE_STRING<Traits> DesktopInfo; |
| + UNICODE_STRING<Traits> ShellInfo; |
| + UNICODE_STRING<Traits> RuntimeData; |
| + RTL_DRIVE_LETTER_CURDIR<Traits> CurrentDirectores[32]; // sic. |
| +}; |
| + |
| +template <class T> |
| +struct GdiHandleBufferCountForBitness; |
| + |
| +template <> |
| +struct GdiHandleBufferCountForBitness<internal::Traits32> { |
| + enum { value = 34 }; |
| +}; |
| +template <> |
| +struct GdiHandleBufferCountForBitness<internal::Traits64> { |
| + enum { value = 60 }; |
| +}; |
| + |
| +template <class Traits> |
| +struct PEB { |
| + union { |
| + struct { |
| + BYTE InheritedAddressSpace; |
| + BYTE ReadImageFileExecOptions; |
| + BYTE BeingDebugged; |
| + BYTE BitField; |
| + }; |
| + typename Traits::Pad padding_for_x64_0; |
| + }; |
| + typename Traits::Pointer Mutant; |
| + typename Traits::Pointer ImageBaseAddress; |
| + typename Traits::Pointer Ldr; |
| + typename Traits::Pointer ProcessParameters; |
| + typename Traits::Pointer SubSystemData; |
| + typename Traits::Pointer ProcessHeap; |
| + typename Traits::Pointer FastPebLock; |
| + typename Traits::Pointer AtlThunkSListPtr; |
| + typename Traits::Pointer IFEOKey; |
| + union { |
| + DWORD CrossProcessFlags; |
| + typename Traits::Pad padding_for_x64_1; |
| + }; |
| + typename Traits::Pointer KernelCallbackTable; |
| + DWORD SystemReserved; |
| + DWORD AtlThunkSListPtr32; |
| + typename Traits::Pointer ApiSetMap; |
| + union { |
| + DWORD TlsExpansionCounter; |
| + typename Traits::Pad padding_for_x64_2; |
| + }; |
| + typename Traits::Pointer TlsBitmap; |
| + DWORD TlsBitmapBits[2]; |
| + typename Traits::Pointer ReadOnlySharedMemoryBase; |
| + typename Traits::Pointer SparePvoid0; |
| + typename Traits::Pointer ReadOnlyStaticServerData; |
| + typename Traits::Pointer AnsiCodePageData; |
| + typename Traits::Pointer OemCodePageData; |
| + typename Traits::Pointer UnicodeCaseTableData; |
| + DWORD NumberOfProcessors; |
| + DWORD NtGlobalFlag; |
| + LARGE_INTEGER CriticalSectionTimeout; |
| + typename Traits::Integral HeapSegmentReserve; |
| + typename Traits::Integral HeapSegmentCommit; |
| + typename Traits::Integral HeapDeCommitTotalFreeThreshold; |
| + typename Traits::Integral HeapDeCommitFreeBlockThreshold; |
| + DWORD NumberOfHeaps; |
| + DWORD MaximumNumberOfHeaps; |
| + typename Traits::Pointer ProcessHeaps; |
| + typename Traits::Pointer GdiSharedHandleTable; |
| + typename Traits::Pointer ProcessStarterHelper; |
| + DWORD GdiDCAttributeList; |
| + typename Traits::Pointer LoaderLock; |
| + DWORD OSMajorVersion; |
| + DWORD OSMinorVersion; |
| + WORD OSBuildNumber; |
| + WORD OSCSDVersion; |
| + DWORD OSPlatformId; |
| + DWORD ImageSubsystem; |
| + DWORD ImageSubsystemMajorVersion; |
| + union { |
| + DWORD ImageSubsystemMinorVersion; |
| + typename Traits::Pad padding_for_x64_3; |
| + }; |
| + typename Traits::Integral ActiveProcessAffinityMask; |
| + DWORD GdiHandleBuffer[GdiHandleBufferCountForBitness<Traits>::value]; |
| + typename Traits::Pointer PostProcessInitRoutine; |
| + typename Traits::Pointer TlsExpansionBitmap; |
| + DWORD TlsExpansionBitmapBits[32]; |
| + union { |
| + DWORD SessionId; |
| + typename Traits::Pad padding_for_x64_4; |
| + }; |
| + ULARGE_INTEGER AppCompatFlags; |
| + ULARGE_INTEGER AppCompatFlagsUser; |
| + typename Traits::Pointer pShimData; |
| + typename Traits::Pointer AppCompatInfo; |
| + UNICODE_STRING<Traits> CSDVersion; |
| + typename Traits::Pointer ActivationContextData; |
| + typename Traits::Pointer ProcessAssemblyStorageMap; |
| + typename Traits::Pointer SystemDefaultActivationContextData; |
| + typename Traits::Pointer SystemAssemblyStorageMap; |
| + typename Traits::Integral MinimumStackCommit; |
| + typename Traits::Pointer FlsCallback; |
| + LIST_ENTRY<Traits> FlsListHead; |
| + typename Traits::Pointer FlsBitmap; |
| + DWORD FlsBitmapBits[4]; |
| + DWORD FlsHighIndex; |
| +}; |
| + |
| +#pragma pack(pop) |
| + |
| +//! \} |
| + |
| +} // namespace process_types |
| +} // namespace crashpad |
| + |
| +#endif // CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ |