|
|
/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
ia64bt.h
Abstract: Header for calling IA32 Execution layer if it exists Author:
22-Aug-2000 v-cspira (charles spirakis)
--*/
#ifndef _BINTRANS_INCLUDE
#define _BINTRANS_INCLUDE
#ifdef __cplusplus
extern "C" { #endif
//
// Create the typedefs for the functions we can import from the IA32 Execution
// layer. These functions are duplicates of the wow64cpu export list for both
// what they do and the parameters they take. Any changes to the wow64cpu
// list should also update these typedefs
//
//
// Cache manipulation functions and Dll notification
//
typedef VOID (*PFNCPUFLUSHINSTRUCTIONCACHE)( HANDLE ProcessHandle, PVOID BaseAddress, ULONG Length, WOW64_FLUSH_REASON Reason ); typedef VOID (*PFNCPUNOTIFYDLLLOAD)( LPWSTR DllName, PVOID DllBase, ULONG DllSize ); typedef VOID (*PFNCPUNOTIFYDLLUNLOAD)( PVOID DllBase );
//
// Init and term APIs
//
typedef NTSTATUS (*PFNCPUPROCESSINIT)(PWSTR pImageName, PSIZE_T pCpuThreadDataSize); typedef NTSTATUS (*PFNCPUPROCESSTERM)(HANDLE ProcessHandle); typedef NTSTATUS (*PFNCPUTHREADINIT)(PVOID pPerThreadData); typedef NTSTATUS (*PFNCPUTHREADTERM)(VOID);
//
// Execution
//
typedef VOID (*PFNCPUSIMULATE)(VOID);
//
// Exception handling, context manipulation
//
typedef VOID (*PFNCPURESETTOCONSISTENTSTATE)(PEXCEPTION_POINTERS pExecptionPointers); typedef ULONG (*PFNCPUGETSTACKPOINTER)(VOID); typedef VOID (*PFNCPUSETSTACKPOINTER)(ULONG Value); typedef VOID (*PFNCPUSETINSTRUCTIONPOINTER)(ULONG Value); typedef VOID (*PFNCPUSETFLOATINGPOINT)(VOID);
typedef NTSTATUS (*PFNCPUSUSPENDTHREAD)( IN HANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PTEB Teb, OUT PULONG PreviousSuspendCount OPTIONAL);
typedef NTSTATUS (*PFNCPUGETCONTEXT)( IN HANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PTEB Teb, OUT PCONTEXT32 Context);
typedef NTSTATUS (*PFNCPUSETCONTEXT)( IN HANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PTEB Teb, PCONTEXT32 Context);
typedef BOOLEAN (*PFNCPUPROCESSDEBUGEVENT)(IN LPDEBUG_EVENT DebugEvent);
//
// Need the entry point names as well
// This is what needs to be exported from the binary translation dll
// The LdrGetProcedureAddress() uses Ansi, so these are ansi too
//
// NOTE: the order of these strings must match the order
// of the corresponding functions in the _bintrans structure below
//
PUCHAR BtImportList[] = { "BTCpuProcessInit", "BTCpuProcessTerm", "BTCpuThreadInit", "BTCpuThreadTerm", "BTCpuSimulate", "BTCpuGetStackPointer", "BTCpuSetStackPointer", "BTCpuSetInstructionPointer", "BTCpuResetFloatingPoint", "BTCpuSuspendThread", "BTCpuGetContext", "BTCpuSetContext", "BTCpuResetToConsistentState", "BTCpuFlushInstructionCache", "BTCpuNotifyDllLoad", "BTCpuNotifyDllUnload", "BTCpuProcessDebugEvent" };
//
// NOTE: The order of entries in this structure MUST match the
// order of entries listed above. This structure gets cast
// into a PVOID struction to be filled in and we iterate though the
// names above to do it...
//
typedef struct _bintrans { PFNCPUPROCESSINIT BtProcessInit; PFNCPUPROCESSTERM BtProcessTerm; PFNCPUTHREADINIT BtThreadInit; PFNCPUTHREADTERM BtThreadTerm;
PFNCPUSIMULATE BtSimulate;
PFNCPUGETSTACKPOINTER BtGetStack; PFNCPUSETSTACKPOINTER BtSetStack; PFNCPUSETINSTRUCTIONPOINTER BtSetEip; PFNCPUSETFLOATINGPOINT BtResetFP;
PFNCPUSUSPENDTHREAD BtSuspend; PFNCPUGETCONTEXT BtGetContext; PFNCPUSETCONTEXT BtSetContext;
PFNCPURESETTOCONSISTENTSTATE BtReset;
PFNCPUFLUSHINSTRUCTIONCACHE BtFlush; PFNCPUNOTIFYDLLLOAD BtDllLoad; PFNCPUNOTIFYDLLUNLOAD BtDllUnload;
PFNCPUPROCESSDEBUGEVENT BtProcessDebugEvent;
} BINTRANS;
//
// The binary translator is enabled by 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.
//
// The path must be specified and is used to load the dll. Thus, the dll can
// actually have any name as long as the path is right and the export list
// is correct.
//
// Individual apps can be listed here with a DWORD subkey. A
// value of 1 says use btrans, and a value of 0 says don't. No value says
// use the global enable/disable to decide
//
//
//
#define BTKEY_SUBKEY L"Software\\Microsoft\\Wow64\\IA32Exec"
#define BTKEY_MACHINE_SUBKEY L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\IA32Exec"
#define BTKEY_ENABLE L"Enable"
#define BTKEY_PATH L"Path"
#ifdef __cplusplus
} #endif
#endif //_BINTRANS_INCLUDE
|