mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
6.1 KiB
291 lines
6.1 KiB
#include "dvosal.h"
|
|
//#include "osind.h"
|
|
#include "dndbg.h"
|
|
|
|
#define DVOSAL_DEFAULT_CHAR "-"
|
|
|
|
volatile BOOL g_fUnicode;
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_Initialize"
|
|
HRESULT OSAL_Initialize()
|
|
{
|
|
g_fUnicode = OSAL_CheckIsUnicodePlatform();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_DeInitialize"
|
|
HRESULT OSAL_DeInitialize()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_IsUnicodePlatform"
|
|
BOOL OSAL_IsUnicodePlatform()
|
|
{
|
|
return g_fUnicode;
|
|
}
|
|
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_CheckIsUnicodePlatform"
|
|
BOOL OSAL_CheckIsUnicodePlatform()
|
|
{
|
|
OSVERSIONINFOA ver;
|
|
BOOL bReturn = FALSE;
|
|
|
|
|
|
// Clear our structure since it's on the stack
|
|
memset(&ver, 0, sizeof(OSVERSIONINFOA));
|
|
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
|
|
|
|
// Just always call the ANSI function
|
|
if(!GetVersionExA(&ver))
|
|
{
|
|
DPF( DVF_ERRORLEVEL, "Unable to determinte platform -- setting flag to ANSI");
|
|
bReturn = FALSE;
|
|
}
|
|
else
|
|
{
|
|
switch(ver.dwPlatformId)
|
|
{
|
|
case VER_PLATFORM_WIN32_WINDOWS:
|
|
DPF(DVF_ERRORLEVEL, "Platform detected as non-NT -- setting flag to ANSI");
|
|
bReturn = FALSE;
|
|
break;
|
|
|
|
case VER_PLATFORM_WIN32_NT:
|
|
DPF(DVF_ERRORLEVEL, "Platform detected as NT -- setting flag to Unicode");
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
DPF(DVF_ERRORLEVEL, "Unable to determine platform -- setting flag to ANSI");
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Keep the compiler happy
|
|
return bReturn;
|
|
|
|
} // OS_IsUnicodePlatform
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_AllocAndConvertToANSI"
|
|
/*
|
|
** GetAnsiString
|
|
*
|
|
* CALLED BY: Everywhere
|
|
*
|
|
* PARAMETERS: *ppszAnsi - pointer to string
|
|
* lpszWide - string to copy
|
|
*
|
|
* DESCRIPTION: handy utility function
|
|
* allocs space for and converts lpszWide to ansi
|
|
*
|
|
* RETURNS: string length
|
|
*
|
|
*/
|
|
HRESULT OSAL_AllocAndConvertToANSI(LPSTR * ppszAnsi,LPCWSTR lpszWide)
|
|
{
|
|
int iStrLen;
|
|
|
|
DNASSERT(ppszAnsi);
|
|
|
|
if (!lpszWide)
|
|
{
|
|
*ppszAnsi = NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
// call wide to ansi to find out how big +1 for terminating NULL
|
|
iStrLen = OSAL_WideToAnsi(NULL,lpszWide,0) + 1;
|
|
DNASSERT(iStrLen > 0);
|
|
|
|
*ppszAnsi = new char[iStrLen];
|
|
if (!*ppszAnsi)
|
|
{
|
|
DPF(DVF_ERRORLEVEL, "could not get ansi string -- out of memory");
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
OSAL_WideToAnsi(*ppszAnsi,lpszWide,iStrLen);
|
|
|
|
return S_OK;
|
|
} // GetAnsiString
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_WideToAnsi"
|
|
/*
|
|
** WideToAnsi
|
|
*
|
|
* CALLED BY: everywhere
|
|
*
|
|
* PARAMETERS: lpStr - destination string
|
|
* lpWStr - string to convert
|
|
* cchStr - size of dest buffer
|
|
*
|
|
* DESCRIPTION:
|
|
* converts unicode lpWStr to ansi lpStr.
|
|
* fills in unconvertable chars w/ DPLAY_DEFAULT_CHAR "-"
|
|
*
|
|
*
|
|
* RETURNS: if cchStr is 0, returns the size required to hold the string
|
|
* otherwise, returns the number of chars converted
|
|
*
|
|
*/
|
|
int OSAL_WideToAnsi(LPSTR lpStr,LPCWSTR lpWStr,int cchStr)
|
|
{
|
|
int rval;
|
|
//PREFIX: using uninitialized memory 'bDefault', Mill Bug#129165
|
|
// bDefault is passed by reference to WideCharToMultiByte, but we will keep prefix happy
|
|
BOOL bDefault = 0x0;
|
|
|
|
if (!lpWStr && cchStr)
|
|
{
|
|
// can't call us w/ null pointer & non-zero cch
|
|
DNASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
// use the default code page (CP_ACP)
|
|
// -1 indicates WStr must be null terminated
|
|
rval = WideCharToMultiByte(CP_ACP,0,lpWStr,-1,lpStr,cchStr,
|
|
DVOSAL_DEFAULT_CHAR,&bDefault);
|
|
|
|
if (bDefault)
|
|
{
|
|
DPF(DVF_WARNINGLEVEL,"!!! WARNING - used default string in WideToAnsi conversion.!!!");
|
|
DPF(DVF_WARNINGLEVEL,"!!! Possible bad unicode string - (you're not hiding ansi in there are you?) !!! ");
|
|
}
|
|
|
|
return rval;
|
|
|
|
} // WideToAnsi
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "OSAL_AnsiToWide"
|
|
/*
|
|
** AnsiToWide
|
|
*
|
|
* CALLED BY: everywhere
|
|
*
|
|
* PARAMETERS: lpWStr - dest string
|
|
* lpStr - string to convert
|
|
* cchWstr - size of dest buffer
|
|
*
|
|
* DESCRIPTION: converts Ansi lpStr to Unicode lpWstr
|
|
*
|
|
*
|
|
* RETURNS: if cchStr is 0, returns the size required to hold the string
|
|
* otherwise, returns the number of chars converted
|
|
*
|
|
*/
|
|
int OSAL_AnsiToWide(LPWSTR lpWStr,LPCSTR lpStr,int cchWStr)
|
|
{
|
|
int rval;
|
|
|
|
if (!lpStr && cchWStr)
|
|
{
|
|
// can't call us w/ null pointer & non-zero cch
|
|
DNASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
rval = MultiByteToWideChar(CP_ACP,0,lpStr,-1,lpWStr,cchWStr);
|
|
|
|
return rval;
|
|
} // AnsiToWide
|
|
|
|
/*
|
|
** WideToTChar
|
|
*
|
|
* CALLED BY: everywhere
|
|
*
|
|
* PARAMETERS: lpTStr - destination string
|
|
* lpWStr - string to convert
|
|
* cchTStr - size of dest buffer
|
|
*
|
|
* DESCRIPTION:
|
|
* converts unicode lpWStr to TCHAR lpTStr.
|
|
* fills in unconvertable chars w/ DPLAY_DEFAULT_CHAR "-"
|
|
*
|
|
*
|
|
* RETURNS: if cchTStr is 0, returns the size required to hold the string
|
|
* otherwise, returns the number of chars converted
|
|
*
|
|
*/
|
|
int OSAL_WideToTChar(LPTSTR lpTStr,LPCWSTR lpWStr,int cchTStr)
|
|
{
|
|
#if defined(UNICODE)
|
|
// no conversion required, just copy the string over
|
|
if (!lpWStr && cchTStr)
|
|
{
|
|
// can't call us w/ null pointer & non-zero cch
|
|
DNASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
if (cchTStr == 0)
|
|
{
|
|
return (wcslen(lpWStr)+1)*sizeof(TCHAR);
|
|
}
|
|
|
|
wcsncpy(lpTStr, lpWStr, cchTStr/sizeof(TCHAR));
|
|
|
|
return (wcslen(lpTStr)+1)*sizeof(TCHAR);
|
|
|
|
#else
|
|
// call the conversion function
|
|
return OSAL_WideToAnsi(lpTStr, lpWStr, cchTStr);
|
|
|
|
#endif
|
|
} // WideToTChar
|
|
|
|
/*
|
|
** TCharToWide
|
|
*
|
|
* CALLED BY: everywhere
|
|
*
|
|
* PARAMETERS: lpWStr - destination string
|
|
* lpTStr - string to convert
|
|
* cchWStr - size of dest buffer
|
|
*
|
|
* DESCRIPTION:
|
|
* converts TCHAR lpTStr to unicode lpWStr.
|
|
*
|
|
*
|
|
* RETURNS: if cchWStr is 0, returns the size required to hold the string
|
|
* otherwise, returns the number of chars converted
|
|
*
|
|
*/
|
|
int OSAL_TCharToWide(LPWSTR lpWStr,LPCTSTR lpTStr,int cchWStr)
|
|
{
|
|
#if defined(UNICODE)
|
|
// no conversion required, just copy the string over
|
|
if (!lpTStr && cchWStr)
|
|
{
|
|
// can't call us w/ null pointer & non-zero cch
|
|
DNASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
if (cchWStr == 0)
|
|
{
|
|
return (wcslen(lpTStr)+1)*sizeof(WCHAR);
|
|
}
|
|
|
|
wcsncpy(lpWStr, lpTStr, cchWStr/sizeof(WCHAR));
|
|
|
|
return (wcslen(lpWStr)+1)*sizeof(WCHAR);
|
|
|
|
#else
|
|
// call the conversion function
|
|
return OSAL_AnsiToWide(lpWStr, lpTStr, cchWStr);
|
|
|
|
#endif
|
|
} // TCharToWide
|
|
|