diff options
author | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 18:01:55 +0000 |
---|---|---|
committer | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 18:01:55 +0000 |
commit | b438c4a50990c32e11e8b9a4d806c8a7bc2b8746 (patch) | |
tree | 593ef9d3b446c624b9e6d2dc5de74d8050087aa1 /chrome_frame/crash_reporting/nt_loader.h | |
parent | 66eabe1f06ce4bc35eb619aa2f2e4695255137fa (diff) | |
download | chromium_src-b438c4a50990c32e11e8b9a4d806c8a7bc2b8746.zip chromium_src-b438c4a50990c32e11e8b9a4d806c8a7bc2b8746.tar.gz chromium_src-b438c4a50990c32e11e8b9a4d806c8a7bc2b8746.tar.bz2 |
Utility functions to interact with the NT loader's data structures and associated tests.
This is in preparation for squelching false positive crash reports during DLL load.
BUG=31980
TEST=Unittests in this change.
Review URL: http://codereview.chromium.org/882001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41289 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/crash_reporting/nt_loader.h')
-rw-r--r-- | chrome_frame/crash_reporting/nt_loader.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/chrome_frame/crash_reporting/nt_loader.h b/chrome_frame/crash_reporting/nt_loader.h new file mode 100644 index 0000000..fc4efb1 --- /dev/null +++ b/chrome_frame/crash_reporting/nt_loader.h @@ -0,0 +1,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_ |