/************************************************************************
*                                                                       *
*   wx86dll.h -- This module defines Wx86 APIs for x86 emulation        *
*                                                                       *
*   Copyright (c) 1990-1999, Microsoft Corp. All rights reserved.       *
*                                                                       *
************************************************************************/
#ifndef _WX86DLL_
#define _WX86DLL_

#if _MSC_VER > 1000
#pragma once
#endif

#if !defined(_WX86DLLAPI_)
#define WX86DLLAPI DECLSPEC_IMPORT
#else
#define WX86DLLAPI
#endif


#ifdef __cplusplus
extern "C" {
#endif


typedef struct _BopInstr {
    BYTE    Instr1;         // 0xc4c4 - the x86 BOP instruction
    BYTE    Instr2;
    BYTE    BopNum;
    BYTE    Flags;
    USHORT  ApiNum;
    BYTE    RetSize;
    BYTE    ArgSize;
} BOPINSTR;
typedef UNALIGNED BOPINSTR * PBOPINSTR;


typedef
BOOL
(*WX86OFLYINITIALIZE_ROUTINE)(
    VOID
    );

WX86DLLAPI
BOOL
Wx86OFlyInitialize(
    VOID
    );

WX86DLLAPI
HMODULE
Wx86LoadX86Dll(
    LPCWSTR lpLibFileName,
    DWORD   dwFlags
    );

typedef
HMODULE
(*WX86LOADX86DLL_ROUTINE)(
  LPCWSTR lpLibFileName,
  DWORD   dwFlags
  );

WX86DLLAPI
HMODULE
Wx86GetX86DllHandle(
    LPCWSTR lpLibFileName
    );

typedef
HMODULE
(*WX86GETX86DLLHANDLE_ROUTINE)(
  LPCWSTR lpLibFileName
  );

WX86DLLAPI
BOOL
Wx86FreeX86Dll(
    HMODULE hMod
    );

typedef
BOOL
(*WX86FREEX86Dll_ROUTINE)(
    HMODULE hMod
    );

WX86DLLAPI
BOOL
Wx86Compact(
    VOID
    );

typedef
BOOL
(*WX86COMPACT_ROUTINE)(
    VOID
    );

WX86DLLAPI
PVOID
Wx86ThunkProc(
    PVOID pvAddress,
    PVOID pvCBDispatch,
    BOOL  fNativeToX86
    );

WX86DLLAPI
PVOID
Wx86DualThunkProc(
    PVOID pvAddress,
    PVOID pvCBDispatch,
    BOOL  fNativeToX86
    );

typedef
PVOID
(*WX86THUNKPROC_ROUTINE)(
  PVOID pvAddress,
  PVOID pvCBDispatch,
  BOOL  fNativeToX86
  );

typedef
ULONG
(*X86TONATIVETHUNKPROC)(
    PVOID  pvNativeAddress,
    PULONG pBaseArgs,
    PULONG pArgCount
    );

WX86DLLAPI
ULONG
Wx86ThunkEmulateX86(
    ULONG  nParameters,
    PULONG Parameters
    );

typedef
ULONG
(*WX86THUNKEMULATEX86)(
    ULONG  nParameters,
    PULONG Parameters
    );

WX86DLLAPI
ULONG
Wx86EmulateX86(
    PVOID  StartAddress,
    ULONG  nParameters,
    PULONG Parameters
    );

typedef
ULONG
(*WX86EMULATEX86)(
    PVOID  StartAddress,
    ULONG  nParameters,
    PULONG Parameters
    );

WX86DLLAPI
IUnknown *
Wx86ThunkInterface(
    IUnknown *punk,
    IID *piid,
    BOOLEAN fOutParameter,
    BOOLEAN fNativeToX86
    );

typedef
IUnknown *
(*WX86THUNKINTERFACE)(
    IUnknown *punk,
    IID *piid,
    BOOL  fOutParameter,
    BOOL  fNativeToX86
    );

WX86DLLAPI
void
Wx86CheckFreeTempProxy(
    IUnknown *punk
    );

typedef
void
(*WX86CHECKFREETEMPPROXY)(
    IUnknown *punk
    );

WX86DLLAPI
IUnknown *
Wx86ResolveProxy(
    IUnknown *punk,
    BOOLEAN fNativeToX86);

typedef
IUnknown *
(*WX86RESOLVEPROXY)(
    IUnknown *punk,
    BOOLEAN fNativeToX86);

WX86DLLAPI
ULONG
Wx86ProxyAddRef(IUnknown* punk);

typedef
ULONG
(*WX86PROXYADDREF)(
    IUnknown *punk);


WX86DLLAPI
ULONG
Wx86ProxyRelease(IUnknown* punk);

typedef
ULONG
(*WX86PROXYRELEASE)(
    IUnknown *punk);

WX86DLLAPI
HRESULT
Wx86DllGetClassObjectThunk(
    IID *piid,
    LPVOID *ppv,
    HRESULT hr,
    BOOLEAN fNativetoX86);

typedef
HRESULT
(*WX86DLLGETCLASSOBJECTTHUNK)(
    IID *piid,
    LPVOID *ppv,
    HRESULT hr,
    BOOLEAN fNativetoX86);

WX86DLLAPI
PVOID *
Wx86InitializeOle(
    VOID
    );

typedef
PVOID *
(*W86INITIALIZEOLE)(
    VOID
    );

WX86DLLAPI
void
Wx86DeinitializeOle(
    VOID
    );

VOID
WX86DEINITIALIZEOLE(
    VOID
    );


WX86DLLAPI
LONG
Wx86RegCreateKeyA(
    HKEY hKey,
    LPCSTR lpSubKey,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegCreateKeyW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegCreateKeyExA(
    HKEY hKey,
    LPCSTR lpSubKey,
    DWORD Reserved,
    LPSTR lpClass,
    DWORD dwOptions,
    REGSAM samDesired,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    PHKEY phkResult,
    LPDWORD lpdwDisposition
    );

WX86DLLAPI
LONG
Wx86RegCreateKeyExW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    DWORD Reserved,
    LPWSTR lpClass,
    DWORD dwOptions,
    REGSAM samDesired,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    PHKEY phkResult,
    LPDWORD lpdwDisposition
    );

WX86DLLAPI
LONG
Wx86RegDeleteKeyA(
    HKEY hKey,
    LPCSTR lpKeyName
    );

WX86DLLAPI
LONG
Wx86RegDeleteKeyW(
    HKEY hKey,
    LPCWSTR lpKeyName
    );

WX86DLLAPI
LONG
Wx86RegEnumKeyA(
    HKEY hKey,
    DWORD dwIndex,
    LPSTR lpName,
    DWORD cbName
    );

WX86DLLAPI
LONG
Wx86RegEnumKeyW(
    HKEY hKey,
    DWORD dwIndex,
    LPWSTR lpName,
    DWORD cbName
    );

WX86DLLAPI
LONG
Wx86RegEnumKeyExA(
    HKEY hKey,
    DWORD dwIndex,
    LPSTR lpName,
    LPDWORD lpcbName,
    LPDWORD  lpReserved,
    LPSTR lpClass,
    LPDWORD lpcbClass,
    PFILETIME lpftLastWriteTime
    );

WX86DLLAPI
LONG
Wx86RegEnumKeyExW(
    HKEY hKey,
    DWORD dwIndex,
    LPWSTR lpName,
    LPDWORD lpcbName,
    LPDWORD  lpReserved,
    LPWSTR lpClass,
    LPDWORD lpcbClass,
    PFILETIME lpftLastWriteTime
    );

WX86DLLAPI
LONG
Wx86RegOpenKeyA(
    HKEY hKey,
    LPCSTR lpSubKey,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegOpenKeyW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegOpenKeyExA(
    HKEY hKey,
    LPCSTR lpSubKey,
    DWORD dwOptions,
    REGSAM samDesired,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegOpenKeyExW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    DWORD dwOptions,
    REGSAM samDesired,
    PHKEY phkResult
    );

WX86DLLAPI
LONG
Wx86RegQueryValueA(
    HKEY hKey,
    LPCSTR lpSubKey,
    LPSTR lpData,
    PLONG lpcbData
    );

WX86DLLAPI
LONG
Wx86RegQueryValueW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    LPWSTR lpData,
    PLONG  lpcbData
    );

WX86DLLAPI
LONG
Wx86RegQueryValueExA(
    HKEY hKey,
    LPCSTR lpValueName,
    LPDWORD lpReserved,
    LPDWORD lpdwType,
    LPBYTE lpData,
    LPDWORD lpcbData
    );

WX86DLLAPI
LONG
Wx86RegQueryValueExW(
    HKEY hKey,
    LPCWSTR lpValueName,
    LPDWORD lpReserved,
    LPDWORD lpdwType,
    LPBYTE lpData,
    LPDWORD lpcbData
    );

WX86DLLAPI
LONG
Wx86RegSetValueA(
    HKEY hKey,
    LPCSTR lpSubKey,
    DWORD dwType,
    LPCSTR lpData,
    DWORD cbData
    );

WX86DLLAPI
LONG
Wx86RegSetValueW(
    HKEY hKey,
    LPCWSTR lpSubKey,
    DWORD dwType,
    LPCWSTR lpData,
    DWORD cbData
    );

WX86DLLAPI
LONG
Wx86RegSetValueExA(
    HKEY hKey,
    LPCSTR lpValueName,
    DWORD Reserved,
    DWORD dwType,
    CONST BYTE* lpData,
    DWORD cbData
    );

WX86DLLAPI
LONG
Wx86RegSetValueExW(
    HKEY hKey,
    LPCWSTR lpValueName,
    DWORD Reserved,
    DWORD dwType,
    CONST BYTE* lpData,
    DWORD cbData
    );

WX86DLLAPI
LONG
Wx86RegDeleteValueA(
    HKEY hKey,
    LPCSTR lpValueName
    );

WX86DLLAPI
LONG
Wx86RegDeleteValueW(
    HKEY hKey,
    LPCWSTR lpValueName
    );

WX86DLLAPI
LONG
Wx86RegEnumValueA(
    HKEY hKey,
    DWORD dwIndex,
    LPSTR lpValueName,
    LPDWORD lpcbValueName,
    LPDWORD  lpReserved,
    LPDWORD lpType,
    LPBYTE lpData,
    LPDWORD lpcbData
    );

WX86DLLAPI
LONG
Wx86RegEnumValueW(
    HKEY hKey,
    DWORD dwIndex,
    LPWSTR lpValueName,
    LPDWORD lpcbValueName,
    LPDWORD lpReserved,
    LPDWORD lpType,
    LPBYTE lpData,
    LPDWORD lpcbData
    );

WX86DLLAPI
LONG
Wx86RegQueryMultipleValuesA(
    HKEY hKey,
    PVALENTA val_list,
    DWORD num_vals,
    LPSTR lpValueBuf,
    LPDWORD ldwTotsize
    );

WX86DLLAPI
LONG
Wx86RegQueryMultipleValuesW(
    HKEY hKey,
    PVALENTW val_list,
    DWORD num_vals,
    LPWSTR lpValueBuf,
    LPDWORD ldwTotsize
    );

WX86DLLAPI
LONG
Wx86RegCloseKey(
    HKEY hKey
    );

#ifdef UNICODE

#define Wx86RegCreateKey            Wx86RegCreateKeyA
#define Wx86RegCreateKeyEx          Wx86RegCreateKeyExA
#define Wx86RegDeleteKey            Wx86RegDeleteKeyA
#define Wx86RegEnumKey              Wx86RegEnumKeyA
#define Wx86RegEnumKeyEx            Wx86RegEnumKeyExA
#define Wx86RegOpenKey              Wx86RegOpenKeyA
#define Wx86RegOpenKeyEx            Wx86RegOpenKeyExA
#define Wx86RegQueryValue           Wx86RegQueryValueA
#define Wx86RegQueryValueEx         Wx86RegQueryValueExA
#define Wx86RegSetValue             Wx86RegSetValueA
#define Wx86RegSetValueEx           Wx86RegSetValueExA
#define Wx86RegDeleteValue          Wx86RegDeleteValueA
#define Wx86RegEnumValue            Wx86RegEnumValueA
#define Wx86RegQueryMultipleValues  Wx86RegQueryMultipleValuesA

#else

#define Wx86RegCreateKey            Wx86RegCreateKeyW
#define Wx86RegCreateKeyEx          Wx86RegCreateKeyExW
#define Wx86RegDeleteKey            Wx86RegDeleteKeyW
#define Wx86RegEnumKey              Wx86RegEnumKeyW
#define Wx86RegEnumKeyEx            Wx86RegEnumKeyExW
#define Wx86RegOpenKey              Wx86RegOpenKeyW
#define Wx86RegOpenKeyEx            Wx86RegOpenKeyExW
#define Wx86RegQueryValue           Wx86RegQueryValueW
#define Wx86RegQueryValueEx         Wx86RegQueryValueExW
#define Wx86RegSetValue             Wx86RegSetValueW
#define Wx86RegSetValueEx           Wx86RegSetValueExW
#define Wx86RegDeleteValue          Wx86RegDeleteValueW
#define Wx86RegEnumValue            Wx86RegEnumValueW
#define Wx86RegQueryMultipleValues  Wx86RegQueryMultipleValuesW

#endif

#ifdef __cplusplus
}
#endif


#endif // _WX86DLL_