|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
impl.h
Abstract:
OS-specific thunks.
Author:
Matthew D Hendel (math) 20-Sept-1999
Revision History:
--*/
#pragma once
//
// dbghelp routines
//
typedef BOOL (WINAPI * MINI_DUMP_READ_DUMP_STREAM) ( IN PVOID Base, ULONG StreamNumber, OUT PMINIDUMP_DIRECTORY * Dir, OPTIONAL OUT PVOID * Stream, OPTIONAL OUT ULONG * StreamSize OPTIONAL );
typedef BOOL (WINAPI * MINI_DUMP_WRITE_DUMP) ( IN HANDLE hProcess, IN DWORD ProcessId, IN HANDLE hFile, IN MINIDUMP_TYPE DumpType, IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL );
extern MINI_DUMP_READ_DUMP_STREAM xxxReadDumpStream; extern MINI_DUMP_WRITE_DUMP xxxWriteDump;
//
// PSAPI APIs.
//
typedef BOOL (WINAPI * ENUM_PROCESS_MODULES) ( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );
typedef DWORD (WINAPI * GET_MODULE_FILE_NAME_EX_W) ( HANDLE hProcess, HMODULE hModule, LPWSTR lpFilename, DWORD nSize );
extern ENUM_PROCESS_MODULES xxxEnumProcessModules; extern GET_MODULE_FILE_NAME_EX_W xxxGetModuleFileNameExW;
#define EnumProcessModules xxxEnumProcessModules
#define GetModuleFileNameExW xxxGetModuleFileNameExW
//
// Functions exportd from impl.c
//
BOOL MiniDumpSetup( );
VOID MiniDumpFree( );
//
// Redirect the NT APIs since we don't want dbghelp to link to NTDLL directly
//
typedef LONG NTSTATUS;
typedef NTSTATUS (WINAPI * NT_OPEN_THREAD) ( PHANDLE ThreadHandle, ULONG Mask, PVOID Attributes, PVOID ClientId );
typedef NTSTATUS (WINAPI * NT_QUERY_SYSTEM_INFORMATION) ( IN INT SystemInformationClass, OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
typedef NTSTATUS (WINAPI * NT_QUERY_INFORMATION_PROCESS) ( IN HANDLE ProcessHandle, IN INT ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL );
typedef NTSTATUS (WINAPI * NT_QUERY_INFORMATION_THREAD) ( IN HANDLE ThreadHandle, IN INT ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL );
typedef NTSTATUS (WINAPI * NT_QUERY_OBJECT) ( IN HANDLE Handle, IN INT ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG Length, OUT PULONG ReturnLength OPTIONAL );
typedef BOOLEAN (NTAPI* RTL_FREE_HEAP) ( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress );
//
// We will be using the xxx routines instead of the real routines.
//
//
// NTDLL APIs.
//
extern NT_OPEN_THREAD xxxNtOpenThread; extern NT_QUERY_SYSTEM_INFORMATION xxxNtQuerySystemInformation; extern NT_QUERY_INFORMATION_PROCESS xxxNtQueryInformationProcess; extern NT_QUERY_INFORMATION_THREAD xxxNtQueryInformationThread; extern NT_QUERY_OBJECT xxxNtQueryObject; extern RTL_FREE_HEAP xxxRtlFreeHeap;
//
// Aliased names, for convienence.
//
#define NtOpenThread xxxNtOpenThread
#define NtQuerySystemInformation xxxNtQuerySystemInformation
#define NtQueryInformationProcess xxxNtQueryInformationProcess
#define NtQueryInformationThread xxxNtQueryInformationThread
#define NtQueryObject xxxNtQueryObject
#define RtlFreeHeap xxxRtlFreeHeap
#if defined (_X86_)
//
// Win64 supports the full NT5 Win32 API and does not have any legacy baggage
// to support. Therefore, we can directly link to all toolhelp, PSAPI and
// imagehlp functions.
//
// On some Win32 platforms, like Win95, Win98 and NT4, either Toolhelp, PSAPI,
// or OpenThread (kernel32) may not be supported. For these platforms,
// redirect these functions to internal APIs that fail gracefully.
//
typedef HANDLE (WINAPI * OPEN_THREAD) ( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId );
typedef BOOL (WINAPI * THREAD32_FIRST) ( HANDLE hSnapshot, PVOID ThreadEntry );
typedef BOOL (WINAPI * THREAD32_NEXT) ( HANDLE hSnapshot, PVOID ThreadEntry );
typedef BOOL (WINAPI * MODULE32_FIRST) ( HANDLE hSnapshot, PVOID Module );
typedef BOOL (WINAPI * MODULE32_NEXT) ( HANDLE hSnapshot, PVOID Module );
typedef HANDLE (WINAPI * CREATE_TOOLHELP32_SNAPSHOT) ( DWORD dwFlags, DWORD th32ProcessID );
typedef DWORD (WINAPI * GET_LONG_PATH_NAME_A) ( LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer );
typedef DWORD (WINAPI * GET_LONG_PATH_NAME_W) ( LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer );
struct _IMAGE_NT_HEADERS* xxxImageNtHeader ( IN PVOID Base );
PVOID xxxImageDirectoryEntryToData ( IN PVOID Base, IN BOOLEAN MappedAsImage, IN USHORT DirectoryEntry, OUT PULONG Size );
//
// We will be using the xxx routines instead of the real routines.
//
//
// Kernel32 APIs.
//
extern OPEN_THREAD xxxOpenThread; extern THREAD32_FIRST xxxThread32First; extern THREAD32_NEXT xxxThread32Next; extern MODULE32_FIRST xxxModule32First; extern MODULE32_NEXT xxxModule32Next; extern MODULE32_FIRST xxxModule32FirstW; extern MODULE32_NEXT xxxModule32NextW; extern CREATE_TOOLHELP32_SNAPSHOT xxxCreateToolhelp32Snapshot; extern GET_LONG_PATH_NAME_A xxxGetLongPathNameA; extern GET_LONG_PATH_NAME_W xxxGetLongPathNameW;
//
// Aliased names, for convienence.
//
#define OpenThread xxxOpenThread
#define Thread32First xxxThread32First
#define Thread32Next xxxThread32Next
#define Module32First xxxModule32First
#define Module32Next xxxModule32Next
#define Module32FirstW xxxModule32FirstW
#define Module32NextW xxxModule32NextW
#define CreateToolhelp32Snapshot xxxCreateToolhelp32Snapshot
#define GetLongPathNameA xxxGetLongPathNameA
#define GetLongPathNameW xxxGetLongPathNameW
//
// Imagehlp functions.
//
#define ImageNtHeader xxxImageNtHeader
#define ImageDirectoryEntryToData xxxImageDirectoryEntryToData
//
// For Win9x support
//
wchar_t * __cdecl xxx_wcscpy( wchar_t * dst, const wchar_t * src ); LPWSTR WINAPI xxx_lstrcpynW( OUT LPWSTR lpString1, IN LPCWSTR lpString2, IN int iMaxLength );
size_t __cdecl xxx_wcslen ( const wchar_t * wcs );
#define wcslen xxx_wcslen
#define strlenW xxx_wcslen
#define lstrlenW xxx_wcslen
#define wcscpy xxx_wcscpy
#define strcpyW xxx_wcscpy
#define lstrcpyW xxx_wcscpy
#define lstrcpynW xxx_lstrcpynW
#endif //!X86
|