You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.0 KiB
190 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1998-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
wow64cpu.h
|
|
|
|
Abstract:
|
|
|
|
Public header for wow64.dll
|
|
|
|
Author:
|
|
|
|
24-May-1998 BarryBo
|
|
|
|
Revision History:
|
|
8-9-99 [askhalid] added CpuNotifyDllLoad and CpuNotifyDllUnload.
|
|
|
|
--*/
|
|
|
|
#ifndef _WOW64CPU_INCLUDE
|
|
#define _WOW64CPU_INCLUDE
|
|
|
|
#include <windows.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// Make wow64cpu.dll exports __declspec(dllimport) when this header is included
|
|
// by non-wow64cpu components
|
|
//
|
|
#if !defined(_WOW64CPUAPI_)
|
|
#define WOW64CPUAPI DECLSPEC_IMPORT
|
|
#else
|
|
#define WOW64CPUAPI
|
|
#endif
|
|
|
|
#if !defined(_WOW64CPUDBGAPI_)
|
|
#define WOW64CPUDBGAPI DECLSPEC_IMPORT
|
|
#else
|
|
#define WOW64CPUDBGAPI
|
|
#endif
|
|
|
|
|
|
typedef enum {
|
|
WOW64_FLUSH_FORCE,
|
|
WOW64_FLUSH_FREE,
|
|
WOW64_FLUSH_ALLOC,
|
|
WOW64_FLUSH_PROTECT
|
|
} WOW64_FLUSH_REASON;
|
|
|
|
//
|
|
// Cache manipulation functions and Dll notification
|
|
//
|
|
WOW64CPUAPI VOID CpuFlushInstructionCache ( HANDLE ProcessHandle, PVOID BaseAddress, ULONG Length, WOW64_FLUSH_REASON Reason);
|
|
WOW64CPUAPI VOID CpuNotifyDllLoad ( LPWSTR DllName, PVOID DllBase, ULONG DllSize );
|
|
WOW64CPUAPI VOID CpuNotifyDllUnload ( PVOID DllBase );
|
|
|
|
|
|
//
|
|
// Init and term APIs
|
|
//
|
|
WOW64CPUAPI NTSTATUS CpuProcessInit(PWSTR pImageName, PSIZE_T pCpuThreadDataSize);
|
|
WOW64CPUAPI NTSTATUS CpuProcessTerm(HANDLE ProcessHandle);
|
|
WOW64CPUAPI NTSTATUS CpuThreadInit(PVOID pPerThreadData);
|
|
WOW64CPUAPI NTSTATUS CpuThreadTerm(VOID);
|
|
|
|
|
|
|
|
|
|
//
|
|
// Execution
|
|
//
|
|
WOW64CPUAPI VOID CpuSimulate(VOID);
|
|
|
|
//
|
|
// Exception handling, context manipulation
|
|
//
|
|
WOW64CPUAPI VOID CpuResetToConsistentState(PEXCEPTION_POINTERS pExecptionPointers);
|
|
WOW64CPUAPI ULONG CpuGetStackPointer(VOID);
|
|
WOW64CPUAPI VOID CpuSetStackPointer(ULONG Value);
|
|
WOW64CPUAPI VOID CpuSetInstructionPointer(ULONG Value);
|
|
WOW64CPUAPI VOID CpuResetFloatingPoint(VOID);
|
|
|
|
WOW64CPUAPI
|
|
NTSTATUS
|
|
CpuSuspendThread(
|
|
IN HANDLE ThreadHandle,
|
|
IN HANDLE ProcessHandle,
|
|
IN PTEB Teb,
|
|
OUT PULONG PreviousSuspendCount OPTIONAL);
|
|
|
|
WOW64CPUAPI
|
|
NTSTATUS
|
|
CpuGetContext(
|
|
IN HANDLE ThreadHandle,
|
|
IN HANDLE ProcessHandle,
|
|
IN PTEB Teb,
|
|
OUT PCONTEXT32 Context);
|
|
|
|
WOW64CPUAPI
|
|
NTSTATUS
|
|
CpuSetContext(
|
|
IN HANDLE ThreadHandle,
|
|
IN HANDLE ProcessHandle,
|
|
IN PTEB Teb,
|
|
PCONTEXT32 Context);
|
|
|
|
WOW64CPUAPI
|
|
BOOLEAN
|
|
CpuProcessDebugEvent(
|
|
IN LPDEBUG_EVENT DebugEvent);
|
|
|
|
|
|
#if defined(DECLARE_CPU_DEBUGGER_INTERFACE)
|
|
//
|
|
// APIs required to be exported from a CPU debugger extension DLL. The
|
|
// extension DLL may also export other NTSD extension exports which
|
|
// may be called directly from NTSD. The APIs below are called from
|
|
// wow64exts.dll as worker routines to help the common debugging code.
|
|
//
|
|
// The CPU extension DLL must be named w64cpuex.dll.
|
|
//
|
|
typedef PVOID (*PWOW64GETCPUDATA)(HANDLE hProcess, HANDLE hThread);
|
|
|
|
WOW64CPUDBGAPI VOID CpuDbgInitEngapi(PWOW64GETCPUDATA lpGetCpuData);
|
|
WOW64CPUDBGAPI BOOL CpuDbgGetRemoteContext(PDEBUG_CLIENT Client, PVOID CpuData);
|
|
WOW64CPUDBGAPI BOOL CpuDbgSetRemoteContext(PDEBUG_CLIENT Client); // push local context back remote
|
|
WOW64CPUDBGAPI BOOL CpuDbgGetLocalContext(PDEBUG_CLIENT Client, PCONTEXT32 Context); // fetch context from the cache
|
|
WOW64CPUDBGAPI BOOL CpuDbgSetLocalContext(PDEBUG_CLIENT Client, PCONTEXT32 Context); // push context to the cache
|
|
WOW64CPUDBGAPI VOID CpuDbgFlushInstructionCache(PDEBUG_CLIENT Client, PVOID Addr, DWORD Length);
|
|
WOW64CPUDBGAPI VOID CpuDbgFlushInstructionCacheWithHandle(HANDLE Process,PVOID Addr,DWORD Length);
|
|
|
|
typedef struct tagCpuRegFuncs {
|
|
LPCSTR RegName;
|
|
void (*SetReg)(ULONG);
|
|
ULONG (*GetReg)(VOID);
|
|
} CPUREGFUNCS, *PCPUREGFUNCS;
|
|
|
|
WOW64CPUDBGAPI PCPUREGFUNCS CpuDbgGetRegisterFuncs(void);
|
|
#endif // DECLARE_CPU_DEBUGGER_INTERFACE
|
|
|
|
#if defined(WOW64_HISTORY)
|
|
|
|
//
|
|
// The service history is enabled via a key in the registry.
|
|
//
|
|
// The key is in HKLM, and there are subkeys for enabling (1)
|
|
//
|
|
// No subkey area and/or no enable key means don't use the binary translator.
|
|
//
|
|
// Individual apps can be listed here with a DWORD subkey. A
|
|
// value of 1 says use history, and a value of 0 says don't. No value says
|
|
// use the global enable/disable to decide
|
|
//
|
|
//
|
|
//
|
|
|
|
#define CPUHISTORY_SUBKEY L"Software\\Microsoft\\Wow64\\ServiceHistory"
|
|
#define CPUHISTORY_MACHINE_SUBKEY L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\ServiceHistory"
|
|
#define CPUHISTORY_ENABLE L"Enable"
|
|
#define CPUHISTORY_SIZE L"Size"
|
|
#define CPUHISTORY_MIN_SIZE 5
|
|
|
|
//
|
|
// Args are spelled out this way so the dt command in the debugger will show
|
|
// all args
|
|
//
|
|
|
|
typedef struct _Wow64Service_Buf {
|
|
DWORD Api;
|
|
DWORD RetAddr;
|
|
DWORD Arg0;
|
|
DWORD Arg1;
|
|
DWORD Arg2;
|
|
DWORD Arg3;
|
|
} WOW64SERVICE_BUF, *PWOW64SERVICE_BUF;
|
|
|
|
extern ULONG HistoryLength;
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif //_WOW64CPU_INCLUDE
|