|
|
/*++
* * WOW v1.0 * * Copyright (c) 1991, 1992, 1993 Microsoft Corporation * * WOWTBL.C * WOW32 API thunks * * The reason for having one huge table is so the thunks can be dispatched * faster. When in separate tables, you had to do shifting and * multiplication to derive the thunk routine from the function ID. * * * History: * barry bradie (barryb) 1-dec-92 combined individual tables --*/ #include "precomp.h"
#pragma hdrstop
#ifdef FE_IME
#include "winnls32.h"
#include "wownls.h"
#include "wnman.h"
#endif // FE_IME
#ifdef FE_SB // suports WIFE API (MiscGetEUDCLeadByteRange)
#include "wowwife.h"
#include "wwmman.h"
#endif // FE_SB
#include "wowit.h"
MODNAME(wowtbl.c);
//
// DON'T CHANGE THE ORDER IN WHICH THESE FILES ARE INCLUDED!
//
// see W32GetTableOffsets (wow32.c) and kernel31\kdata.asm
//
W32 aw32WOW[] = {
#include "wktbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wutbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wgtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wkbdtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wstbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wshtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wwstbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wthtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wmmtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)},
#include "wcmdgtbl.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)}, #ifdef FE_SB
#ifdef FE_IME
#include "wntbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)}, #endif // FE_IME
#include "wwmtbl2.h"
{W32FUN((LPFNW32)-1, "TABLESEPARATOR", 0, 0)}, #endif // !FE_SB
};
TABLEOFFSETS tableoffsets;
// REMOVECODE Remove comments below before shipping NT 5. See Also WOW32Unimplemented95API in wow32.c and wowtbl.h
// #ifdef DEBUG_OR_WOWPROFILE
INT cAPIThunks; // #endif
#ifdef WOWPROFILE
PW32 pawThunkTable = aw32WOW; #endif
VOID InitThunkTableOffsets(VOID) { WORD current; WORD offsetarray[(MOD_LAST - MOD_KERNEL) / FUN_MASK + 1]; UINT i;
for (current = 0; current < sizeof(aw32WOW)/sizeof(aw32WOW[0]); current++) { if (current == 0) { i = 0; offsetarray[i++] = current; } else if (aw32WOW[current].lpfnW32 == (LPFNW32)-1) { offsetarray[i++] = current + 1; }
} tableoffsets.kernel = tableoffsets.dkernel = offsetarray[MOD_KERNEL / FUN_MASK]; tableoffsets.user = tableoffsets.duser = offsetarray[MOD_USER / FUN_MASK]; tableoffsets.gdi = tableoffsets.dgdi = offsetarray[MOD_GDI / FUN_MASK]; tableoffsets.keyboard = offsetarray[MOD_KEYBOARD / FUN_MASK]; tableoffsets.sound = offsetarray[MOD_SOUND / FUN_MASK]; tableoffsets.shell = offsetarray[MOD_SHELL / FUN_MASK]; tableoffsets.winsock = offsetarray[MOD_WINSOCK / FUN_MASK]; tableoffsets.toolhelp = offsetarray[MOD_TOOLHELP / FUN_MASK]; tableoffsets.mmedia = offsetarray[MOD_MMEDIA / FUN_MASK]; tableoffsets.commdlg = offsetarray[MOD_COMMDLG / FUN_MASK]; #ifdef FE_IME
tableoffsets.winnls = offsetarray[MOD_WINNLS / FUN_MASK]; #endif // FE_IME
#ifdef FE_SB
tableoffsets.wifeman = offsetarray[MOD_WIFEMAN / FUN_MASK]; #endif // FE_SB
#ifdef DEBUG_OR_WOWPROFILE
cAPIThunks = sizeof(aw32WOW) / sizeof(aw32WOW[0]); #endif
}
#ifdef DEBUG_OR_WOWPROFILE
INT ModFromCallID(INT iFun) { PTABLEOFFSETS pto = &tableoffsets;
if (iFun < pto->user) return MOD_KERNEL;
if (iFun < pto->gdi) return MOD_USER;
if (iFun < pto->keyboard) return MOD_GDI;
if (iFun < pto->sound) return MOD_KEYBOARD;
if (iFun < pto->shell) return MOD_SOUND;
if (iFun < pto->winsock) return MOD_SHELL;
if (iFun < pto->toolhelp) return MOD_WINSOCK;
if (iFun < pto->mmedia) return MOD_TOOLHELP;
if (iFun < pto->commdlg) { return(MOD_MMEDIA); }
#if defined(FE_SB)
#if defined(FE_IME)
if (iFun < pto->winnls) return MOD_COMMDLG; if (iFun < pto->wifeman) return MOD_WINNLS; if (iFun < cAPIThunks) return MOD_WIFEMAN; #else
if (iFun < pto->wifeman) return MOD_COMMDLG; if (iFun < cAPIThunks) return MOD_WIFEMAN; #endif
#elif defined(FE_IME)
if (iFun < pto->winnls) return MOD_COMMDLG; if (iFun < cAPIThunks) return MOD_WINNLS; #else
if (iFun < cAPIThunks) return MOD_COMMDLG; #endif
return -1; }
PSZ apszModNames[] = { "Kernel", "User", "Gdi", "Keyboard", "Sound", "Shell", "Winsock", "Toolhelp", "MMedia", "Commdlg" #ifdef FE_IME
,"WinNLS" #endif
#ifdef FE_SB
,"WifeMan" #endif
};
INT nModNames = NUMEL(apszModNames);
PSZ GetModName(INT iFun) { INT nMod;
nMod = ModFromCallID(iFun);
if (nMod == -1) { return "BOGUS!!"; }
nMod = nMod >> 12; // get the value into the low byte
return apszModNames[nMod];
}
INT GetOrdinal(INT iFun) { INT nMod;
nMod = ModFromCallID(iFun);
if (nMod == -1) { return 0; }
return (iFun - TableOffsetFromName(apszModNames[nMod >> 12]));
}
INT TableOffsetFromName(PSZ szTab) { INT i; PTABLEOFFSETS pto = &tableoffsets;
for (i = 0; i < NUMEL(apszModNames); i++) { if (!WOW32_strcmp(szTab, apszModNames[i])) break; }
if (i >= NUMEL(apszModNames)) return 0;
switch (i << 12) {
case MOD_KERNEL: return pto->kernel;
case MOD_USER: return pto->user;
case MOD_DGDI: return pto->gdi;
case MOD_KEYBOARD: return pto->keyboard; case MOD_SOUND: return pto->sound;
case MOD_SHELL: return pto->shell;
case MOD_WINSOCK: return pto->winsock;
case MOD_TOOLHELP: return pto->toolhelp;
case MOD_MMEDIA: return pto->mmedia;
case MOD_COMMDLG: return(pto->commdlg);
#ifdef FE_IME
case MOD_WINNLS: return pto->winnls; #endif
#ifdef FE_SB
case MOD_WIFEMAN: return pto->wifeman; #endif
default: return(-1); }
}
#endif
|