/*++ 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