windows-nt/Source/XPSP1/NT/base/mvdm/wow32/wwmman.c
2020-09-26 16:20:57 +08:00

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