Home | History | Annotate | Download | only in crash_reporting
      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_
      6 
      7 #include <windows.h>
      8 #include <winnt.h>
      9 #include <winternl.h>
     10 
     11 namespace nt_loader {
     12 
     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;
     18 
     19 
     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
     28   };
     29   void* ArbitraryUserPointer;  // 0x014
     30   _NT_TIB* Self;  // 0x018
     31 } _NT_TIB, NT_TIB;
     32 
     33 typedef struct _CLIENT_ID {
     34   void* UniqueProcess;  // 0x000
     35   void* UniqueThread;  // 0x004
     36 } _CLIENT_ID, CLIENT_ID;
     37 
     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;
     47 
     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;
     92 
     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.
    101 };
    102 
    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
    115 
    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
    133     };
    134   };
    135   union {
    136     ULONG TimeDateStamp;  // 0x044
    137     void* LoadedImports;  // 0x044
    138   };
    139   void *EntryPointActivationContext;  // 0x048
    140   void* PatchInformation;  // 0x04c
    141 } _LDR_DATA_TABLE_ENTRY, LDR_DATA_TABLE_ENTRY;
    142 
    143 // Retrieves the current thread's TEB.
    144 inline TEB* GetCurrentTeb() {
    145   return reinterpret_cast<TEB*>(NtCurrentTeb());
    146 }
    147 
    148 // Retrieves the current process' PEB.
    149 inline PEB* GetCurrentPeb() {
    150   return GetCurrentTeb()->ProcessEnvironmentBlock;
    151 }
    152 
    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();
    157 }
    158 
    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);
    162 
    163 // Returns the loader's lock.
    164 inline CRITICAL_SECTION* GetLoaderLock() {
    165   return GetCurrentPeb()->LoaderLock;
    166 }
    167 
    168 // Returns true iff the current thread owns the loader's lock on call.
    169 inline bool OwnsLoaderLock() {
    170   return OwnsCriticalSection(GetLoaderLock());
    171 }
    172 
    173 }  // namespace nt_loader
    174 
    175 #endif  // CHROME_FRAME_NT_LOADER_H_
    176