171 lines
3.5 KiB
C
171 lines
3.5 KiB
C
|
/*++
|
||
|
*
|
||
|
* WOW v1.0
|
||
|
*
|
||
|
* Copyright (c) 1994, Microsoft Corporation
|
||
|
*
|
||
|
* WWMMAN.C
|
||
|
* WOW32 16-bit WifeMan API support (manually-coded thunks)
|
||
|
*
|
||
|
* History:
|
||
|
* Created 17-May-1994 by hiroh
|
||
|
* Rewrote 12-May-1995 by hideyukn
|
||
|
*
|
||
|
--*/
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#ifdef FE_SB
|
||
|
|
||
|
#include "wowwife.h"
|
||
|
#include "wwmman.h"
|
||
|
|
||
|
MODNAME(wwmman.c);
|
||
|
|
||
|
STATIC LPSTR SkipSpaces(LPSTR lpch)
|
||
|
{
|
||
|
if (lpch == NULL) return(NULL);
|
||
|
|
||
|
for ( ; ; lpch++ ) {
|
||
|
switch (*lpch) {
|
||
|
case ' ':
|
||
|
case '\t':
|
||
|
case '\r':
|
||
|
case '\n':
|
||
|
break;
|
||
|
|
||
|
case '\0':
|
||
|
// fall through...
|
||
|
default:
|
||
|
return(lpch);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define EUDC_RANGE_KEY \
|
||
|
(LPSTR) "SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage\\EUDCCodeRange"
|
||
|
|
||
|
ULONG FASTCALL WWM32MiscGetEUDCLeadByteRange(PVDMFRAME pFrame)
|
||
|
{
|
||
|
unsigned short usEUDCRange = 0;
|
||
|
unsigned char chEUDCStart = 0, chEUDCEnd = 0;
|
||
|
|
||
|
HKEY hKey;
|
||
|
ULONG ulRet;
|
||
|
CHAR achACP[10];
|
||
|
CHAR achRange[256];
|
||
|
|
||
|
DWORD dwType;
|
||
|
DWORD dwRangeSize = sizeof(achRange);
|
||
|
|
||
|
UNREFERENCED_PARAMETER(pFrame);
|
||
|
|
||
|
//
|
||
|
// Get EUDC Range
|
||
|
//
|
||
|
// In Win32, We support multiple EUDC Range, but for
|
||
|
// Win16, we just return only first EUDC range to
|
||
|
// keep backward compatibility...
|
||
|
//
|
||
|
|
||
|
ulRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, EUDC_RANGE_KEY,
|
||
|
(DWORD) 0, KEY_QUERY_VALUE, &hKey);
|
||
|
|
||
|
if (ulRet != ERROR_SUCCESS) {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:RegOpenKeyExA(EUDC_RANGE_KEY) fail\n"));
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Convert ACP to string..
|
||
|
//
|
||
|
RtlIntegerToChar(GetACP(),10,sizeof(achACP),achACP);
|
||
|
|
||
|
ulRet = RegQueryValueExA(hKey, achACP, (LPDWORD)NULL, (LPDWORD)&dwType,
|
||
|
(LPBYTE)achRange, &dwRangeSize);
|
||
|
|
||
|
if (ulRet != ERROR_SUCCESS) {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:RegQueryValueExA(CP_ACP) fail\n"));
|
||
|
#endif
|
||
|
RegCloseKey(hKey);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
//
|
||
|
// Perse the data.
|
||
|
//
|
||
|
{
|
||
|
LPSTR pszData = achRange;
|
||
|
USHORT usStart, usEnd;
|
||
|
|
||
|
pszData = SkipSpaces(pszData);
|
||
|
|
||
|
if ((*pszData) == '\0') {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:Parse First Data fail\n"));
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
usStart = (USHORT)strtoul(pszData,&pszData,16);
|
||
|
|
||
|
if ((pszData = WOW32_strchr(pszData,'-')) == NULL) {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:Find End Data fail\n"));
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Skip '-'..
|
||
|
//
|
||
|
pszData++;
|
||
|
|
||
|
pszData = SkipSpaces(pszData);
|
||
|
|
||
|
if ((*pszData) == '\0') {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:Parse End Data fail\n"));
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
usEnd = (USHORT)strtoul(pszData,&pszData,16);
|
||
|
|
||
|
//
|
||
|
// Confirm the data sort order is correct
|
||
|
//
|
||
|
if (usStart > usEnd) {
|
||
|
#if DBG
|
||
|
LOGDEBUG(0,("WOW32:Invalid EUDC Range Order\n"));
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get EUDC Start, End LeadByte...
|
||
|
//
|
||
|
chEUDCStart = HIBYTE(usStart);
|
||
|
chEUDCEnd = HIBYTE(usEnd);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Setup return value.
|
||
|
//
|
||
|
|
||
|
usEUDCRange = ((unsigned short)chEUDCEnd << 8) |
|
||
|
((unsigned short)chEUDCStart );
|
||
|
|
||
|
#if DBG
|
||
|
LOGDEBUG(10,("WOW32:EUDC Range = %x\n",usEUDCRange));
|
||
|
#endif
|
||
|
|
||
|
RETURN(usEUDCRange);
|
||
|
}
|
||
|
#endif // FE_SB
|