blob: c7512158fc8cc887d4fe48c9c0e91078a5ef1494 [file] [log] [blame]
// 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_