Windows2003-3790/inetcore/outlookexpress/wabw/wabapi/ansiwrap.c
2020-09-30 16:53:55 +02:00

5544 lines
161 KiB
C

/*
-
- AnsiWrap.c
*
* Contains wrappers for thunking down Unicode calls to the Win 9x ANSI versions
*
*/
#include "_apipch.h"
// we should not define the Macro for the APIs that we will implement the wrappers for.
// lets try to keep this list alphabetical for sanity
#undef CallWindowProcW
#undef CharLowerW
#undef CharNextW
#undef CharPrevW
#undef CharUpperBuffW
#undef CharUpperBuffW
#undef CharUpperW
#undef CompareStringW
#undef CopyFileW
#undef CreateDialogParamW
#undef CreateDirectoryW
#undef CreateEventW
#undef CreateFileW
#undef CreateFontIndirectW
#undef CreateMutexW
#undef CreateWindowExW
//#undef CryptAcquireContextW
#undef DefWindowProcW
#undef DeleteFileW
#undef DialogBoxParamW
#undef DispatchMessageW
#undef DragQueryFileW
#undef DrawTextW
#undef ExpandEnvironmentStringsW
#undef FindFirstChangeNotificationW
#undef FindFirstFileW
#undef FormatMessageW
#undef GetClassInfoExW
#undef GetClassInfoW
#undef GetClassNameW
#undef GetDateFormatW
#undef GetDiskFreeSpaceW
#undef GetDlgItemTextW
#undef GetFileAttributesW
#undef GetLocaleInfoW
#undef GetMenuItemInfoW
#undef GetMessageW
#undef GetModuleFileNameW
#undef GetObjectW
#undef GetPrivateProfileIntW
#undef GetPrivateProfileStringW
#undef GetProfileIntW
#undef GetStringTypeW
#undef GetSystemDirectoryW
#undef GetTempFileNameW
#undef GetTempPathW
#undef GetTextExtentPoint32W
#undef GetTimeFormatW
#undef GetUserNameW
#undef GetWindowLongW
#undef GetWindowsDirectoryW
#undef GetWindowTextLengthW
#undef GetWindowTextW
#undef InsertMenuW
#undef IsBadStringPtrW
#undef IsCharLowerW
#undef IsCharUpperW
#undef IsDialogMessageW
#undef LCMapStringW
#undef LoadAcceleratorsW
#undef LoadCursorW
#undef LoadIconW
#undef LoadImageW
#undef LoadLibraryW
#undef LoadMenuW
#undef LoadStringW
#undef lstrcatW
#undef lstrcmpiW
#undef lstrcmpW
#undef lstrcpynW
#undef lstrcpyW
#undef ModifyMenuW
#undef MoveFileW
#undef OutputDebugStringW
#undef PeekMessageW
#undef PostMessageW
#undef RegCreateKeyExW
#undef RegCreateKeyW
#undef RegDeleteKeyW
#undef RegDeleteValueW
#undef RegEnumKeyExW
#undef RegEnumValueW
#undef RegisterClassExW
#undef RegisterClassW
#undef RegisterClipboardFormatW
#undef RegisterWindowMessageW
#undef RegOpenKeyExW
#undef RegQueryInfoKeyW
#undef RegQueryValueExW
#undef RegQueryValueW
#undef RegSetValueExW
#undef RegSetValueW
#undef SendDlgItemMessageW
#undef SendMessageW
#undef SetDlgItemTextW
#undef SetMenuItemInfoW
#undef SetWindowLongW
#undef SetWindowTextW
#undef ShellExecuteW
#undef StartDocW
#undef SystemParametersInfoW
#undef TranslateAcceleratorW
#undef UnRegisterClassW
#undef wsprintfW
#undef wvsprintfW
//
// Do this in every wrapper function to make sure the wrapper
// prototype matches the function it is intending to replace.
//
#define VALIDATE_PROTOTYPE(f) if (f##W == f##WrapW) 0
#define InRange(val, valMin, valMax) (valMin <= val && val <= valMax)
// Because with current build setting, no lib containing wcscpy and wcslen is linked
// so implement these two functions here.
LPWSTR My_wcscpy( LPWSTR pwszDest, LPCWSTR pwszSrc )
{
LPWSTR pwszDestT = NULL;
LPCWSTR pwszSrcT;
pwszSrcT = pwszSrc;
pwszDestT = pwszDest;
while ( *pwszSrcT )
*pwszDestT++ = *pwszSrcT ++;
*pwszDestT = 0x0000;
return pwszDest;
}
DWORD My_wcslen( LPCWSTR lpwszStr )
{
DWORD dLen =0;
LPCWSTR lpwszStrT;
lpwszStrT = lpwszStr;
dLen = 0;
while ( *lpwszStrT ) {
dLen ++;
lpwszStrT ++;
}
return dLen;
}
LPWSTR My_wcscat( LPWSTR pwszDest, LPCWSTR pwszSrc )
{
LPWSTR pwszDestT = pwszDest;
while ( *pwszDestT )
pwszDestT++;
My_wcscpy(pwszDestT, pwszSrc);
return pwszDest;
}
// ADVAPI32.DLL
/* RegOpenKeyEx */
LONG WINAPI RegOpenKeyExWrapW( HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey to open
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult) // address of handle to open key
{
LPSTR lpSubKeyA = NULL;
LONG lRetValue = 0;
VALIDATE_PROTOTYPE(RegOpenKeyEx);
if (g_bRunningOnNT)
return RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, phkResult);
lpSubKeyA = ConvertWtoA(lpSubKey);
lRetValue = RegOpenKeyExA(hKey, lpSubKeyA, ulOptions, samDesired, phkResult);
LocalFreeAndNull( &lpSubKeyA );
return lRetValue;
}
/* RegQueryValue */
LONG WINAPI RegQueryValueWrapW( HKEY hKey, // handle to key to query
LPCTSTR lpSubKey, // name of subkey to query
LPTSTR lpValue, // buffer for returned string
PLONG lpcbValue) // receives size of returned string
{
LPSTR lpSubKeyA = NULL;
LPWSTR lpwszValue = NULL;
LONG lRetValue =0;
LPSTR lpValueA = NULL;
LONG cbValueA = 0;
VALIDATE_PROTOTYPE(RegQueryValue);
if (g_bRunningOnNT)
return RegQueryValueW(hKey, lpSubKey, lpValue, lpcbValue);
lpSubKeyA = ConvertWtoA(lpSubKey);
lRetValue = RegQueryValueA(hKey, lpSubKeyA, NULL, &cbValueA);
if ( lRetValue != ERROR_SUCCESS ) {
LocalFreeAndNull( &lpSubKeyA);
return lRetValue;
}
lpValueA = LocalAlloc(LMEM_ZEROINIT, cbValueA);
lRetValue = RegQueryValueA(hKey, lpSubKeyA, lpValueA, &cbValueA);
lpwszValue = ConvertAtoW(lpValueA);
*lpcbValue = (My_wcslen(lpwszValue) + 1 ) * sizeof(WCHAR);
if ( lpValue != NULL )
My_wcscpy(lpValue, lpwszValue);
LocalFreeAndNull( &lpSubKeyA );
LocalFreeAndNull( &lpValueA );
LocalFreeAndNull( &lpwszValue );
return lRetValue;
}
// RegEnumKeyEx
LONG WINAPI RegEnumKeyExWrapW( HKEY hKey, // handle to key to enumerate
DWORD dwIndex, // index of subkey to enumerate
LPTSTR lpName, // address of buffer for subkey name
LPDWORD lpcbName, // address for size of subkey buffer
LPDWORD lpReserved, // reserved
LPTSTR lpClass, // address of buffer for class string
LPDWORD lpcbClass, // address for size of class buffer
PFILETIME lpftLastWriteTime )
// address for time key last written to
{
LONG lRetValue = 0;
CHAR lpNameA[MAX_PATH];
CHAR lpClassA[MAX_PATH];
LPWSTR lpNameW = NULL;
LPWSTR lpClassW= NULL;
DWORD cbName, cbClass;
// [PaulHi] 1/11/99 Init wide char buffers
lpNameA[0] = 0;
lpClassA[0] = 0;
VALIDATE_PROTOTYPE(RegEnumKeyEx);
if (g_bRunningOnNT)
return RegEnumKeyExW(hKey, dwIndex, lpName, lpcbName, lpReserved, lpClass, lpcbClass, lpftLastWriteTime);
cbName = cbClass = MAX_PATH;
lRetValue = RegEnumKeyExA(hKey,dwIndex,lpNameA,&cbName,lpReserved,lpClassA,&cbClass,lpftLastWriteTime);
if ( lRetValue != ERROR_SUCCESS ) return lRetValue;
lpClassW = ConvertAtoW( lpClassA );
lpNameW = ConvertAtoW( lpNameA );
cbName = My_wcslen(lpNameW) + 1;
cbClass= My_wcslen(lpClassW) + 1;
// [PaulHi] 1/11/99 Be careful copying to passed in pointers
if (lpClass && lpcbClass)
{
if (cbClass <= *lpcbClass)
{
CopyMemory(lpClass, lpClassW, cbClass * sizeof(WCHAR) );
*lpcbClass = cbClass;
}
else
{
Assert(0);
lpClass[0] = 0;
*lpcbClass = 0;
lRetValue = ERROR_INSUFFICIENT_BUFFER;
}
}
if (lpName && lpcbName)
{
if (cbName <= *lpcbName)
{
CopyMemory(lpName, lpNameW, cbName * sizeof(WCHAR) );
*lpcbName = cbName;
}
else
{
Assert(0);
lpName[0] = 0;
*lpcbName = 0;
lRetValue = ERROR_INSUFFICIENT_BUFFER;
}
}
LocalFreeAndNull( &lpClassW );
LocalFreeAndNull( &lpNameW );
return lRetValue;
}
/* RegSetValue */
LONG WINAPI RegSetValueWrapW( HKEY hKey, // handle to key to set value for
LPCTSTR lpSubKey, // address of subkey name
DWORD dwType, // type of value
LPCTSTR lpData, // address of value data
DWORD cbData ) // size of value data
{
LPSTR lpSubKeyA =NULL;
LPSTR lpDataA=NULL;
DWORD cbDataA =0;
LONG lRetValue = 0;
VALIDATE_PROTOTYPE(RegSetValue);
if (g_bRunningOnNT)
return RegSetValueW(hKey, lpSubKey, dwType, lpData, cbData);
lpSubKeyA = ConvertWtoA(lpSubKey );
lpDataA = ConvertWtoA( lpData );
cbDataA = lstrlenA( lpDataA );
lRetValue = RegSetValueA(hKey, lpSubKeyA, dwType, lpDataA, cbDataA);
LocalFreeAndNull( &lpSubKeyA );
LocalFreeAndNull( &lpDataA );
return lRetValue;
}
// RegDeleteKey
LONG WINAPI RegDeleteKeyWrapW( HKEY hKey, // handle to open key
LPCTSTR lpSubKey) // address of name of subkey to delete
{
LPSTR lpSubKeyA =NULL;
LONG lRetValue = 0;
VALIDATE_PROTOTYPE(RegDeleteKey);
if (g_bRunningOnNT)
return RegDeleteKeyW(hKey, lpSubKey);
lpSubKeyA = ConvertWtoA(lpSubKey );
lRetValue = RegDeleteKeyA(hKey, lpSubKeyA );
LocalFreeAndNull ( &lpSubKeyA );
return lRetValue;
}
// GetUserName
BOOL WINAPI GetUserNameWrapW( LPTSTR lpBuffer, // address of name buffer
LPDWORD nSize ) // address of size of name buffer
{
CHAR lpBufferA[MAX_PATH];
DWORD nSizeA, nSizeW;
BOOL bRetValue;
LPWSTR lpwszBuffer = NULL;
VALIDATE_PROTOTYPE(GetUserName);
if (g_bRunningOnNT)
return GetUserNameW(lpBuffer, nSize);
nSizeA = MAX_PATH;
bRetValue = GetUserNameA( lpBufferA, &nSizeA );
lpwszBuffer = ConvertAtoW(lpBufferA );
if (lpBuffer == NULL )
bRetValue = FALSE;
nSizeW = My_wcslen(lpwszBuffer);
if ( *nSize < nSizeW ) {
*nSize = nSizeW + 1;
bRetValue = FALSE;
}
if ( bRetValue == TRUE ) {
My_wcscpy( lpBuffer, lpwszBuffer );
*nSize = nSizeW + 1;
}
LocalFreeAndNull( &lpwszBuffer );
return bRetValue;
}
// RegEnumValue
LONG WINAPI RegEnumValueWrapW( HKEY hKey, // handle to key to query
DWORD dwIndex, // index of value to query
LPTSTR lpValueName, // address of buffer for value string
LPDWORD lpcbValueName, // address for size of value buffer
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for type code
LPBYTE lpData, // address of buffer for value data
LPDWORD lpcbData ) // address for size of data buffer
{
LONG lRetValue = 0;
CHAR lpValueNameA[MAX_PATH];
LPWSTR lpValueNameW = NULL, lpDataW= NULL;
LPSTR lpDataA = NULL;
DWORD cbValueName, cbData;
VALIDATE_PROTOTYPE(RegEnumValue);
if (g_bRunningOnNT)
return RegEnumValueW(hKey, dwIndex, lpValueName, lpcbValueName, lpReserved, lpType, lpData, lpcbData);
// [PaulHi] Validate return parameters
if (!lpValueName || !lpcbValueName)
return ERROR_INVALID_PARAMETER;
if ( lpData && lpcbData &&( *lpcbData != 0 ) )
{
lpDataA = LocalAlloc( LMEM_ZEROINIT, *lpcbData );
cbData = *lpcbData;
}
cbValueName = MAX_PATH;
lRetValue = RegEnumValueA(hKey, dwIndex, lpValueNameA, &cbValueName, lpReserved, lpType, lpDataA, &cbData);
if ( lRetValue != ERROR_SUCCESS ) return lRetValue;
lpValueNameW = ConvertAtoW( lpValueNameA );
cbValueName = My_wcslen( lpValueNameW ) + 1;
if ( lpType && (*lpType != REG_EXPAND_SZ) && ( *lpType!= REG_MULTI_SZ) && ( *lpType != REG_SZ ) )
{
CopyMemory(lpValueName, lpValueNameW, cbValueName * sizeof(WCHAR) );
*lpcbValueName = cbValueName;
if ( lpData && lpcbData) {
CopyMemory(lpData, lpDataA, cbData );
*lpcbData = cbData;
LocalFreeAndNull( &lpDataA );
}
LocalFreeAndNull( &lpValueNameW );
return lRetValue;
}
if ( lpType && ((*lpType == REG_EXPAND_SZ) || (*lpType == REG_SZ)) )
{
CopyMemory(lpValueName, lpValueNameW, cbValueName * sizeof(WCHAR) );
*lpcbValueName = cbValueName;
if ( lpData && lpcbData ) {
LPWSTR lpDataW;
lpDataW = ConvertAtoW( lpDataA );
cbData = My_wcslen(lpDataW) + 1;
CopyMemory(lpData, lpDataW, cbData * sizeof(WCHAR) );
*lpcbData = cbData * sizeof(WCHAR);
LocalFreeAndNull( &lpDataW );
}
LocalFreeAndNull( &lpValueNameW );
return lRetValue;
}
// the last case REG_MULTI_SZ.
CopyMemory(lpValueName, lpValueNameW, cbValueName * sizeof(WCHAR) );
*lpcbValueName = cbValueName;
if ( lpData && lpcbData ) {
LPWSTR lpDataW= NULL;
LPSTR lpDataAt = NULL;
LPWSTR lpDataT = NULL;
DWORD cbDataAll;
lpDataAt = lpDataA;
cbDataAll = 0;
lpDataT = (LPWSTR)lpData;
while ( *lpDataAt != '\0' ) {
lpDataW = ConvertAtoW( lpDataAt );
cbDataAll += My_wcslen( lpDataW ) + 1;
My_wcscpy(lpDataT, lpDataW);
lpDataT += My_wcslen(lpDataW) + 1;
lpDataAt += lstrlenA(lpDataAt) + 1;
LocalFreeAndNull( &lpDataW );
}
cbDataAll ++;
*lpDataT = 0x0000;
*lpcbData = cbDataAll * sizeof(WCHAR);
}
LocalFreeAndNull( &lpValueNameW );
return lRetValue;
}
// RegDeleteValue
LONG WINAPI RegDeleteValueWrapW( HKEY hKey, // handle to key
LPCTSTR lpValueName ) // address of value name
{
LPSTR lpValueNameA = NULL;
LONG lRetValue=0;
VALIDATE_PROTOTYPE(RegDeleteValue);
if (g_bRunningOnNT)
return RegDeleteValueW(hKey, lpValueName);
lpValueNameA = ConvertWtoA( lpValueName );
lRetValue = RegDeleteValueA( hKey, lpValueNameA );
LocalFreeAndNull( & lpValueNameA );
return lRetValue;
}
// RegCreateKey
LONG WINAPI RegCreateKeyWrapW( HKEY hKey, // handle to an open key
LPCTSTR lpSubKey, // address of name of subkey to open
PHKEY phkResult ) // address of buffer for opened handle
{
LPSTR lpSubKeyA = NULL;
LONG lRetValue =0;
VALIDATE_PROTOTYPE(RegCreateKey);
if (g_bRunningOnNT)
return RegCreateKeyW(hKey, lpSubKey, phkResult);
lpSubKeyA = ConvertWtoA( lpSubKey );
lRetValue = RegCreateKeyA(hKey, lpSubKeyA, phkResult);
LocalFreeAndNull( &lpSubKeyA );
return lRetValue;
}
// in header file wincrypt.h
// CryptAcquireContext
BOOL WINAPI CryptAcquireContextWrapW( HCRYPTPROV *phProv, // out
LPCTSTR pszContainer, // in
LPCTSTR pszProvider, // in
DWORD dwProvType, // in
DWORD dwFlags ) // in
{
LPSTR pszContainerA = NULL;
LPSTR pszProviderA = NULL;
BOOL bRetValue =0;
VALIDATE_PROTOTYPE(CryptAcquireContext);
if (g_bRunningOnNT)
return CryptAcquireContextW(phProv, pszContainer, pszProvider, dwProvType, dwFlags );
pszContainerA = ConvertWtoA( pszContainer );
pszProviderA = ConvertWtoA ( pszProvider );
bRetValue = CryptAcquireContextA(phProv, pszContainerA, pszProviderA, dwProvType, dwFlags );
LocalFreeAndNull( &pszContainerA );
LocalFreeAndNull( &pszProviderA );
return bRetValue;
}
LONG WINAPI RegQueryValueExWrapW( HKEY hKey, // handle to key to query
LPCTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData ) // address of data buffer size
{
LONG lRetValue =0;
LPSTR lpValueNameA= NULL;
LPWSTR lpDataW= NULL;
LPSTR lpDataA = NULL;
DWORD cbData=0;
DWORD dwRealType;
// VALIDATE_PROTOTYPE(RegQueryValueEx);
if (g_bRunningOnNT)
return RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData );
cbData = 0;
if ( lpData && lpcbData &&( *lpcbData != 0 ) )
{
lpDataA = LocalAlloc( LMEM_ZEROINIT, *lpcbData );
cbData = *lpcbData;
}
lpValueNameA = ConvertWtoA(lpValueName);
lRetValue = RegQueryValueExA(hKey, lpValueNameA, lpReserved, &dwRealType, lpDataA, &cbData);
if (lpType)
*lpType = dwRealType;
if ( (lRetValue != ERROR_SUCCESS) || (lpData == NULL) || (lpcbData == NULL ) ) {
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
if ( (dwRealType != REG_EXPAND_SZ) && ( dwRealType != REG_MULTI_SZ) && ( dwRealType != REG_SZ ) ){
CopyMemory(lpData, lpDataA, cbData );
*lpcbData = cbData;
LocalFreeAndNull( &lpDataA );
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
if ( (dwRealType == REG_EXPAND_SZ) || (dwRealType == REG_SZ) ) {
LPWSTR lpDataW= NULL;
lpDataW = ConvertAtoW( lpDataA );
cbData = My_wcslen(lpDataW) + 1;
CopyMemory(lpData, lpDataW, cbData * sizeof(WCHAR) );
*lpcbData = cbData * sizeof(WCHAR);
LocalFreeAndNull( &lpDataW );
LocalFreeAndNull( &lpDataA );
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
// the last case REG_MULTI_SZ.
if (lpData && lpcbData) {
LPWSTR lpDataW= NULL;
LPSTR lpDataAt= NULL;
LPWSTR lpDataT= NULL;
DWORD cbDataAll=0;
lpDataAt = lpDataA;
cbDataAll = 0;
lpDataT = (LPWSTR)lpData;
while ( *lpDataAt != '\0' ) {
lpDataW = ConvertAtoW( lpDataAt );
cbDataAll += My_wcslen( lpDataW ) + 1;
My_wcscpy(lpDataT, lpDataW);
lpDataT += My_wcslen(lpDataW) + 1;
lpDataAt += lstrlenA(lpDataAt) + 1;
LocalFreeAndNull( &lpDataW );
}
cbDataAll ++;
*lpDataT = 0x0000;
*lpcbData = cbDataAll * sizeof(WCHAR);
}
LocalFreeAndNull( &lpDataA );
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
// RegCreateKeyEx
LONG WINAPI RegCreateKeyExWrapW( HKEY hKey, // handle to an open key
LPCTSTR lpSubKey, // address of subkey name
DWORD Reserved, // reserved
LPTSTR lpClass, // address of class string
DWORD dwOptions, // special options flag
REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// address of key security structure
PHKEY phkResult, // address of buffer for opened handle
LPDWORD lpdwDisposition ) // address of disposition value buffer
{
LPSTR lpSubKeyA = NULL;
LPSTR lpClassA = NULL;
LONG lRetValue=0;
VALIDATE_PROTOTYPE(RegCreateKeyEx);
if (g_bRunningOnNT)
return RegCreateKeyExW(hKey,
lpSubKey,
Reserved,
lpClass,
dwOptions,
samDesired,
lpSecurityAttributes,
phkResult,
lpdwDisposition);
lpSubKeyA = ConvertWtoA( lpSubKey );
lpClassA = ConvertWtoA ( lpClass );
lRetValue = RegCreateKeyExA(hKey,
lpSubKeyA,
Reserved,
lpClassA,
dwOptions,
samDesired,
lpSecurityAttributes,
phkResult,
lpdwDisposition);
LocalFreeAndNull( &lpSubKeyA );
LocalFreeAndNull( &lpClassA );
return lRetValue;
}
// RegSetValueEx
LONG WINAPI RegSetValueExWrapW( HKEY hKey, // handle to key to set value for
LPCTSTR lpValueName, // name of the value to set
DWORD Reserved, // reserved
DWORD dwType, // flag for value type
CONST BYTE *lpData, // address of value data
DWORD cbData ) // size of value data
{
LPSTR lpValueNameA = NULL;
LPSTR lpStrA= NULL;
BYTE *lpDataA= NULL;
DWORD cbDataA=0;
LONG lRetValue=0;
VALIDATE_PROTOTYPE(RegSetValueEx);
if (g_bRunningOnNT)
return RegSetValueExW(hKey, lpValueName, Reserved, dwType, lpData, cbData);
lpValueNameA = ConvertWtoA( lpValueName );
if ( ( dwType != REG_EXPAND_SZ ) && (dwType != REG_MULTI_SZ) && (dwType != REG_SZ) ) {
lRetValue = RegSetValueExA(hKey, lpValueNameA, Reserved, dwType, lpData, cbData);
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
if ( ( dwType == REG_EXPAND_SZ) || ( dwType == REG_SZ ) ) {
lpDataA = ConvertWtoA( (LPWSTR) lpData );
cbDataA = lstrlenA(lpDataA) + 1;
lRetValue = RegSetValueExA(hKey, lpValueNameA, Reserved, dwType, lpDataA, cbDataA);
LocalFreeAndNull( &lpValueNameA );
LocalFreeAndNull( &lpDataA );
return lRetValue;
}
// the last case is for REG_MULT_SZ
if ( lpData ) {
LPWSTR lpDataWt= NULL;
LPSTR lpDataAt= NULL;
DWORD cbDataAll=0;
lpDataA = LocalAlloc(LMEM_ZEROINIT, cbData);
lpDataAt = lpDataA;
cbDataAll = 0;
lpDataWt = (LPWSTR)lpData;
while ( *lpDataWt != 0x0000 ) {
WideCharToMultiByte(CP_ACP,0, lpDataWt, -1, lpDataAt, -1, NULL, NULL );
cbDataAll += lstrlenA(lpDataAt) + 1;
lpDataWt += My_wcslen(lpDataWt) + 1;
lpDataAt += lstrlenA(lpDataAt) + 1;
}
cbDataAll ++;
*lpDataAt = 0x00;
lRetValue = RegSetValueExA(hKey, lpValueNameA, Reserved, dwType, lpDataA, cbDataAll);
LocalFreeAndNull( &lpDataA );
LocalFreeAndNull( &lpValueNameA );
return lRetValue;
}
return FALSE;
return GetLastError();
}
// RegQueryInfoKey
LONG WINAPI RegQueryInfoKeyWrapW( HKEY hKey, // handle to key to query
LPTSTR lpClass, // address of buffer for class string
LPDWORD lpcbClass, // address of size of class string buffer
LPDWORD lpReserved, // reserved
LPDWORD lpcSubKeys, // address of buffer for number of subkeys
LPDWORD lpcbMaxSubKeyLen, // address of buffer for longest subkey
// name length
LPDWORD lpcbMaxClassLen, // address of buffer for longest class
// string length
LPDWORD lpcValues, // address of buffer for number of value
// entries
LPDWORD lpcbMaxValueNameLen, // address of buffer for longest
// value name length
LPDWORD lpcbMaxValueLen, // address of buffer for longest value
// data length
LPDWORD lpcbSecurityDescriptor,
// address of buffer for security
// descriptor length
PFILETIME lpftLastWriteTime) // address of buffer for last write time
{
LPSTR lpClassA= NULL;
LONG lRetValue=0;
VALIDATE_PROTOTYPE(RegQueryInfoKey);
if (g_bRunningOnNT)
return RegQueryInfoKeyW(hKey, lpClass, lpcbClass, lpReserved, lpcSubKeys,
lpcbMaxSubKeyLen, lpcbMaxClassLen, lpcValues, lpcbMaxValueNameLen,
lpcbMaxValueLen,lpcbSecurityDescriptor,lpftLastWriteTime );
lpClassA = ConvertWtoA( lpClass );
lRetValue = RegQueryInfoKeyA(hKey, lpClassA, lpcbClass, lpReserved, lpcSubKeys,
lpcbMaxSubKeyLen, lpcbMaxClassLen, lpcValues, lpcbMaxValueNameLen,
lpcbMaxValueLen,lpcbSecurityDescriptor,lpftLastWriteTime );
LocalFreeAndNull( &lpClassA );
return lRetValue;
}
//GDI32.DLL
//GetObject
int WINAPI GetObjectWrapW( HGDIOBJ hgdiobj, // handle to graphics object of interest
int cbBuffer, // size of buffer for object information
LPVOID lpvObject ) // pointer to buffer for object information
{
int iRetValue =0;
LOGFONTA lfFontA;
LOGFONTW lfFontW;
VALIDATE_PROTOTYPE(GetObject);
if (g_bRunningOnNT)
return GetObjectW(hgdiobj, cbBuffer, lpvObject);
if ( GetObjectType(hgdiobj) != OBJ_FONT ) {
iRetValue = GetObjectA( hgdiobj, cbBuffer, lpvObject );
return iRetValue;
}
// if Object type is HFONT, the return value lpvObject will point to LOGFONT which contains
// a field lpFaceName with TCHAR * type.
if ( cbBuffer != sizeof(LOGFONTW) )
return 0;
if (lpvObject == NULL ) return sizeof(LOGFONTW);
iRetValue = GetObjectA( hgdiobj, sizeof(lfFontA), &lfFontA );
if (iRetValue == 0 ) return 0;
iRetValue = sizeof(LOGFONTW);
// copy all the fields except lfFaceName from lfFontA to lfFontW
CopyMemory(&lfFontW,&lfFontA, sizeof(LOGFONTA) );
// translate the lfFaceName[] from A to W
MultiByteToWideChar(GetACP(), 0, lfFontA.lfFaceName, LF_FACESIZE, lfFontW.lfFaceName, LF_FACESIZE);
CopyMemory(lpvObject, &lfFontW, sizeof(LOGFONTW) );
return iRetValue;
}
// StartDoc
int WINAPI StartDocWrapW( HDC hdc, // handle to device context
CONST DOCINFO *lpdi ) // address of structure with file names
{
int iRetValue=0;
DOCINFOA diA;
LPSTR lpszDocName= NULL, lpszOutput= NULL, lpszDatatype= NULL;
VALIDATE_PROTOTYPE(StartDoc);
if (g_bRunningOnNT)
return StartDocW(hdc,lpdi);
diA.cbSize = sizeof(DOCINFOA);
lpszDocName = ConvertWtoA( lpdi->lpszDocName );
lpszOutput = ConvertWtoA( lpdi->lpszOutput );
lpszDatatype= ConvertWtoA( lpdi->lpszDatatype);
diA.lpszDocName = lpszDocName;
diA.lpszOutput = lpszOutput;
diA.lpszDatatype = lpszDatatype;
diA.fwType = lpdi->fwType;
iRetValue = StartDocA( hdc, &diA );
LocalFreeAndNull( &lpszDocName );
LocalFreeAndNull( &lpszOutput );
LocalFreeAndNull( &lpszDatatype );
return iRetValue;
}
// CreateFontIndirect
HFONT WINAPI CreateFontIndirectWrapW (CONST LOGFONT *lplf ) // pointer to logical font structure
{
HFONT hRetValue;
LOGFONTA lfFontA;
VALIDATE_PROTOTYPE(CreateFontIndirect);
if (g_bRunningOnNT)
return CreateFontIndirectW(lplf);
// copy LOGFONTW 's fields except lfFaceName to lfFontA.
CopyMemory(&lfFontA, lplf, sizeof(LOGFONTW) - LF_FACESIZE * sizeof(WCHAR) );
WideCharToMultiByte(CP_ACP, 0, lplf->lfFaceName, LF_FACESIZE, lfFontA.lfFaceName, LF_FACESIZE, NULL, NULL );
hRetValue = CreateFontIndirectA( &lfFontA );
return hRetValue;
}
//KERNEL32.DLL
// GetLocaleInfo
int WINAPI GetLocaleInfoWrapW( LCID Locale, // locale identifier
LCTYPE LCType, // type of information
LPTSTR lpLCData, // address of buffer for information
int cchData ) // size of buffer
{
int iRetValue=0;
LPSTR lpLCDataA= NULL;
int cchDataA=0;
LPWSTR lpLCDataW= NULL;
int cchDataW=0;
VALIDATE_PROTOTYPE(GetLocaleInfo);
if (g_bRunningOnNT)
return GetLocaleInfoW(Locale, LCType, lpLCData, cchData);
iRetValue = GetLocaleInfoA(Locale, LCType, NULL, 0);
if ( iRetValue == 0 ) return iRetValue;
cchDataA = iRetValue;
lpLCDataA = LocalAlloc(LMEM_ZEROINIT, cchDataA+1 );
iRetValue = GetLocaleInfoA(Locale, LCType, lpLCDataA, cchDataA);
lpLCDataA[cchDataA] = '\0';
lpLCDataW = ConvertAtoW( lpLCDataA );
cchDataW = My_wcslen( lpLCDataW );
if ( (cchData == 0) || (lpLCData == NULL) ) {
LocalFreeAndNull(&lpLCDataA);
LocalFreeAndNull(&lpLCDataW);
return cchDataW ;
}
CopyMemory(lpLCData, lpLCDataW, cchDataW * sizeof(WCHAR) );
lpLCData[cchDataW] = '\0';
LocalFreeAndNull(&lpLCDataA);
LocalFreeAndNull(&lpLCDataW);
return cchData;
}
// CreateDirectory
BOOL WINAPI CreateDirectoryWrapW(LPCTSTR lpPathName, // pointer to directory path string
LPSECURITY_ATTRIBUTES lpSecurityAttributes)// pointer to security descriptor
{
BOOL bRetValue = FALSE;
LPSTR lpPathNameA = NULL;
VALIDATE_PROTOTYPE(CreateDirectory);
if (g_bRunningOnNT)
return CreateDirectoryW(lpPathName, lpSecurityAttributes);
lpPathNameA = ConvertWtoA( lpPathName );
bRetValue = CreateDirectoryA( lpPathNameA, lpSecurityAttributes );
LocalFreeAndNull( &lpPathNameA );
return bRetValue;
}
// GetWindowsDirectory
UINT WINAPI GetWindowsDirectoryWrapW( LPTSTR lpBuffer, // address of buffer for Windows directory
UINT uSize ) // size of directory buffer
{
UINT uRetValue = 0;
LPSTR lpBufferA = NULL;
VALIDATE_PROTOTYPE(GetWindowsDirectory);
if (g_bRunningOnNT)
return GetWindowsDirectoryW(lpBuffer, uSize);
lpBufferA = LocalAlloc( LMEM_ZEROINIT, uSize * sizeof(WCHAR) );
uRetValue = GetWindowsDirectoryA( lpBufferA, uSize * sizeof(WCHAR) );
uRetValue =MultiByteToWideChar(GetACP( ), 0, lpBufferA, -1, lpBuffer, uSize);
LocalFreeAndNull( &lpBufferA );
return uRetValue;
}
// GetSystemDirectory
UINT WINAPI GetSystemDirectoryWrapW( LPTSTR lpBuffer, // address of buffer for system directory
UINT uSize ) // size of directory buffer
{
UINT uRetValue = 0;
LPSTR lpBufferA = NULL;
VALIDATE_PROTOTYPE(GetSystemDirectory);
if (g_bRunningOnNT)
return GetSystemDirectoryW(lpBuffer, uSize);
lpBufferA = LocalAlloc( LMEM_ZEROINIT, uSize * sizeof(WCHAR) );
uRetValue = GetSystemDirectoryA( lpBufferA, uSize * sizeof(WCHAR) );
uRetValue =MultiByteToWideChar(GetACP( ), 0, lpBufferA, -1, lpBuffer, uSize);
LocalFreeAndNull( &lpBufferA );
return uRetValue;
}
// GetStringType the parameters are not the same
BOOL WINAPI GetStringTypeWrapW( DWORD dwInfoType, // information-type options
LPCTSTR lpSrcStr, // pointer to the source string
int cchSrc, // size, in Characters, of the source string
LPWORD lpCharType ) // pointer to the buffer for output
{
BOOL bRetValue = 0;
LPSTR lpSrcStrA = NULL;
VALIDATE_PROTOTYPE(GetStringType);
if (g_bRunningOnNT)
return GetStringTypeW(dwInfoType, lpSrcStr, cchSrc, lpCharType);
lpSrcStrA = ConvertWtoA( lpSrcStr );
bRetValue = GetStringTypeA( LOCALE_USER_DEFAULT, dwInfoType, lpSrcStrA, -1, lpCharType);
LocalFreeAndNull( &lpSrcStrA );
return bRetValue;
}
// GetProfileInt
UINT WINAPI GetProfileIntWrapW( LPCTSTR lpAppName, // address of section name
LPCTSTR lpKeyName, // address of key name
INT nDefault ) // default value if key name is not found
{
UINT uRetValue = 0;
LPSTR lpAppNameA = NULL;
LPSTR lpKeyNameA = NULL;
VALIDATE_PROTOTYPE(GetProfileInt);
if (g_bRunningOnNT)
return GetProfileIntW(lpAppName, lpKeyName, nDefault);
lpAppNameA = ConvertWtoA( lpAppName );
lpKeyNameA = ConvertWtoA( lpKeyName );
uRetValue = GetProfileIntA( lpAppNameA, lpKeyNameA, nDefault);
LocalFreeAndNull( &lpAppNameA );
LocalFreeAndNull( &lpKeyNameA );
return uRetValue;
}
// LCMapString
int WINAPI LCMapStringWrapW( LCID Locale, // locale identifier
DWORD dwMapFlags, // mapping transformation type
LPCTSTR lpSrcStr, // address of source string
int cchSrc, // number of characters in source string
LPTSTR lpDestStr, // address of destination buffer
int cchDest ) // size of destination buffer
{
int iRetValue =0;
LPSTR lpSrcStrA = NULL;
LPSTR lpDestStrA = NULL;
LPWSTR lpDestStrW = NULL;
int cchSrcA, cchDestA, cchDestW;
VALIDATE_PROTOTYPE(LCMapString);
if (g_bRunningOnNT)
return LCMapStringW(Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest);
lpSrcStrA = ConvertWtoA( lpSrcStr );
cchSrcA = lstrlenA(lpSrcStrA);
lpDestStrA = LocalAlloc(LMEM_ZEROINIT, cchDest * sizeof(WCHAR) );
cchDestA = cchDest * sizeof(WCHAR);
iRetValue = LCMapStringA(Locale,dwMapFlags,lpSrcStrA,cchSrcA,lpDestStrA,cchDestA);
// [PaulHi] 6/8/99 Don't fill the buffer if the pointer is NULL.
if (lpDestStr && iRetValue != 0)
{
lpDestStrW = ConvertAtoW(lpDestStrA);
iRetValue = My_wcslen(lpDestStrW) + 1;
// Ensure that we don't overwrite the output buffer
iRetValue = (iRetValue <= cchDest) ? iRetValue : cchDest;
CopyMemory( lpDestStr, lpDestStrW, iRetValue * sizeof(WCHAR) );
LocalFreeAndNull( &lpDestStrW );
}
LocalFreeAndNull( &lpDestStrA );
LocalFreeAndNull( &lpSrcStrA );
return iRetValue;
}
// GetFileAttributes
DWORD WINAPI GetFileAttributesWrapW( LPCTSTR lpFileName ) // pointer to the name of a file or directory
{
DWORD dRetValue =0;
LPSTR lpFileNameA = NULL;
VALIDATE_PROTOTYPE(GetFileAttributes);
if (g_bRunningOnNT)
return GetFileAttributes(lpFileName);
lpFileNameA = ConvertWtoA( lpFileName );
dRetValue = GetFileAttributesA(lpFileNameA );
LocalFreeAndNull ( &lpFileNameA );
return dRetValue;
}
// CompareString
int WINAPI CompareStringWrapW( LCID Locale, // locale identifier
DWORD dwCmpFlags, // comparison-style options
LPCWSTR lpString1, // pointer to first string
int cchCount1, // size, in bytes or characters, of first string
LPCWSTR lpString2, // pointer to second string
int cchCount2 ) // size, in bytes or characters, of second string
{
int iRetValue =0;
LPSTR lpString1A = NULL,
lpString2A = NULL;
LPWSTR pszString1 = NULL,
pszString2 = NULL;
VALIDATE_PROTOTYPE(CompareString);
if (g_bRunningOnNT)
return CompareStringW(Locale, dwCmpFlags, lpString1, cchCount1, lpString2, cchCount2);
// [PaulHi] 4/1/99 Raid 75303 If the character count value(s) are -1 then the
// input string(s) are already zero terminated and can be converted to ANSI directly.
Assert(lpString1);
Assert(lpString2);
if (cchCount1 == -1)
{
// Already zero terminated string
// Not great to cast const to non-const, but we don't modify the string
pszString1 = (LPWSTR)lpString1;
}
else
{
// Convert to zero terminated string
pszString1 = LocalAlloc(LMEM_FIXED, (cchCount1+1)*sizeof(WCHAR));
if (!pszString1)
goto exit;
// Zero inited buffer
lstrcpynWrapW(pszString1, lpString1, cchCount1+1);
}
if (cchCount2 == -1)
{
// Already zero terminated string
// Not great to cast const to non-const, but we don't modify the string
pszString2 = (LPWSTR)lpString2;
}
else
{
// Convert to zero terminated string
pszString2 = LocalAlloc(LMEM_FIXED, (cchCount2+1)*sizeof(WCHAR));
if (!pszString2)
goto exit;
// Zero inited buffer
lstrcpynWrapW(pszString2, lpString2, cchCount2+1);
}
// Convert to ANSI, statistically improve our odds by checking that there
// wasn't data loss on the first character. It's too expensive to do a
// full test every time.
lpString1A = ConvertWtoA( pszString1 );
if (!lpString1A || (lpString1A[0]=='?' && pszString1[0]!=L'?'))
goto exit;
lpString2A = ConvertWtoA( pszString2 );
if (!lpString2A || (lpString2A[0]=='?' && pszString2[0]!=L'?'))
goto exit;
iRetValue = CompareStringA(Locale,dwCmpFlags,lpString1A,lstrlenA(lpString1A),lpString2A,lstrlenA(lpString2A));
exit:
LocalFreeAndNull( &lpString1A );
LocalFreeAndNull( &lpString2A );
// Only deallocate if allocated locally
if (pszString1 != (LPWSTR)lpString1)
LocalFreeAndNull( &pszString1 );
if (pszString2 != (LPWSTR)lpString2)
LocalFreeAndNull( &pszString2 );
return iRetValue;
}
// lstrcpy
LPTSTR WINAPI lstrcpyWrapW( LPTSTR lpString1, // pointer to buffer
LPCTSTR lpString2 ) // pointer to string to copy
{
VALIDATE_PROTOTYPE(lstrcpy);
if (g_bRunningOnNT)
return lstrcpyW(lpString1, lpString2);
CopyMemory(lpString1, lpString2, (My_wcslen(lpString2) + 1) * sizeof(WCHAR) );
return lpString1;
}
// lstrcmpi
int WINAPI lstrcmpiWrapW( LPCTSTR lpString1, // pointer to first string
LPCTSTR lpString2 ) // pointer to second string
{
int iRetValue = 0;
LPSTR lpString1A = NULL ;
LPSTR lpString2A = NULL ;
VALIDATE_PROTOTYPE(lstrcmpi);
if (g_bRunningOnNT)
return lstrcmpiW(lpString1, lpString2);
lpString1A = ConvertWtoA( lpString1 );
lpString2A = ConvertWtoA( lpString2 );
iRetValue = lstrcmpiA(lpString1A, lpString2A );
LocalFreeAndNull( &lpString1A );
LocalFreeAndNull( &lpString2A );
return iRetValue;
}
// LoadLibrary
HINSTANCE WINAPI LoadLibraryWrapW( LPCTSTR lpLibFileName ) // address of filename of executable module
{
HINSTANCE hRetValue =0;
LPSTR lpLibFileNameA = NULL;
VALIDATE_PROTOTYPE(LoadLibrary);
if (g_bRunningOnNT)
return LoadLibraryW(lpLibFileName);
lpLibFileNameA = ConvertWtoA(lpLibFileName);
hRetValue = LoadLibraryA( lpLibFileNameA );
LocalFreeAndNull( &lpLibFileNameA );
return hRetValue;
}
// GetTextExtentPoint32
BOOL WINAPI GetTextExtentPoint32WrapW(HDC hdc,
LPCWSTR pwszBuf,
int nLen,
LPSIZE psize)
{
LPSTR pszBuf = NULL;
BOOL bRtn = FALSE;
VALIDATE_PROTOTYPE(GetTextExtentPoint32);
if (g_bRunningOnNT)
return GetTextExtentPoint32W(hdc, pwszBuf, nLen, psize);
pszBuf = ConvertWtoA(pwszBuf);
if (pszBuf)
{
nLen = lstrlenA(pszBuf);
bRtn = GetTextExtentPoint32A(hdc, pszBuf, nLen, psize);
LocalFreeAndNull(&pszBuf);
}
else
{
psize->cx = 0;
psize->cy = 0;
}
return bRtn;
}
// GetTimeFormat
int WINAPI GetTimeFormatWrapW( LCID Locale, // locale for which time is to be formatted
DWORD dwFlags, // flags specifying function options
CONST SYSTEMTIME *lpTime, // time to be formatted
LPCTSTR lpFormat, // time format string
LPTSTR lpTimeStr, // buffer for storing formatted string
int cchTime ) // size, in bytes or characters, of the buffer
{
int iRetValue =0;
LPSTR lpFormatA = NULL;
LPWSTR lpTimeStrW = NULL;
LPSTR lpTimeStrA = NULL;
int cchTimeA=0, cchTimeW=0;
VALIDATE_PROTOTYPE(GetTimeFormat);
if (g_bRunningOnNT)
return GetTimeFormatW(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime);
lpFormatA = ConvertWtoA( lpFormat );
cchTimeA = GetTimeFormatA(Locale, dwFlags, lpTime, lpFormatA, NULL, 0);
lpTimeStrA = LocalAlloc(LMEM_ZEROINIT, cchTimeA );
iRetValue = GetTimeFormatA(Locale, dwFlags, lpTime, lpFormatA, lpTimeStrA, cchTimeA );
if ( iRetValue != 0 ) {
lpTimeStrW = ConvertAtoW( lpTimeStrA );
cchTimeW = My_wcslen( lpTimeStrW ) + 1;
iRetValue = cchTimeW;
if ( (cchTime !=0) && ( lpTimeStr != NULL ) ) {
CopyMemory(lpTimeStr, lpTimeStrW, cchTimeW * sizeof(WCHAR) );
}
LocalFreeAndNull( &lpTimeStrW );
}
LocalFreeAndNull( &lpFormatA );
LocalFreeAndNull( &lpTimeStrA );
return iRetValue;
}
// GetDateFormat
int WINAPI GetDateFormatWrapW( LCID Locale, // locale for which date is to be formatted
DWORD dwFlags, // flags specifying function options
CONST SYSTEMTIME *lpDate, // date to be formatted
LPCTSTR lpFormat, // date format string
LPTSTR lpDateStr, // buffer for storing formatted string
int cchDate ) // size of buffer
{
int iRetValue = 0;
LPSTR lpFormatA = NULL;
LPWSTR lpDateStrW = NULL;
LPSTR lpDateStrA = NULL;
int cchDateA, cchDateW;
VALIDATE_PROTOTYPE(GetDateFormat);
if (g_bRunningOnNT)
return GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, lpDateStr, cchDate);
lpFormatA = ConvertWtoA( lpFormat );
cchDateA = GetDateFormatA(Locale, dwFlags, lpDate, lpFormatA, NULL, 0);
lpDateStrA = LocalAlloc(LMEM_ZEROINIT, cchDateA );
iRetValue = GetDateFormatA(Locale, dwFlags, lpDate, lpFormatA, lpDateStrA, cchDateA );
if ( iRetValue != 0 ) {
lpDateStrW = ConvertAtoW( lpDateStrA );
cchDateW = My_wcslen( lpDateStrW ) + 1;
iRetValue = cchDateW;
if ( (cchDate !=0) && ( lpDateStr != NULL ) ) {
CopyMemory(lpDateStr, lpDateStrW, cchDateW * sizeof(WCHAR) );
}
LocalFreeAndNull( &lpDateStrW );
}
LocalFreeAndNull( &lpFormatA );
LocalFreeAndNull( &lpDateStrA );
return iRetValue;
}
// lstrcpyn
LPTSTR WINAPI lstrcpynWrapW( LPTSTR lpString1, // pointer to target buffer
LPCTSTR lpString2, // pointer to source string
int iMaxLength ) // number of bytes or characters to copy
{
int iLength = 0;
VALIDATE_PROTOTYPE(lstrcpyn);
if (g_bRunningOnNT)
return lstrcpynW(lpString1, lpString2, iMaxLength);
iLength = My_wcslen(lpString2);
if ( iLength >= iMaxLength )
iLength = iMaxLength-1;
CopyMemory(lpString1, lpString2, iLength * sizeof(WCHAR) );
lpString1[iLength] = 0x0000;
return lpString1;
}
// CreateFile
HANDLE WINAPI CreateFileWrapW( LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// pointer to security attributes
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile ) // handle to file with attributes to copy
{
LPSTR lpFileA = NULL;
HANDLE hFile = NULL;
VALIDATE_PROTOTYPE(CreateFile);
if (g_bRunningOnNT)
return CreateFileW( lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
lpFileA = ConvertWtoA(lpFileName);
hFile = CreateFileA(lpFileA,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
LocalFreeAndNull(&lpFileA);
return (hFile);
}
// OutputDebugString
VOID WINAPI OutputDebugStringWrapW(LPCTSTR lpOutputString ) // pointer to string to be displayed
{
LPSTR lpOutputStringA = NULL;
VALIDATE_PROTOTYPE(OutputDebugString);
if (g_bRunningOnNT) {
OutputDebugStringW(lpOutputString);
return;
}
lpOutputStringA = ConvertWtoA( lpOutputString );
OutputDebugStringA( lpOutputStringA );
LocalFreeAndNull( &lpOutputStringA );
}
// lstrcat
LPTSTR WINAPI lstrcatWrapW( LPTSTR lpString1, // pointer to buffer for concatenated strings
LPCTSTR lpString2 ) // pointer to string to add to string1
{
LPWSTR lpwStr = NULL;
VALIDATE_PROTOTYPE(lstrcat);
if (g_bRunningOnNT)
return lstrcatW(lpString1, lpString2);
lpwStr = lpString1 + My_wcslen(lpString1);
CopyMemory(lpwStr, lpString2, (My_wcslen(lpString2)+1) * sizeof(WCHAR) );
return lpString1;
}
// FormatMessage with va_list
//
// Since it's hard to muck with the Argument List, instead, we'll go throught
// the source string and explicitly turn any %x to %x!ws! indicating that the
// arguments have Wide Strings in them.
//
// For sanity we assume we won't ever get more than 9 arguments <BUGBUG>
//
static const LPWSTR lpWideFormat = TEXT("!ws!");
DWORD WINAPI FormatMessageWrapW( DWORD dwFlags, // source and processing options
LPCVOID lpSource, // pointer to message source
DWORD dwMessageId, // requested message identifier
DWORD dwLanguageId, // language identifier for requested message
LPTSTR lpBuffer, // pointer to message buffer
DWORD nSize, // maximum size of message buffer
va_list *Arguments ) // pointer to array of message inserts
{
DWORD dwResult=0, iNumArg, iNum;
LPSTR lpSourceA = NULL;
LPSTR pszBuffer = NULL;
LPWSTR lpTemp1=NULL, lpTemp2=NULL;
VALIDATE_PROTOTYPE(FormatMessage);
if (g_bRunningOnNT)
return FormatMessageW(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
// FORMAT_MESSAGE_FROM_STRING means that the source is a string.
// Otherwise, it's an opaque LPVOID (aka, an atom).
//
if ( !(dwFlags & FORMAT_MESSAGE_FROM_STRING) || !(dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ) {
return 0;
// we don't handle these cases
}
if ( !(dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) )
{
LPWSTR lpModifiedSource;
DebugTrace(TEXT("WARNING: FormatMessageWrap() is being called in Win9X with wide char argument strings. DBCS characters may not be converted correctly!"));
if(!(lpModifiedSource = LocalAlloc(LMEM_ZEROINIT, sizeof(TCHAR)*(lstrlen(lpSource)+1)*4))) // Four times is big enough
goto exit;
lpTemp1 = (LPWSTR)lpSource;
My_wcscpy(lpModifiedSource, lpSource);
lpTemp2 = lpModifiedSource;
while(lpTemp1 && *lpTemp1)
{
if( *lpTemp1 == '%' &&
(*(lpTemp1+1) >= '1' && *(lpTemp1+1) <= '9') &&
*(lpTemp1+2) != '!') //if there isn't a hard-coded printf format specified here
{
lpTemp2 += 2; //skip 2 to get past the %9
lpTemp1 += 2;
My_wcscpy(lpTemp2, lpWideFormat);
My_wcscat(lpTemp2, lpTemp1);
lpTemp2 += My_wcslen(lpWideFormat);
}
else
{
lpTemp1++;
lpTemp2++;
}
}
lpSourceA = ConvertWtoA( lpModifiedSource );
FormatMessageA(
dwFlags,
lpSourceA,
dwMessageId,
dwLanguageId,
(LPSTR)&pszBuffer,
0,
Arguments);
LocalFreeAndNull(&lpModifiedSource);
}
else
{
// We have an argument array. Convert wide strings to DBCS
// Create a new argument array and fill with converted (wide to DBCS)
// strings to ensure International DBCS conversion occurs correctly.
int n, nArgCount = 0, nBytes = 0;
LPVOID * pvArgArray = NULL;
lpTemp1 = (LPWSTR)lpSource;
while (*lpTemp1)
{
if (*lpTemp1 == '%')
{
if ( *(lpTemp1+1) == '%')
++lpTemp1; // "%%" not valid argument, step passed
else
++nArgCount; // valid argument
}
++lpTemp1;
}
pvArgArray = LocalAlloc(LMEM_ZEROINIT, (nArgCount * sizeof(LPVOID)));
if (!pvArgArray)
goto exit;
lpTemp1 = (LPWSTR)lpSource;
n = 0;
while (*lpTemp1)
{
if (*lpTemp1 == '%')
{
if (*(lpTemp1+1) == '%') // Skip "%%"
++lpTemp1;
else
{
if ( *(lpTemp1+1) >= '1' && *(lpTemp1+1) <= '9' &&
*(lpTemp1+2) != '!' ) // Default Unicode string arg
{
pvArgArray[n] = (LPVOID)ConvertWtoA( (LPWSTR) ((LPVOID *)Arguments)[n] );
nBytes += lstrlenA(pvArgArray[n]);
}
else
pvArgArray[n] = ((LPVOID *)Arguments)[n]; // unknown arg type
++n;
Assert(n <= nArgCount);
}
}
++lpTemp1;
}
// Check if known argument string lengths exceed 1023 bytes. If it does
// abort because Win9X will overrun a buffer and crash.
if (nBytes <= 1000)
{
lpSourceA = ConvertWtoA((LPWSTR)lpSource);
FormatMessageA(
dwFlags,
lpSourceA,
dwMessageId,
dwLanguageId,
(LPSTR)&pszBuffer,
0,
(va_list *)pvArgArray);
}
// Clean up
lpTemp1 = (LPWSTR)lpSource;
n = 0;
while (*lpTemp1)
{
if (*lpTemp1 == '%')
{
if (*(lpTemp1+1) == '%') // Skip "%%"
++lpTemp1;
else
{
if ( *(lpTemp1+1) >= '1' && *(lpTemp1+1) <= '9' &&
*(lpTemp1+2) != '!' )
{
LocalFree(pvArgArray[n]);
++n;
Assert(n <= nArgCount);
}
}
}
++lpTemp1;
}
LocalFree(pvArgArray);
}
if (pszBuffer)
{
LPWSTR *lpwBuffer;
lpwBuffer =(LPWSTR *)(lpBuffer);
*lpwBuffer = ConvertAtoW(pszBuffer);
dwResult = My_wcslen(*lpwBuffer);
LocalFree( pszBuffer );
}
exit:
LocalFreeAndNull(&lpSourceA);
return dwResult;
}
// GetModuleFileName
DWORD WINAPI GetModuleFileNameWrapW( HMODULE hModule, // handle to module to find filename for
LPTSTR lpFileName, // pointer to buffer to receive module path
DWORD nSize ) // size of buffer, in characters
{
DWORD dRetValue =0;
CHAR FileNameA[MAX_PATH];
LPWSTR lpFileNameW = NULL;
VALIDATE_PROTOTYPE(GetModuleFileName);
if (g_bRunningOnNT)
return GetModuleFileNameW(hModule, lpFileName, nSize);
dRetValue = GetModuleFileNameA(hModule, FileNameA, MAX_PATH);
if ( dRetValue == 0 ) return 0;
lpFileNameW = ConvertAtoW( FileNameA );
dRetValue = My_wcslen( lpFileNameW );
if ( dRetValue > nSize )
dRetValue = nSize;
CopyMemory(lpFileName, lpFileNameW, (dRetValue+1) * sizeof(WCHAR) );
LocalFreeAndNull( &lpFileNameW );
return dRetValue;
}
// GetPrivateProfileInt
UINT WINAPI GetPrivateProfileIntWrapW( LPCTSTR lpAppName, // address of section name
LPCTSTR lpKeyName, // address of key name
INT nDefault, // return value if key name is not found
LPCTSTR lpFileName ) // address of initialization filename
{
UINT uRetValue = 0;
LPSTR lpAppNameA = NULL;
LPSTR lpKeyNameA = NULL;
LPSTR lpFileNameA = NULL;
VALIDATE_PROTOTYPE(GetPrivateProfileInt);
if (g_bRunningOnNT)
return GetPrivateProfileIntW(lpAppName, lpKeyName, nDefault, lpFileName);
lpAppNameA = ConvertWtoA( lpAppName );
lpKeyNameA = ConvertWtoA( lpKeyName );
lpFileNameA= ConvertWtoA( lpFileName);
uRetValue = GetPrivateProfileIntA( lpAppNameA, lpKeyNameA, nDefault, lpFileNameA);
LocalFreeAndNull( &lpAppNameA );
LocalFreeAndNull( &lpKeyNameA );
LocalFreeAndNull( &lpFileNameA);
return uRetValue;
}
// IsBadStringPtr
BOOL WINAPI IsBadStringPtrWrapW( LPCTSTR lpsz, // address of string
UINT_PTR ucchMax ) // maximum size of string
{
VALIDATE_PROTOTYPE(IsBadStringPtr);
if (g_bRunningOnNT)
return IsBadStringPtrW(lpsz, ucchMax);
return IsBadStringPtrA( (LPSTR)lpsz, ucchMax * sizeof(WCHAR) );
}
// GetPrivateProfileString
DWORD WINAPI GetPrivateProfileStringWrapW( LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LPTSTR lpReturnedString, // points to destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName ) // points to initialization filename
{
DWORD dRetValue = 0;
LPSTR lpAppNameA = NULL;
LPSTR lpKeyNameA = NULL;
LPSTR lpDefaultA = NULL;
LPSTR lpReturnedStringA = NULL;
LPWSTR lpReturnedStringW = NULL;
LPSTR lpFileNameA = NULL;
DWORD nSizeA = 0;
VALIDATE_PROTOTYPE(GetPrivateProfileString);
if (g_bRunningOnNT)
return GetPrivateProfileStringW(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName);
lpAppNameA = ConvertWtoA( lpAppName );
lpKeyNameA = ConvertWtoA( lpKeyName );
lpDefaultA = ConvertWtoA( lpDefault );
lpFileNameA= ConvertWtoA( lpFileName );
nSizeA = nSize * sizeof(WCHAR)+1;
lpReturnedStringA = LocalAlloc( LMEM_ZEROINIT, nSizeA );
nSizeA = GetPrivateProfileStringA(lpAppNameA,lpKeyNameA,lpDefaultA,lpReturnedStringA,nSizeA,lpFileNameA);
lpReturnedStringW = ConvertAtoW( lpReturnedStringA );
dRetValue = My_wcslen( lpReturnedStringW );
My_wcscpy(lpReturnedString, lpReturnedStringW);
LocalFreeAndNull( &lpAppNameA );
LocalFreeAndNull( &lpKeyNameA );
LocalFreeAndNull( &lpDefaultA );
LocalFreeAndNull( &lpReturnedStringA );
LocalFreeAndNull( &lpReturnedStringW );
LocalFreeAndNull( &lpFileNameA );
return dRetValue;
}
// lstrcmp
int WINAPI lstrcmpWrapW( LPCTSTR lpString1, // pointer to first string
LPCTSTR lpString2 ) // pointer to second string
{
int iRetValue = 0;
LPSTR lpString1A = NULL ;
LPSTR lpString2A = NULL ;
VALIDATE_PROTOTYPE(lstrcmp);
if (g_bRunningOnNT)
return lstrcmpW(lpString1, lpString2);
lpString1A = ConvertWtoA( lpString1 );
lpString2A = ConvertWtoA( lpString2 );
iRetValue = lstrcmpA(lpString1A, lpString2A );
LocalFreeAndNull( &lpString1A );
LocalFreeAndNull( &lpString2A );
return iRetValue;
}
HANDLE WINAPI CreateMutexWrapW( LPSECURITY_ATTRIBUTES lpMutexAttributes,
// pointer to security attributes
BOOL bInitialOwner, // flag for initial ownership
LPCTSTR lpName ) // pointer to mutex-object name
{
LPSTR lpNameA = NULL;
HANDLE hMutex = NULL;
VALIDATE_PROTOTYPE(CreateMutex);
if (g_bRunningOnNT)
return CreateMutexW(lpMutexAttributes, bInitialOwner, lpName);
lpNameA = ConvertWtoA(lpName);
hMutex = CreateMutexA(lpMutexAttributes, bInitialOwner, lpNameA);
LocalFreeAndNull(&lpNameA);
return hMutex;
}
// GetTempPath
DWORD WINAPI GetTempPathWrapW( DWORD nBufferLength, // size, in characters, of the buffer
LPTSTR lpBuffer ) // pointer to buffer for temp. path
{
DWORD nRequired = 0;
CHAR lpBufferA[MAX_PATH];
LPWSTR lpBufferW = NULL;
VALIDATE_PROTOTYPE(GetTempPath);
if (g_bRunningOnNT)
return GetTempPathW(nBufferLength, lpBuffer);
nRequired = GetTempPathA(MAX_PATH, lpBufferA);
lpBufferW = ConvertAtoW(lpBufferA);
nRequired = My_wcslen(lpBufferW);
if ( nRequired < nBufferLength)
CopyMemory(lpBuffer, lpBufferW, (nRequired+1)*sizeof(WCHAR) );
return nRequired;
}
// ExpandEnvironmentStrings
DWORD WINAPI ExpandEnvironmentStringsWrapW( LPCTSTR lpSrc, // pointer to string with environment variables
LPTSTR lpDst, // pointer to string with expanded environment
// variables
DWORD nSize ) // maximum characters in expanded string
{
DWORD dRetValue = 0;
LPSTR lpSrcA = NULL;
LPSTR lpDstA = NULL;
LPWSTR lpDstW = NULL;
DWORD nSizeA = 0;
VALIDATE_PROTOTYPE(ExpandEnvironmentStrings);
if (g_bRunningOnNT)
return ExpandEnvironmentStringsW(lpSrc, lpDst, nSize);
nSizeA = nSize * sizeof(WCHAR);
lpDstA = LocalAlloc( LMEM_ZEROINIT, nSizeA );
lpSrcA = ConvertWtoA( lpSrc );
dRetValue = ExpandEnvironmentStringsA( lpSrcA, lpDstA, nSizeA );
lpDstW = ConvertAtoW( lpDstA );
dRetValue = My_wcslen( lpDstW );
if ( dRetValue < nSize )
My_wcscpy(lpDst, lpDstW);
LocalFreeAndNull( &lpSrcA );
LocalFreeAndNull( &lpDstA );
LocalFreeAndNull( &lpDstW );
return dRetValue;
}
// GetTempFileName
UINT WINAPI GetTempFileNameWrapW( LPCTSTR lpPathName, // pointer to directory name for temporary file
LPCTSTR lpPrefixString, // pointer to filename prefix
UINT uUnique, // number used to create temporary filename
LPTSTR lpTempFileName ) // pointer to buffer that receives the new filename
{
UINT uRetValue = 0;
LPSTR lpPathNameA = NULL;
LPSTR lpPrefixStringA = NULL;
CHAR lpTempFileNameA[MAX_PATH];
LPWSTR lpTempFileNameW = NULL;
VALIDATE_PROTOTYPE(GetTempFileName);
if (g_bRunningOnNT)
return GetTempFileNameW(lpPathName, lpPrefixString, uUnique, lpTempFileName);
lpPathNameA = ConvertWtoA( lpPathName );
lpPrefixStringA = ConvertWtoA( lpPrefixString );
uRetValue = GetTempFileNameA(lpPathNameA, lpPrefixStringA, uUnique, lpTempFileNameA);
if ( uRetValue != 0 ) {
lpTempFileNameW = ConvertAtoW( lpTempFileNameA );
My_wcscpy( lpTempFileName, lpTempFileNameW );
LocalFreeAndNull( &lpTempFileNameW );
}
LocalFreeAndNull( &lpPathNameA );
LocalFreeAndNull( &lpPrefixStringA );
return uRetValue;
}
// BOOL WINAPI ReleaseMutexWrapW( HANDLE hMutex ) // handle to mutex object
// DeleteFile
BOOL WINAPI DeleteFileWrapW( LPCTSTR lpFileName ) // pointer to name of file to delete
{
BOOL bRetValue ;
LPSTR lpFileNameA = NULL;
VALIDATE_PROTOTYPE(DeleteFile);
if (g_bRunningOnNT)
return DeleteFileW(lpFileName);
lpFileNameA = ConvertWtoA( lpFileName );
bRetValue = DeleteFileA( lpFileNameA );
LocalFreeAndNull( &lpFileNameA );
return bRetValue;
}
// CopyFile
BOOL WINAPI CopyFileWrapW( LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists ) // flag for operation if file exists
{
BOOL bRetValue;
LPSTR lpExistingFileNameA = NULL;
LPSTR lpNewFileNameA = NULL;
VALIDATE_PROTOTYPE(CopyFile);
if (g_bRunningOnNT)
return CopyFileW(lpExistingFileName, lpNewFileName, bFailIfExists);
lpExistingFileNameA = ConvertWtoA( lpExistingFileName );
lpNewFileNameA = ConvertWtoA( lpNewFileName );
bRetValue = CopyFileA( lpExistingFileNameA, lpNewFileNameA, bFailIfExists);
LocalFreeAndNull( & lpExistingFileNameA );
LocalFreeAndNull( & lpNewFileNameA );
return bRetValue;
}
// FindFirstChangeNotification
HANDLE WINAPI FindFirstChangeNotificationWrapW(LPCTSTR lpcwszFilePath, // Directory path of file to watch
BOOL bWatchSubtree, // Monitor entire tree
DWORD dwNotifyFilter) // Conditions to watch for
{
HANDLE hRet;
LPSTR lpszFilePath;
VALIDATE_PROTOTYPE(FindFirstChangeNotification);
Assert(lpcwszFilePath);
if (g_bRunningOnNT)
return FindFirstChangeNotification(lpcwszFilePath, bWatchSubtree, dwNotifyFilter);
lpszFilePath = ConvertWtoA(lpcwszFilePath);
hRet = FindFirstChangeNotificationA(lpszFilePath, bWatchSubtree, dwNotifyFilter);
LocalFreeAndNull(&lpszFilePath);
return hRet;
}
// FindFirstFile
HANDLE WINAPI FindFirstFileWrapW( LPCTSTR lpFileName, // pointer to name of file to search for
LPWIN32_FIND_DATA lpFindFileData ) // pointer to returned information
{
HANDLE hRetValue;
LPSTR lpFileNameA = NULL;
WIN32_FIND_DATAA FindFileDataA;
WIN32_FIND_DATAW FindFileDataW;
VALIDATE_PROTOTYPE(FindFirstFile);
if (g_bRunningOnNT)
return FindFirstFileW(lpFileName, lpFindFileData);
lpFileNameA = ConvertWtoA(lpFileName);
hRetValue = FindFirstFileA( lpFileNameA, &FindFileDataA );
if ( hRetValue != INVALID_HANDLE_VALUE ) {
CopyMemory( &FindFileDataW, &FindFileDataA, sizeof(WIN32_FIND_DATAA)-MAX_PATH-14 );
MultiByteToWideChar(GetACP(),0,FindFileDataA.cFileName,MAX_PATH,FindFileDataW.cFileName,MAX_PATH);
MultiByteToWideChar(GetACP(),0,FindFileDataA.cAlternateFileName,14,FindFileDataW.cAlternateFileName,14);
CopyMemory( lpFindFileData, &FindFileDataW, sizeof(WIN32_FIND_DATAW) );
}
LocalFreeAndNull( &lpFileNameA );
return hRetValue;
}
// GetDiskFreeSpace
BOOL WINAPI GetDiskFreeSpaceWrapW( LPCTSTR lpRootPathName, // pointer to root path
LPDWORD lpSectorsPerCluster, // pointer to sectors per cluster
LPDWORD lpBytesPerSector, // pointer to bytes per sector
LPDWORD lpNumberOfFreeClusters,
// pointer to number of free clusters
LPDWORD lpTotalNumberOfClusters )
// pointer to total number of clusters
{
BOOL bRetValue;
LPSTR lpRootPathNameA = NULL;
VALIDATE_PROTOTYPE(GetDiskFreeSpace);
if (g_bRunningOnNT)
return GetDiskFreeSpaceW(lpRootPathName,
lpSectorsPerCluster,
lpBytesPerSector,
lpNumberOfFreeClusters,
lpTotalNumberOfClusters);
lpRootPathNameA = ConvertWtoA( lpRootPathName );
bRetValue = GetDiskFreeSpaceA(lpRootPathNameA,
lpSectorsPerCluster,
lpBytesPerSector,
lpNumberOfFreeClusters,
lpTotalNumberOfClusters);
LocalFreeAndNull( & lpRootPathNameA );
return bRetValue;
}
// MoveFile
BOOL WINAPI MoveFileWrapW( LPCTSTR lpExistingFileName, // pointer to the name of the existing file
LPCTSTR lpNewFileName ) // pointer to the new name for the file
{
BOOL bRetValue;
LPSTR lpExistingFileNameA = NULL;
LPSTR lpNewFileNameA = NULL;
VALIDATE_PROTOTYPE(MoveFile);
if (g_bRunningOnNT)
return MoveFileW(lpExistingFileName, lpNewFileName);
lpExistingFileNameA = ConvertWtoA( lpExistingFileName );
lpNewFileNameA = ConvertWtoA( lpNewFileName );
bRetValue = MoveFileA( lpExistingFileNameA, lpNewFileNameA );
LocalFreeAndNull( &lpExistingFileNameA );
LocalFreeAndNull( &lpNewFileNameA );
return bRetValue;
}
// CreateEvent
HANDLE WINAPI CreateEventWrapW(LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes
BOOL bManualReset, // flag for manual-reset event
BOOL bInitialState, // flag for initial state
LPCTSTR lpcwszName) // pointer to event-object name
{
HANDLE hRet;
LPSTR lpszName;
VALIDATE_PROTOTYPE(CreateEvent);
if (g_bRunningOnNT)
return CreateEventW(lpEventAttributes, bManualReset, bInitialState, lpcwszName);
lpszName = ConvertWtoA(lpcwszName); // Handles NULL lpcwszName case
hRet = CreateEventA(lpEventAttributes, bManualReset, bInitialState, lpszName);
LocalFreeAndNull(&lpszName);
return hRet;
}
//SHELL32.DLL
HINSTANCE WINAPI ShellExecuteWrapW( HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd )
{
HINSTANCE hRetValue;
LPSTR lpOperationA = NULL;
LPSTR lpFileA = NULL;
LPSTR lpParametersA = NULL;
LPSTR lpDirectoryA = NULL;
VALIDATE_PROTOTYPE(ShellExecute);
if (g_bRunningOnNT)
return ShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
lpOperationA = ConvertWtoA( lpOperation );
lpFileA = ConvertWtoA( lpFile );
lpParametersA= ConvertWtoA( lpParameters );
lpDirectoryA = ConvertWtoA( lpDirectory );
hRetValue = ShellExecuteA(hwnd, lpOperationA, lpFileA, lpParametersA, lpDirectoryA, nShowCmd);
LocalFreeAndNull( &lpOperationA);
LocalFreeAndNull( &lpFileA );
LocalFreeAndNull( &lpParametersA );
LocalFreeAndNull( &lpDirectoryA );
return hRetValue;
}
// DragQueryFile
UINT WINAPI DragQueryFileWrapW( HDROP hDrop,
UINT iFile,
LPTSTR lpszFile,
UINT cch )
{
UINT uRetValue = 0;
LPSTR lpszFileA = NULL;
LPWSTR lpszFileW = NULL;
UINT cchA, cchW =0;
VALIDATE_PROTOTYPE(DragQueryFile);
if (g_bRunningOnNT)
return DragQueryFileW(hDrop, iFile, lpszFile, cch);
cchA = DragQueryFileA( hDrop, iFile, NULL, 0 );
lpszFileA = LocalAlloc(LMEM_ZEROINIT, cchA+1 );
uRetValue = DragQueryFileA(hDrop, iFile, lpszFileA, cchA+1);
lpszFileW = ConvertAtoW( lpszFileA );
cchW = My_wcslen( lpszFileW );
if ( lpszFile )
CopyMemory( lpszFile, lpszFileW, (cchW+1)*sizeof(WCHAR) );
LocalFreeAndNull( &lpszFileA );
LocalFreeAndNull( &lpszFileW );
return cchW;
}
//USER32.DLL
// CharPrev
LPTSTR WINAPI CharPrevWrapW( LPCTSTR lpszStart, // pointer to first character
LPCTSTR lpszCurrent ) // pointer to current character
{
LPWSTR lpszReturn = NULL;
VALIDATE_PROTOTYPE(CharPrev);
if (g_bRunningOnNT)
return CharPrevW(lpszStart, lpszCurrent);
if (lpszCurrent == lpszStart)
lpszReturn = (LPWSTR)lpszStart;
lpszReturn = (LPWSTR)lpszCurrent - 1;
return lpszReturn;
}
// DrawText
int WINAPI DrawTextWrapW( HDC hDC, // handle to device context
LPCTSTR lpString, // pointer to string to draw
int nCount, // string length, in characters
LPRECT lpRect, // pointer to struct with formatting dimensions
UINT uFormat ) // text-drawing flags
{
int iRetValue = 0;
LPSTR lpStringA = NULL;
VALIDATE_PROTOTYPE(DrawText);
if (g_bRunningOnNT)
return DrawTextW(hDC, lpString, nCount, lpRect, uFormat);
lpStringA = ConvertWtoA( lpString );
iRetValue = DrawTextA(hDC, lpStringA, nCount, lpRect, uFormat);
LocalFreeAndNull( &lpStringA );
return iRetValue;
}
// ModifyMenu
BOOL WINAPI ModifyMenuWrapW( HMENU hMenu, // handle to menu
UINT uPosition, // menu item to modify
UINT uFlags, // menu item flags
UINT_PTR uIDNewItem, // menu item identifier or handle to drop-down
// menu or submenu
LPCTSTR lpNewItem ) // menu item content
{
BOOL bRetValue;
LPSTR lpNewItemA = NULL;
VALIDATE_PROTOTYPE(ModifyMenu);
if (g_bRunningOnNT)
return ModifyMenuW(hMenu, uPosition, uFlags, uIDNewItem, lpNewItem);
Assert(lpNewItem);
// [PaulHi] 4/5/99 Raid 75428 MF_STRING is defined to be 0x00000000. Need
// to check alternative interpretations of lpNewItem.
// MF_BITMAP = 0x00000004L
// MF_OWNERDRAW = 0x00000100L
// If this Assert fires then it implies that a new bit defining lpNewItem may have
// been added to this API!!! If so add this definition to the uFlags if statement.
Assert( !(uFlags & ~(MF_BITMAP|MF_BYCOMMAND|MF_BYPOSITION|MF_CHECKED|MF_DISABLED|MF_GRAYED|MF_MENUBARBREAK|MF_MENUBREAK|MF_OWNERDRAW|MF_POPUP|MF_SEPARATOR|MF_UNCHECKED)));
if (uFlags & (MF_BITMAP | MF_OWNERDRAW)) // lpNewItem is NOT a string pointer
return ModifyMenuA(hMenu, uPosition, uFlags, uIDNewItem, (LPCSTR)lpNewItem);
lpNewItemA = ConvertWtoA( lpNewItem );
bRetValue = ModifyMenuA(hMenu, uPosition, uFlags, uIDNewItem, lpNewItemA);
LocalFreeAndNull( &lpNewItemA );
return bRetValue;
}
// InsertMenu
BOOL WINAPI InsertMenuWrapW( HMENU hMenu, // handle to menu
UINT uPosition, // menu item that new menu item precedes
UINT uFlags, // menu item flags
UINT_PTR uIDNewItem, // menu item identifier or handle to drop-down
// menu or submenu
LPCTSTR lpNewItem ) // menu item content
{
BOOL bRetValue;
LPSTR lpNewItemA = NULL;
VALIDATE_PROTOTYPE(InsertMenu);
if (g_bRunningOnNT)
return InsertMenuW(hMenu, uPosition, uFlags, uIDNewItem, lpNewItem);
if (uFlags & MF_BITMAP || uFlags & MF_OWNERDRAW) // if anything but MF_STRING .. note: MF_STRING = 0x00000000
return InsertMenuA(hMenu, uPosition, uFlags, uIDNewItem, (LPCSTR)lpNewItem);
lpNewItemA = ConvertWtoA( lpNewItem );
bRetValue = InsertMenuA(hMenu, uPosition, uFlags, uIDNewItem, lpNewItemA);
LocalFreeAndNull( &lpNewItemA );
return bRetValue;
}
// LoadImage
HANDLE WINAPI LoadImageWrapW( HINSTANCE hinst, // handle of the instance containing the image
LPCTSTR lpszName, // name or identifier of image
UINT uType, // type of image
int cxDesired, // desired width
int cyDesired, // desired height
UINT fuLoad ) // load flags
{
HANDLE hRetValue;
LPSTR lpszNameA = NULL;
VALIDATE_PROTOTYPE(LoadImage);
if (g_bRunningOnNT)
return LoadImageW(hinst, lpszName, uType, cxDesired, cyDesired, fuLoad);
lpszNameA = ConvertWtoA( lpszName );
hRetValue = LoadImageA(hinst, lpszNameA, uType, cxDesired, cyDesired, fuLoad);
LocalFreeAndNull( & lpszNameA );
return hRetValue;
}
// GetClassInfoEx
BOOL WINAPI GetClassInfoExWrapW( HINSTANCE hinst, // handle of application instance
LPCTSTR lpszClass, // address of class name string
LPWNDCLASSEX lpwcx ) // address of structure for class data
{
BOOL bRetValue;
LPSTR lpszClassA = NULL;
WNDCLASSEXA wcxA;
WNDCLASSEXW wcxW;
VALIDATE_PROTOTYPE(GetClassInfoEx);
if (g_bRunningOnNT)
return GetClassInfoExW(hinst, lpszClass, lpwcx);
lpszClassA = ConvertWtoA( lpszClass );
wcxA.cbSize = sizeof( WNDCLASSEXA );
bRetValue = GetClassInfoExA( hinst, lpszClassA, &wcxA );
if ( bRetValue == FALSE ) {
LocalFreeAndNull( &lpszClassA );
return bRetValue;
}
CopyMemory( &wcxW, &wcxA, sizeof(WNDCLASSEXA) );
wcxW.cbSize = sizeof(WNDCLASSEXW);
if ( wcxA.lpszMenuName && !IS_INTRESOURCE(wcxA.lpszMenuName) )
wcxW.lpszMenuName = ConvertAtoW( wcxA.lpszMenuName );
if ( wcxA.lpszClassName && !IS_INTRESOURCE(wcxA.lpszClassName) ) // lpszClassName can be an atom, high word is null
wcxW.lpszClassName = ConvertAtoW( wcxA.lpszClassName );
CopyMemory(lpwcx, &wcxW, sizeof(WNDCLASSEXW) );
LocalFreeAndNull( &lpszClassA );
return bRetValue;
}
// LoadString
int WINAPI LoadStringWrapW( HINSTANCE hInstance, // handle to module containing string resource
UINT uID, // resource identifier
LPTSTR lpBuffer, // pointer to buffer for resource
int nBufferMax ) // size of buffer
{
int iRetValue = 0;
LPSTR lpBufferA = NULL;
int nBuffer = 0;
LPWSTR lpBufferW= NULL;
VALIDATE_PROTOTYPE(LoadString);
if (g_bRunningOnNT)
return LoadStringW(hInstance, uID, lpBuffer, nBufferMax);
nBuffer = nBufferMax * sizeof(WCHAR);
lpBufferA = LocalAlloc(LMEM_ZEROINIT, nBuffer );
iRetValue = LoadStringA(hInstance, uID, lpBufferA, nBuffer);
lpBufferW = ConvertAtoW( lpBufferA );
nBuffer = My_wcslen( lpBufferW );
if ( nBuffer >= nBufferMax )
nBuffer = nBufferMax - 1;
CopyMemory(lpBuffer, lpBufferW, nBuffer * sizeof( WCHAR) );
lpBuffer[nBuffer] = 0x0000;
LocalFreeAndNull( &lpBufferA );
LocalFreeAndNull( &lpBufferW );
return nBuffer;
}
// CharNext
LPTSTR WINAPI CharNextWrapW( LPCTSTR lpsz ) // pointer to current character
{
LPWSTR lpwsz = NULL;
VALIDATE_PROTOTYPE(CharNext);
if (g_bRunningOnNT)
return CharNextW(lpsz);
if ( *lpsz == 0x0000 )
lpwsz = (LPWSTR)lpsz;
else
lpwsz = (LPWSTR)lpsz + 1;
return lpwsz;
}
LRESULT WINAPI ListView_GetItemTextA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVITEMA lviA;
LPLVITEMW lplviW;
LPSTR lpszText;
LPWSTR lpszTextW;
DWORD iMinLen;
lplviW = (LPLVITEMW) lParam;
CopyMemory( &lviA, lplviW, sizeof( LVITEMA ) );
iMinLen = lplviW->cchTextMax * sizeof( WCHAR );
lpszText = LocalAlloc( LMEM_ZEROINIT, iMinLen );
lviA.cchTextMax = iMinLen ;
lviA.pszText = lpszText;
lRetValue = SendMessageA(hWnd, LVM_GETITEMTEXTA, wParam, (LPARAM)(LVITEMA FAR *)&lviA );
lpszTextW = ConvertAtoW( lviA.pszText );
if ( iMinLen > (lstrlenW( lpszTextW ) + 1) * sizeof( WCHAR) )
iMinLen = (lstrlenW( lpszTextW ) + 1) * sizeof( WCHAR) ;
CopyMemory( lplviW->pszText, lpszTextW, iMinLen );
LocalFreeAndNull( &lpszText );
LocalFreeAndNull( &lpszTextW );
return lRetValue;
}
LRESULT WINAPI ListView_GetItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVITEMA lviA;
LPLVITEMW lplviW = NULL;
LPSTR lpszText = NULL;
LPWSTR lpszTextW = NULL;
DWORD iMinLen;
lplviW = (LPLVITEMW) lParam;
CopyMemory( &lviA, lplviW, sizeof( LVITEMA ) );
iMinLen = 0;
if ( lplviW->mask & LVIF_TEXT ) {
iMinLen = lplviW->cchTextMax * sizeof( WCHAR );
lpszText = LocalAlloc( LMEM_ZEROINIT, iMinLen );
lviA.cchTextMax = iMinLen ;
lviA.pszText = lpszText;
}
lRetValue = SendMessageA(hWnd, LVM_GETITEMA, wParam, (LPARAM)(LVITEMA FAR *)&lviA );
lplviW->mask = lviA.mask;
lplviW->iItem = lviA.iItem;
lplviW->iSubItem = lviA.iSubItem;
lplviW->state = lviA.state;
lplviW->stateMask = lviA.stateMask;
lplviW->iImage = lviA.iImage;
lplviW->lParam = lviA.lParam;
#if (_WIN32_IE >= 0x0300)
lplviW->iIndent = lviA.iIndent;
#endif
if ( lplviW->mask & LVIF_TEXT ) {
lpszTextW = ConvertAtoW( lviA.pszText );
if ( iMinLen > (lstrlenW( lpszTextW ) + 1) * sizeof( WCHAR) )
iMinLen = (lstrlenW( lpszTextW ) + 1) * sizeof( WCHAR) ;
CopyMemory( lplviW->pszText, lpszTextW, iMinLen );
}
LocalFreeAndNull( &lpszText );
LocalFreeAndNull( &lpszTextW );
return lRetValue;
}
LRESULT WINAPI ListView_InsertItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVITEMA lviA;
LPLVITEMW lplviW;
LPSTR lpszText = NULL;
lplviW = (LPLVITEMW) lParam;
CopyMemory( &lviA, lplviW, sizeof( LVITEMA ) );
if ( (lplviW->mask & LVIF_TEXT) && (lplviW->pszText != NULL) ) {
lpszText = ConvertWtoA( lplviW->pszText );
lviA.cchTextMax = lstrlenA( lpszText ) + 1 ;
}
lviA.pszText = lpszText;
lRetValue = SendMessageA(hWnd, LVM_INSERTITEMA, wParam, (LPARAM)(LVITEMA FAR *)&lviA );
LocalFreeAndNull( &lpszText );
return lRetValue;
}
LRESULT WINAPI ListView_SetItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVITEMA lviA;
LPLVITEMW lplviW;
LPSTR lpszText = NULL;
lplviW = (LPLVITEMW) lParam;
CopyMemory( &lviA, lplviW, sizeof( LVITEMA ) );
if ( (lplviW->mask & LVIF_TEXT ) && (lplviW->pszText != NULL) ) {
lpszText = ConvertWtoA( lplviW->pszText );
lviA.cchTextMax = lstrlenA( lpszText ) + 1 ;
lviA.pszText = lpszText;
}
lRetValue = SendMessageA(hWnd, LVM_SETITEMA, wParam, (LPARAM)(LVITEMA FAR *)&lviA );
LocalFreeAndNull( &lpszText );
return lRetValue;
}
LRESULT WINAPI ListView_SetItemTextA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVITEMA lviA;
LPLVITEMW lplviW;
LPSTR lpszText;
lplviW = (LPLVITEMW) lParam;
CopyMemory( &lviA, lplviW, sizeof( LVITEMA ) );
lpszText = ConvertWtoA( lplviW->pszText );
lviA.cchTextMax = lstrlenA( lpszText ) + 1 ;
lviA.pszText = lpszText;
lRetValue = SendMessageA(hWnd, LVM_SETITEMTEXTA, wParam, (LPARAM)(LVITEMA FAR *)&lviA );
LocalFreeAndNull( &lpszText );
return lRetValue;
}
LRESULT WINAPI ListView_SetColumnA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVCOLUMNA lvcA;
LPLVCOLUMNW lplvcW;
LPSTR lpszText = NULL;
lplvcW = (LPLVCOLUMNW) lParam;
CopyMemory( &lvcA, lplvcW, sizeof( LVCOLUMNA ) );
if ( (lplvcW->mask & LVCF_TEXT ) && (lplvcW->pszText != NULL) ) {
lpszText = ConvertWtoA( lplvcW->pszText );
lvcA.cchTextMax = lstrlenA( lpszText ) + 1 ;
}
lvcA.pszText = lpszText;
lRetValue = SendMessageA(hWnd, LVM_SETCOLUMNA, wParam, (LPARAM)(LPLVCOLUMNA)&lvcA );
LocalFreeAndNull( &lpszText );
return lRetValue;
}
LRESULT WINAPI ListView_InsertColumnA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LVCOLUMNA lvcA;
LPLVCOLUMNW lplvcW;
LPSTR lpszText = NULL;
lplvcW = (LPLVCOLUMNW) lParam;
CopyMemory( &lvcA, lplvcW, sizeof( LVCOLUMNA ) );
if ( (lplvcW->mask & LVCF_TEXT ) && (lplvcW->pszText != NULL) ) {
lpszText = ConvertWtoA( lplvcW->pszText );
lvcA.cchTextMax = lstrlenA( lpszText ) + 1 ;
}
lvcA.pszText = lpszText;
lRetValue = SendMessageA(hWnd, LVM_INSERTCOLUMNA, wParam, (LPARAM)(LPLVCOLUMNA)&lvcA );
LocalFreeAndNull( &lpszText );
return lRetValue;
}
LRESULT WINAPI ListView_FindItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpsz = NULL;
LVFINDINFOA lvfiA;
LPFINDINFOW lplvfiW;
lplvfiW = (LPFINDINFOW) lParam;
CopyMemory( &lvfiA, lplvfiW, sizeof(LVFINDINFOA ) );
if ( (lplvfiW->flags & LVFI_PARTIAL) || (lplvfiW->flags & LVFI_STRING) ) {
if ( lplvfiW->psz != NULL ) {
lpsz = ConvertWtoA( lplvfiW->psz );
}
}
lvfiA.psz = lpsz;
if ( lplvfiW->flags & LVFI_PARAM ) {
// we must convert field lParam, but this is not the case in our current code
// so ignore it.
if ( lplvfiW->lParam )
lvfiA.lParam = lplvfiW->lParam;
}
lRetValue = SendMessageA(hWnd, LVM_FINDITEMA, wParam, (LPARAM)(LVFINDINFOA FAR *)&lvfiA );
LocalFreeAndNull( &lpsz );
return lRetValue;
}
LRESULT WINAPI ListView_SortItemsA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
// not implement yet.
return SendMessageA( hWnd, Msg, wParam, lParam );
}
LRESULT WINAPI ListView_EditLabelA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
return SendMessageA(hWnd, LVM_EDITLABELA, wParam, lParam );
}
LRESULT WINAPI ToolBar_AddString(HWND hWnd, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR pStringA = NULL;
LPWSTR pStringW = NULL;
LPSTR pStringA_T = NULL, pStringAA = NULL;
DWORD dwLen;
WPARAM wParam = 0;
// get the total length of pStringW
if (g_bRunningOnNT)
return SendMessageW(hWnd, TB_ADDSTRINGW, wParam, lParam );
dwLen = 0;
pStringW = (LPWSTR)(lParam);
while ( *pStringW != TEXT('\0') ) {
dwLen += lstrlenW(pStringW) + 1;
pStringW += lstrlenW(pStringW) + 1;
}
dwLen += 1; // for the last null terminator
pStringW = (LPWSTR)( lParam );
pStringA = LocalAlloc( LMEM_ZEROINIT, dwLen * sizeof(WCHAR) );
pStringA_T = pStringA;
while ( *pStringW != TEXT('\0') ) {
pStringAA = ConvertWtoA(pStringW );
pStringW += lstrlenW(pStringW) + 1;
strcpy(pStringA_T, pStringAA );
LocalFreeAndNull( &pStringAA );
pStringA_T += lstrlenA( pStringA_T ) + 1;
}
pStringA_T[lstrlenA(pStringA_T)+1] = '\0';
lRetValue = SendMessageA(hWnd, TB_ADDSTRINGA, wParam, (LPARAM)pStringA );
LocalFreeAndNull( &pStringA );
return lRetValue;
}
LRESULT WINAPI ToolBar_AddButtons(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if (g_bRunningOnNT)
return SendMessageW( hWnd, TB_ADDBUTTONSW, wParam, lParam );
return SendMessageA( hWnd, TB_ADDBUTTONSA, wParam, lParam );
}
LRESULT WINAPI TreeView_GetItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
TVITEMA tviA;
LPTVITEMW lptviW;
LPWSTR lpszTextW = NULL;
LPSTR lpszTextA = NULL;
lptviW = (LPTVITEMW) lParam;
CopyMemory( &tviA, lptviW, sizeof( TVITEMA ) );
if ( lptviW->mask & TVIF_TEXT ) {
lpszTextA = ConvertWtoA( lptviW->pszText ) ;
tviA.pszText = lpszTextA;
tviA.cchTextMax = lstrlenA( lpszTextA ) + 1;
}
lRetValue = SendMessageA( hWnd, TVM_GETITEMA, wParam, (LPARAM)(LPTVITEMA)&tviA );
if ( lptviW->mask & TVIF_TEXT )
lpszTextW = ConvertAtoW( tviA.pszText );
lptviW->mask = tviA.mask;
lptviW->hItem = tviA.hItem;
lptviW->state = tviA.state;
lptviW->stateMask = tviA.stateMask;
if ( lpszTextW ) {
CopyMemory(lptviW->pszText, lpszTextW, (lstrlenW(lpszTextW)+1) * sizeof(WCHAR) );
lptviW->cchTextMax = lstrlenW( lpszTextW ) + 1;
}
lptviW->iImage = tviA.iImage;
lptviW->iSelectedImage = tviA.iSelectedImage;
lptviW->cChildren = tviA.cChildren;
lptviW->lParam = tviA.lParam;
LocalFreeAndNull( &lpszTextA );
LocalFreeAndNull( &lpszTextW );
return lRetValue;
}
LRESULT WINAPI TreeView_SetItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
TVITEMA tviA;
LPTVITEMW lptviW;
LPSTR pszTextA = NULL;
lptviW = (LPTVITEMW) lParam;
CopyMemory( &tviA, lptviW, sizeof( TVITEMA ) );
if ( (lptviW->mask & TVIF_TEXT) && (lptviW->pszText != NULL) ) {
pszTextA = ConvertWtoA( lptviW->pszText );
tviA.cchTextMax = lstrlenA( pszTextA );
}
tviA.pszText = pszTextA;
lRetValue = SendMessageA( hWnd, TVM_SETITEMA, wParam, (LPARAM)(const TV_ITEM FAR*)&tviA );
LocalFreeAndNull( &pszTextA );
return lRetValue;
}
LRESULT WINAPI TreeView_InsertItemA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR pszTextA = NULL;
TVINSERTSTRUCTA tvisA;
LPTVINSERTSTRUCTW lptvisW;
lptvisW = (LPTVINSERTSTRUCTW)lParam;
CopyMemory( &tvisA, lptvisW, sizeof( TVINSERTSTRUCTA ) );
if ( ((lptvisW->item).mask & TVIF_TEXT) && ((lptvisW->item).pszText != NULL) ) {
pszTextA = ConvertWtoA( (lptvisW->item).pszText );
tvisA.item.cchTextMax = lstrlenA( pszTextA );
tvisA.item.pszText = pszTextA;
}
lRetValue = SendMessageA( hWnd, TVM_INSERTITEMA, wParam, (LPARAM)(LPTVINSERTSTRUCTA)&tvisA );
LocalFreeAndNull( &pszTextA );
return lRetValue;
}
// Tab Control Message Wrapper
LRESULT WINAPI TabCtrl_InsertItemA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
LRESULT lRetValue;
TCITEMA tciA;
LPTCITEMW lptciW = NULL;
LPSTR pszText = NULL;
lptciW = (LPTCITEMW) lParam;
CopyMemory( &tciA, lptciW, sizeof(TCITEMA ) );
if ( lptciW->mask & TCIF_TEXT ) {
pszText = ConvertWtoA( lptciW->pszText );
tciA.pszText = pszText;
tciA.cchTextMax = lstrlenA( pszText ) + 1;
}
lRetValue = SendMessageA( hWnd, TCM_INSERTITEMA, wParam, (LPARAM)(LPTCITEMA)&tciA);
LocalFreeAndNull( &pszText );
return lRetValue;
}
// List Box Control Message wrapper
LRESULT WINAPI ListBox_AddStringA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
lpszStrW = (LPWSTR)lParam;
lpszStrA = ConvertWtoA(lpszStrW);
lRetValue = SendMessageA(hWnd, LB_ADDSTRING, wParam, (LPARAM)lpszStrA);
LocalFreeAndNull(&lpszStrA);
return lRetValue;
}
// Combo List Control Message wrapper
LRESULT WINAPI Combo_AddStringA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
lpszStrW = (LPWSTR)lParam;
lpszStrA = ConvertWtoA( lpszStrW );
lRetValue = SendMessageA(hWnd, CB_ADDSTRING, wParam, (LPARAM)lpszStrA );
LocalFreeAndNull( &lpszStrA );
return lRetValue;
}
LRESULT WINAPI Combo_GetLBTextA(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
int nBytes;
Assert(lParam);
*((LPWSTR)lParam) = '\0';
// Allocate the single byte char buffer to the correct size
nBytes = (int) SendMessageA(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
lpszStrA = LocalAlloc(LMEM_FIXED, nBytes);
if (!lpszStrA)
{
Assert(0);
return 0;
}
*lpszStrA = '\0';
lRetValue = SendMessageA(hWnd, CB_GETLBTEXT, wParam, (LPARAM)(lpszStrA));
if ( lRetValue == CB_ERR )
return CB_ERR;
// lRetValue is the length of string lpszStrA, in Bytes.
// to make sure lpszStrA is Null-terminated.
lpszStrA[lRetValue] = '\0';
lpszStrW = ConvertAtoW( lpszStrA );
lRetValue = lstrlenW( lpszStrW ) * sizeof(WCHAR);
CopyMemory( (LPWSTR)lParam, lpszStrW, lRetValue + sizeof(WCHAR) );
LocalFreeAndNull(&lpszStrW);
LocalFreeAndNull(&lpszStrA);
return (LRESULT)lRetValue;
}
LRESULT WINAPI Combo_InsertStringA(HWND hWnd,UINT Msg, WPARAM wParam,LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
lpszStrW = (LPWSTR)lParam;
lpszStrA = ConvertWtoA( lpszStrW );
lRetValue = SendMessageA(hWnd, CB_INSERTSTRING, wParam, (LPARAM)lpszStrA );
LocalFreeAndNull( &lpszStrA );
return lRetValue;
}
LRESULT WINAPI Combo_FindStringA(HWND hWnd,UINT Msg, WPARAM wParam,LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
lpszStrW = (LPWSTR)lParam;
lpszStrA = ConvertWtoA( lpszStrW );
lRetValue = SendMessageA(hWnd, CB_FINDSTRING, wParam, (LPARAM)lpszStrA );
LocalFreeAndNull( &lpszStrA );
return lRetValue;
}
// Animation Control wrappers
LRESULT WINAPI Animate_OpenA( HWND hWnd,UINT Msg, WPARAM wParam,LPARAM lParam)
{
LRESULT lRetValue;
// lParam pointers to a string or resource String ID,
// in our codes, only Resources IDs are passed to this function
// so we don't want to convert value for this parameter
lRetValue = SendMessageA( hWnd, ACM_OPENA, wParam, lParam );
return lRetValue;
}
// Tooltip Wrappers
LRESULT WINAPI ToolTip_AddTool(HWND hWnd,LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
TOOLINFOA TIA = {0};
LPTOOLINFOW lpTIW = (LPTOOLINFOW)lParam;
WPARAM wParam = 0;
if (g_bRunningOnNT)
return SendMessageW(hWnd, TTM_ADDTOOLW, wParam, lParam);
if(!lpTIW)
return 0;
CopyMemory(&TIA, lpTIW, sizeof(TOOLINFOA));
TIA.lpszText = ConvertWtoA(lpTIW->lpszText);
lRetValue = SendMessageA(hWnd, TTM_ADDTOOLA, wParam, (LPARAM)&TIA );
LocalFreeAndNull( &TIA.lpszText );
return lRetValue;
}
//
// Guess what TTM_UPDATETIPTEXT is the same as EM_FORMATRANGE .. therefore can't use it
// through the SendMessage wrapper .. need our own function for this
LRESULT WINAPI ToolTip_UpdateTipText(HWND hWnd,LPARAM lParam)
{
LRESULT lRetValue;
LPSTR lpszStrA = NULL;
LPWSTR lpszStrW = NULL;
TOOLINFOA TIA = {0};
LPTOOLINFOW lpTIW = (LPTOOLINFOW)lParam;
WPARAM wParam = 0;
if (g_bRunningOnNT)
return SendMessageW(hWnd, TTM_UPDATETIPTEXTW, wParam, lParam);
if(!lpTIW)
return 0;
CopyMemory(&TIA, lpTIW, sizeof(TOOLINFOA));
TIA.lpszText = ConvertWtoA(lpTIW->lpszText);
lRetValue = SendMessageA(hWnd, TTM_UPDATETIPTEXTA, wParam, (LPARAM)&TIA );
LocalFreeAndNull( &TIA.lpszText );
return lRetValue;
}
// SendMessage WM_SETTEXT
LRESULT WINAPI WM_SetTextA( HWND hWnd, UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
LRESULT lRetValue = 0;
LPSTR lpA = ConvertWtoA((LPCWSTR)lParam);
lRetValue = SendMessageA(hWnd, WM_SETTEXT, wParam, (LPARAM)lpA);
LocalFreeAndNull(&lpA);
return lRetValue;
}
// SendMessage
//
// There is a big potential problem with this function .. since we
// are passing ALL the messages through this function, if there are any over-lapping
// message ids (e.g. TTM_UPDATETIPTEXT for tooltips is the same as EM_FORMATRANGE
// for the RichEdit control) with the result that we may route the wrong message to the
// wrong handler.. need to be careful about handling any messages in the WM_USER range ..
// This is specially true for a bunch of CommCtrls.
//
LRESULT WINAPI SendMessageWrapW( HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
VALIDATE_PROTOTYPE(SendMessage);
if (g_bRunningOnNT)
return SendMessageW(hWnd, Msg, wParam, lParam);
switch (Msg) {
case WM_SETTEXT:
return WM_SetTextA(hWnd, Msg, wParam, lParam);
// for ListView Message
case LVM_GETITEMTEXT :
return ListView_GetItemTextA(hWnd, Msg, wParam, lParam);
case LVM_GETITEM :
return ListView_GetItemA(hWnd, Msg, wParam, lParam);
case LVM_INSERTCOLUMN :
return ListView_InsertColumnA( hWnd, Msg, wParam, lParam);
case LVM_INSERTITEM :
return ListView_InsertItemA(hWnd, Msg, wParam, lParam);
case LVM_SETITEM :
return ListView_SetItemA(hWnd, Msg, wParam, lParam);
case LVM_SETITEMTEXT :
return ListView_SetItemTextA(hWnd, Msg, wParam, lParam);
case LVM_SETCOLUMN :
return ListView_SetColumnA(hWnd, Msg, wParam, lParam);
case LVM_FINDITEM :
return ListView_FindItemA(hWnd, Msg, wParam, lParam);
case LVM_SORTITEMS :
return ListView_SortItemsA(hWnd, Msg, wParam, lParam);
case LVM_EDITLABEL :
return ListView_EditLabelA(hWnd, Msg, wParam, lParam);
// For TreeView Message
case TVM_GETITEM :
return TreeView_GetItemA(hWnd, Msg, wParam, lParam);
case TVM_SETITEM :
return TreeView_SetItemA(hWnd, Msg, wParam, lParam);
case TVM_INSERTITEM :
return TreeView_InsertItemA(hWnd, Msg, wParam, lParam);
// For TabCtrl Message
case TCM_INSERTITEM :
return TabCtrl_InsertItemA( hWnd, Msg, wParam, lParam);
// For ComBo List Control
case CB_ADDSTRING :
return Combo_AddStringA(hWnd, Msg, wParam, lParam);
case CB_GETLBTEXT :
return Combo_GetLBTextA(hWnd, Msg, wParam, lParam);
case CB_INSERTSTRING :
return Combo_InsertStringA(hWnd, Msg, wParam, lParam);
case CB_FINDSTRING :
return Combo_FindStringA(hWnd, Msg, wParam, lParam);
// For ListBox Control
case LB_ADDSTRING:
return ListBox_AddStringA(hWnd, Msg, wParam, lParam);
// For Animation Control
case ACM_OPEN :
return Animate_OpenA( hWnd, Msg, wParam, lParam);
// For Others
default :
return SendMessageA(hWnd, Msg, wParam, lParam);
}
}
// DefWindowProc
LRESULT WINAPI DefWindowProcWrapW( HWND hWnd, // handle to window
UINT Msg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
VALIDATE_PROTOTYPE(DefWindowProc);
if (g_bRunningOnNT)
return DefWindowProcW(hWnd, Msg, wParam, lParam);
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}
// wsprintf
int WINAPI wsprintfWrapW( LPTSTR lpOut, // pointer to buffer for output
LPCTSTR lpFmt, // pointer to format-control string
... ) // optional arguments
{
va_list ArgList;
va_start(ArgList, lpFmt);
return wvsprintfWrapW(lpOut, lpFmt, ArgList);
/*
LPSTR lpFmtA = NULL, lpTemp = NULL;
char szOut[1024]; //wsprintf has a 1k limit
int nRet = 0;
LPWSTR lpOutW = NULL;
VALIDATE_PROTOTYPE(wsprintf);
if (g_bRunningOnNT)
return wsprintfW(lpOut, lpFmt, ... );
// The argument list can have variable number of LPWSTR parameters which would
// be too hard to check individually .. instead we can do one of 2 things:
// - we can change every %s to %S in the format string .. %S will tell the wsprintfA
// that the argument is a wide string
// - if this doesn't work then we can try making sure the input format string uses %ws always
//
lpFmtA = ConvertWtoA((LPWSTR)lpFmt);
lpTemp = lpFmtA;
while(lpTemp && *lpTemp)
{
if(*lpTemp == '%' && *(lpTemp+1) == 's')
*(lpTemp+1) = 'S';
lpTemp++;
}
nRet = wsprintfA(szOut,lpFmtA, ...);
lpOutW = ConvertAtoW(szOut);
My_wcscpy(lpOut, lpOutW);
LocalFreeAndNull(&lpOutW);
LocalFreeAndNull(&lpFmtA);
return nRet;
*/
}
// wvsprintf
int WINAPI wvsprintfWrapW( LPTSTR lpOut, // pointer to buffer for output
LPCTSTR lpFmt, // pointer to format-control string
va_list arglist ) // variable list of format-control arguments
{
LPSTR lpFmtA = NULL, lpTemp = NULL;
char szOut[1024];
int nRet = 0;
LPWSTR lpOutW = NULL;
VALIDATE_PROTOTYPE(wvsprintf);
if (g_bRunningOnNT)
return wvsprintfW(lpOut, lpFmt, arglist);
// The argument list can have variable number of LPWSTR parameters which would
// be too hard to check individually .. instead we can do one of 2 things:
// - we can change every %s to %S in the format string .. %S will tell the wsprintfA
// that the argument is a wide string
// - if this doesn't work then we can try making sure the input format string uses %ws always
//
lpFmtA = ConvertWtoA((LPWSTR)lpFmt);
lpTemp = lpFmtA;
while(lpTemp && *lpTemp)
{
if(*lpTemp == '%' && *(lpTemp+1) == 's')
*(lpTemp+1) = 'S';
lpTemp++;
}
nRet = wvsprintfA(szOut,lpFmtA, arglist);
lpOutW = ConvertAtoW(szOut);
My_wcscpy(lpOut, lpOutW);
LocalFreeAndNull(&lpOutW);
LocalFreeAndNull(&lpFmtA);
return nRet;
}
// DialogBoxParam
INT_PTR WINAPI DialogBoxParamWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpTemplateName, // identifies dialog box template
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc, // pointer to dialog box procedure
LPARAM dwInitParam ) // initialization value
{
INT_PTR iRetValue = 0;
// LPSTR lpTemplateNameA = NULL;
VALIDATE_PROTOTYPE(DialogBoxParam);
if (g_bRunningOnNT)
return DialogBoxParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
// all templateName passed in our current codes are just IDD.
// so don't do A/W conversion.
// lpTemplateNameA = ConvertWtoA( lpTemplateName );
iRetValue = DialogBoxParamA(hInstance, (LPCSTR)lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
// LocalFreeAndNull( &lpTemplateNameA );
if(iRetValue == -1)
DebugTrace(TEXT("Error creating dialog: %d\n"), GetLastError());
return iRetValue;
}
// SendDlgItemMessage
LRESULT WINAPI SendDlgItemMessageWrapW( HWND hDlg, // handle of dialog box
int nIDDlgItem, // identifier of control
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
VALIDATE_PROTOTYPE(SendDlgItemMessage);
if (g_bRunningOnNT)
return SendDlgItemMessageW(hDlg, nIDDlgItem, Msg, wParam, lParam);
// [PaulHi] 1/19/99 Raid 66195
// Must special case Win9X wrapper failures, just like with SendMessage
// command
{
LPWSTR lpszStrW = NULL;
LPSTR lpszStrA = NULL;
LRESULT lRetValue = 0;
switch (Msg)
{
case LB_GETTEXT:
case CB_GETLBTEXT:
case WM_GETTEXT:
// Wrapper function returns single byte string instead of double byte.
// Note that caller should be expecting double byte and should set lParam
// size accordingly.
lRetValue = SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, lParam);
lpszStrW = ConvertAtoW((LPSTR)lParam);
lstrcpyWrapW((LPTSTR)lParam, lpszStrW);
LocalFreeAndNull(&lpszStrW);
break;
case CB_ADDSTRING:
Assert(lParam);
lpszStrA = ConvertWtoA((LPCWSTR)lParam);
lRetValue = SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, (LPARAM)lpszStrA);
LocalFreeAndNull(&lpszStrA);
break;
default:
lRetValue = SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, lParam);
}
return lRetValue;
}
}
// SetWindowLong
LONG WINAPI SetWindowLongWrapW( HWND hWnd, // handle of window
int nIndex, // offset of value to set
LONG dwNewLong ) // new value
{
VALIDATE_PROTOTYPE(SetWindowLong);
if (g_bRunningOnNT)
return SetWindowLongW(hWnd, nIndex, dwNewLong);
return SetWindowLongA(hWnd, nIndex, dwNewLong);
}
// GetWindowLong
LONG WINAPI GetWindowLongWrapW( HWND hWnd, // handle of window
int nIndex ) // offset of value to retrieve
{
VALIDATE_PROTOTYPE(GetWindowLong);
if (g_bRunningOnNT)
return GetWindowLongW(hWnd, nIndex);
return GetWindowLongA(hWnd, nIndex);
}
// SetWindowLong
LONG_PTR WINAPI SetWindowLongPtrWrapW( HWND hWnd, // handle of window
int nIndex, // offset of value to set
LONG_PTR dwNewLong ) // new value
{
VALIDATE_PROTOTYPE(SetWindowLongPtr);
if (g_bRunningOnNT)
return SetWindowLongPtrW(hWnd, nIndex, dwNewLong);
return SetWindowLongPtrA(hWnd, nIndex, dwNewLong);
}
// GetWindowLong
LONG_PTR WINAPI GetWindowLongPtrWrapW( HWND hWnd, // handle of window
int nIndex ) // offset of value to retrieve
{
VALIDATE_PROTOTYPE(GetWindowLongPtr);
if (g_bRunningOnNT)
return GetWindowLongPtrW(hWnd, nIndex);
return GetWindowLongPtrA(hWnd, nIndex);
}
// CreateWindowEx
HWND WINAPI CreateWindowExWrapW( DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu, or child-window identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam ) // pointer to window-creation data
{
HWND hRetValue = NULL;
LPSTR lpClassNameA = NULL;
LPSTR lpWindowNameA = NULL;
VALIDATE_PROTOTYPE(CreateWindowEx);
if (g_bRunningOnNT)
return CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
lpClassNameA = ConvertWtoA( lpClassName );
lpWindowNameA = ConvertWtoA( lpWindowName );
hRetValue = CreateWindowExA(dwExStyle, lpClassNameA, lpWindowNameA, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
LocalFreeAndNull( &lpClassNameA );
LocalFreeAndNull( &lpWindowNameA );
return hRetValue;
}
// UnregisterClass
BOOL WINAPI UnregisterClassWrapW( LPCTSTR lpClassName, // address of class name string
HINSTANCE hInstance ) // handle of application instance
{
BOOL bRetValue;
LPSTR lpClassNameA = NULL;
VALIDATE_PROTOTYPE(UnregisterClass);
if (g_bRunningOnNT)
return UnregisterClassW(lpClassName, hInstance);
lpClassNameA = ConvertWtoA( lpClassName );
bRetValue = UnregisterClassA(lpClassNameA, hInstance);
LocalFreeAndNull( &lpClassNameA );
return bRetValue;
}
// RegisterClass
ATOM WINAPI RegisterClassWrapW(CONST WNDCLASS *lpWndClass ) // address of structure with class date
{
ATOM aRetValue;
WNDCLASSA CLassA;
LPSTR lpszMenuName = NULL;
LPSTR lpszClassName = NULL;
VALIDATE_PROTOTYPE(RegisterClass);
if (g_bRunningOnNT)
return RegisterClassW(lpWndClass);
CLassA.style = lpWndClass->style;
CLassA.lpfnWndProc = lpWndClass->lpfnWndProc;
CLassA.cbClsExtra = lpWndClass->cbClsExtra;
CLassA.cbWndExtra = lpWndClass->cbWndExtra;
CLassA.hInstance = lpWndClass->hInstance;
CLassA.hIcon = lpWndClass->hIcon;
CLassA.hCursor = lpWndClass->hCursor;
CLassA.hbrBackground = lpWndClass->hbrBackground;
CLassA.lpszMenuName = NULL;
CLassA.lpszClassName = NULL;
if ( lpWndClass->lpszMenuName) {
lpszMenuName = ConvertWtoA(lpWndClass->lpszMenuName);
CLassA.lpszMenuName = lpszMenuName;
}
if ( lpWndClass->lpszClassName ) {
lpszClassName = ConvertWtoA(lpWndClass->lpszClassName);
CLassA.lpszClassName = lpszClassName;
}
aRetValue = RegisterClassA(&CLassA);
LocalFreeAndNull( &lpszMenuName );
LocalFreeAndNull( &lpszClassName );
return aRetValue;
}
// LoadCursor
HCURSOR WINAPI LoadCursorWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpCursorName ) // name string or cursor resource identifier
{
VALIDATE_PROTOTYPE(LoadCursor);
if (g_bRunningOnNT)
return LoadCursorW(hInstance, lpCursorName);
return LoadCursorA(hInstance, (LPSTR)lpCursorName);
}
// RegisterWindowMessage
UINT WINAPI RegisterWindowMessageWrapW( LPCTSTR lpString ) // address of message string
{
UINT uRetValue = 0;
LPSTR lpStringA = NULL;
VALIDATE_PROTOTYPE(RegisterWindowMessage);
if (g_bRunningOnNT)
return RegisterWindowMessageW(lpString);
lpStringA = ConvertWtoA( lpString );
uRetValue = RegisterWindowMessageA( lpStringA );
LocalFreeAndNull( &lpStringA );
return uRetValue;
}
// SystemParametersInfo
BOOL WINAPI SystemParametersInfoWrapW( UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni ) // user profile update flag
{
BOOL bRetValue;
LOGFONTA lfFontA;
LOGFONTW lfFontW;
VALIDATE_PROTOTYPE(SystemParametersInfo);
if (g_bRunningOnNT)
return SystemParametersInfoW(uiAction, uiParam, pvParam, fWinIni);
if ( uiAction != SPI_GETICONTITLELOGFONT )
return SystemParametersInfoA(uiAction, uiParam, pvParam, fWinIni);
// we handle SPI_GETICONTITLELOGFONT only for our special requirement. ...
bRetValue = SystemParametersInfoA(uiAction, uiParam, &lfFontA, fWinIni);
if ( bRetValue == FALSE ) return FALSE;
// copy all the fields except lfFaceName from lfFontA to lfFontW
CopyMemory(&lfFontW,&lfFontA, sizeof(LOGFONTA) );
// translate the lfFaceName[] from A to W
MultiByteToWideChar(GetACP(), 0, lfFontA.lfFaceName, LF_FACESIZE, lfFontW.lfFaceName, LF_FACESIZE);
CopyMemory(pvParam, &lfFontW, sizeof(LOGFONTW) );
return bRetValue;
}
/*
// No A & W version.
BOOL WINAPI ShowWindow( HWND hWnd, // handle to window
int nCmdShow ) // show state of window
*/
// CreateDialogParam
HWND WINAPI CreateDialogParamWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpTemplateName, // identifies dialog box template
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc, // pointer to dialog box procedure
LPARAM dwInitParam ) // initialization value
{
VALIDATE_PROTOTYPE(CreateDialogParam);
if (g_bRunningOnNT)
return CreateDialogParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
return CreateDialogParamA(hInstance, (LPCSTR) lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
}
// SetWindowText
BOOL WINAPI SetWindowTextWrapW( HWND hWnd, // handle to window or control
LPCTSTR lpString ) // address of string
{
BOOL bRetValue;
LPSTR lpStringA = NULL;
VALIDATE_PROTOTYPE(SetWindowText);
if (g_bRunningOnNT)
return SetWindowTextW(hWnd, lpString);
lpStringA = ConvertWtoA( lpString );
bRetValue = SetWindowTextA( hWnd, lpStringA);
LocalFreeAndNull( &lpStringA );
return bRetValue;
}
// PostMessage
BOOL WINAPI PostMessageWrapW( HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
VALIDATE_PROTOTYPE(PostMessage);
if (g_bRunningOnNT)
return PostMessageW(hWnd, Msg, wParam, lParam);
return PostMessageA(hWnd, Msg, wParam, lParam);
}
// GetMenuItemInfo
BOOL WINAPI GetMenuItemInfoWrapW( HMENU hMenu,
UINT uItem,
BOOL fByPosition,
LPMENUITEMINFO lpmii )
{
BOOL bRetValue;
MENUITEMINFOA miiA = {0};
LPSTR lpA = NULL;
LPWSTR lpW = NULL;
LPWSTR lpOld = NULL;
VALIDATE_PROTOTYPE(GetMenuItemInfo);
if (g_bRunningOnNT)
return GetMenuItemInfoW(hMenu, uItem, fByPosition, lpmii);
CopyMemory(&miiA, lpmii, sizeof(MENUITEMINFOA) );
miiA.cbSize = sizeof (MENUITEMINFOA);
if(miiA.fMask & MIIM_TYPE)
{
lpA = LocalAlloc(LMEM_ZEROINIT, lpmii->cch+1);
miiA.dwTypeData = lpA;
miiA.cch = lpmii->cch;
}
bRetValue = GetMenuItemInfoA(hMenu, uItem, fByPosition, &miiA);
if(bRetValue)
{
lpOld = lpmii->dwTypeData;
CopyMemory(lpmii, &miiA, sizeof(MENUITEMINFOA) );
lpmii->dwTypeData = lpOld;
if ( miiA.fMask & MIIM_TYPE )
{
lpW = ConvertAtoW(miiA.dwTypeData);
lstrcpyWrapW(lpmii->dwTypeData,lpW);
lpmii->cch = My_wcslen( lpmii->dwTypeData );
}
}
LocalFreeAndNull(&lpA);
LocalFreeAndNull(&lpW);
return bRetValue;
}
// GetClassInfo
BOOL WINAPI GetClassInfoWrapW( HINSTANCE hInstance, // handle of application instance
LPCTSTR lpClassName, // address of class name string
LPWNDCLASS lpWndClass ) // address of structure for class data
{
BOOL bRetValue;
LPSTR lpClassNameA = NULL;
WNDCLASSA ClassA;
VALIDATE_PROTOTYPE(GetClassInfo);
if (g_bRunningOnNT)
return GetClassInfoW(hInstance, lpClassName, lpWndClass);
lpClassNameA = ConvertWtoA( lpClassName );
bRetValue = GetClassInfoA(hInstance, lpClassNameA, &ClassA );
if (bRetValue == FALSE) {
LocalFreeAndNull( & lpClassNameA );
return FALSE;
}
CopyMemory(lpWndClass, &ClassA, sizeof(WNDCLASSA)-2*sizeof(LPSTR) );
if ( ClassA.lpszMenuName && !IS_INTRESOURCE(ClassA.lpszMenuName) )
lpWndClass->lpszMenuName = ConvertAtoW( ClassA.lpszMenuName );
else
lpWndClass->lpszMenuName = NULL;
if ( ClassA.lpszClassName && !IS_INTRESOURCE(ClassA.lpszClassName) ) // lpszClassName can be an atom, high word is null
lpWndClass->lpszClassName = ConvertAtoW( ClassA.lpszClassName);
else
lpWndClass->lpszClassName = NULL;
LocalFreeAndNull( & lpClassNameA );
return bRetValue;
}
//----------------------------------------------------------------------
//
// function: CharLowerWrapW( LPWSTR pch )
//
// purpose: Converts character to lowercase. Takes either a pointer
// to a string, or a character masquerading as a pointer.
// In the later case, the HIWORD must be zero. This is
// as spec'd for Win32.
//
// returns: Lowercased character or string. In the string case,
// the lowercasing is done inplace.
//
//----------------------------------------------------------------------
LPWSTR WINAPI
CharLowerWrapW( LPWSTR pch )
{
VALIDATE_PROTOTYPE(CharLower);
if (g_bRunningOnNT)
{
return CharLowerW( pch );
}
if (!HIWORD(pch))
{
WCHAR ch = (WCHAR)(LONG_PTR)pch;
CharLowerBuffWrapW( &ch, 1 );
pch = (LPWSTR)MAKEINTATOM(ch);
}
else
{
CharLowerBuffWrapW( pch, lstrlenW(pch) );
}
return pch;
}
//----------------------------------------------------------------------
//
// function: CharLowerBuffWrapW( LPWSTR pch, DWORD cch )
//
// purpose: Converts a string to lowercase. String must be cch
// characters in length.
//
// returns: Character count (cch). The lowercasing is done inplace.
//
//----------------------------------------------------------------------
DWORD WINAPI
CharLowerBuffWrapW( LPWSTR pch, DWORD cchLength )
{
DWORD cch;
VALIDATE_PROTOTYPE(CharLowerBuff);
if (g_bRunningOnNT)
{
return CharLowerBuffW( pch, cchLength );
}
for ( cch = cchLength; cch-- ; pch++ )
{
WCHAR ch = *pch;
if (IsCharUpperWrapW(ch))
{
if (ch < 0x0100)
{
*pch += 32; // Get Latin-1 out of the way first
}
else if (ch < 0x0531)
{
if (ch < 0x0391)
{
if (ch < 0x01cd)
{
if (ch <= 0x178)
{
if (ch < 0x0178)
{
*pch += (ch == 0x0130) ? 0 : 1;
}
else
{
*pch -= 121;
}
}
else
{
static const BYTE abLookup[] =
{ // 0/8 1/9 2/a 3/b 4/c 5/d 6/e 7/f
/* 0x0179-0x17f */ 1, 0, 1, 0, 1, 0, 0,
/* 0x0180-0x187 */ 0, 210, 1, 0, 1, 0, 206, 1,
/* 0x0188-0x18f */ 0, 205, 205, 1, 0, 0, 79, 202,
/* 0x0190-0x197 */ 203, 1, 0, 205, 207, 0, 211, 209,
/* 0x0198-0x19f */ 1, 0, 0, 0, 211, 213, 0, 214,
/* 0x01a0-0x1a7 */ 1, 0, 1, 0, 1, 0, 0, 1,
/* 0x01a8-0x1af */ 0, 218, 0, 0, 1, 0, 218, 1,
/* 0x01b0-0x1b7 */ 0, 217, 217, 1, 0, 1, 0, 219,
/* 0x01b8-0x1bf */ 1, 0, 0, 0, 1, 0, 0, 0,
/* 0x01c0-0x1c7 */ 0, 0, 0, 0, 2, 0, 0, 2,
/* 0x01c8-0x1cb */ 0, 0, 2, 0
};
*pch += abLookup[ch-0x0179];
}
}
else if (ch < 0x0386)
{
switch (ch)
{
case 0x01f1: *pch += 2; break;
case 0x01f2: break;
default: *pch += 1;
}
}
else
{
static const BYTE abLookup[] =
{ 38, 0, 37, 37, 37, 0, 64, 0, 63, 63 };
*pch += abLookup[ch-0x0386];
}
}
else
{
if (ch < 0x0410)
{
if (ch < 0x0401)
{
if (ch < 0x03e2)
{
if (!InRange(ch, 0x03d2, 0x03d4) &&
!(InRange(ch, 0x3da, 0x03e0) & !(ch & 1)))
{
*pch += 32;
}
}
else
{
*pch += 1;
}
}
else
{
*pch += 80;
}
}
else
{
if (ch < 0x0460)
{
*pch += 32;
}
else
{
*pch += 1;
}
}
}
}
else
{
if (ch < 0x2160)
{
if (ch < 0x1fba)
{
if (ch < 0x1f08)
{
if (ch < 0x1e00)
{
*pch += 48;
}
else
{
*pch += 1;
}
}
else if (!(InRange(ch, 0x1f88, 0x1faf) && (ch & 15)>7))
{
*pch -= 8;
}
}
else
{
static const BYTE abLookup[] =
{ // 8 9 a b c d e f
0, 0, 74, 74, 0, 0, 0, 0,
86, 86, 86, 86, 0, 0, 0, 0,
8, 8, 100, 100, 0, 0, 0, 0,
8, 8, 112, 112, 7, 0, 0, 0,
128, 128, 126, 126, 0, 0, 0, 0
};
int i = (ch-0x1fb0);
*pch -= (int)abLookup[((i>>1) & ~7) | (i & 7)];
}
}
else
{
if (ch < 0xff21)
{
if (ch < 0x24b6)
{
*pch += 16;
}
else
{
*pch += 26;
}
}
else
{
*pch += 32;
}
}
}
}
else
{
// These are Unicode Number Forms. They have lowercase counter-
// parts, but are not considered uppercase. Why, I don't know.
if (InRange(ch, 0x2160, 0x216f))
{
*pch += 16;
}
}
}
return cchLength;
}
//----------------------------------------------------------------------
//
// function: CharUpperBuffWrapW( LPWSTR pch, DWORD cch )
//
// purpose: Converts a string to uppercase. String must be cch
// characters in length. Note that this function is
// is messier that CharLowerBuffWrap, and the reason for
// this is many Unicode characters are considered uppercase,
// even when they don't have an uppercase counterpart.
//
// returns: Character count (cch). The uppercasing is done inplace.
//
//----------------------------------------------------------------------
DWORD WINAPI
CharUpperBuffWrapW( LPWSTR pch, DWORD cchLength )
{
DWORD cch;
VALIDATE_PROTOTYPE(CharUpperBuff);
if (g_bRunningOnNT)
{
return CharUpperBuffW( pch, cchLength );
}
for ( cch = cchLength; cch-- ; pch++ )
{
WCHAR ch = *pch;
if (IsCharLowerWrapW(ch))
{
if (ch < 0x00ff)
{
*pch -= ((ch != 0xdf) << 5);
}
else if (ch < 0x03b1)
{
if (ch < 0x01f5)
{
if (ch < 0x01ce)
{
if (ch < 0x017f)
{
if (ch < 0x0101)
{
*pch += 121;
}
else
{
*pch -= (ch != 0x0131 &&
ch != 0x0138 &&
ch != 0x0149);
}
}
else if (ch < 0x01c9)
{
static const BYTE abMask[] =
{ // 6543210f edcba987
0xfc, 0xbf, // 11111100 10111111
0xbf, 0x67, // 10111111 01100111
0xff, 0xef, // 11111111 11101111
0xff, 0xf7, // 11111111 11110111
0xbf, 0xfd // 10111111 11111101
};
int i = ch - 0x017f;
*pch -= ((abMask[i>>3] >> (i&7)) & 1) +
(ch == 0x01c6);
}
else
{
*pch -= ((ch != 0x01cb)<<1);
}
}
else
{
if (ch < 0x01df)
{
if (ch < 0x01dd)
{
*pch -= 1;
}
else
{
*pch -= 79;
}
}
else
{
*pch -= 1 + (ch == 0x01f3) -
InRange(ch,0x01f0,0x01f2);
}
}
}
else if (ch < 0x0253)
{
*pch -= (ch < 0x0250);
}
else if (ch < 0x03ac)
{
static const BYTE abLookup[] =
{// 0/8 1/9 2/a 3/b 4/c 5/d 6/e 7/f
/* 0x0253-0x0257 */ 210, 206, 0, 205, 205,
/* 0x0258-0x025f */ 0, 202, 0, 203, 0, 0, 0, 0,
/* 0x0260-0x0267 */ 205, 0, 0, 207, 0, 0, 0, 0,
/* 0x0268-0x026f */ 209, 211, 0, 0, 0, 0, 0, 211,
/* 0x0270-0x0277 */ 0, 0, 213, 0, 0, 214, 0, 0,
/* 0x0278-0x027f */ 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0280-0x0287 */ 0, 0, 0, 218, 0, 0, 0, 0,
/* 0x0288-0x028f */ 218, 0, 217, 217, 0, 0, 0, 0,
/* 0x0290-0x0297 */ 0, 0, 219
};
if (ch <= 0x0292)
{
*pch -= abLookup[ch - 0x0253];
}
}
else
{
*pch -= (ch == 0x03b0) ? 0 : (37 + (ch == 0x03ac));
}
}
else
{
if (ch < 0x0561)
{
if (ch < 0x0451)
{
if (ch < 0x03e3)
{
if (ch < 0x03cc)
{
*pch -= 32 - (ch == 0x03c2);
}
else
{
int i = (ch < 0x03d0);
*pch -= (i<<6) - i + (ch == 0x03cc);
}
}
else if (ch < 0x0430)
{
*pch -= (ch < 0x03f0);
}
else
{
*pch -= 32;
}
}
else if (ch < 0x0461)
{
*pch -= 80;
}
else
{
*pch -= 1;
}
}
else
{
if (ch < 0x1fb0)
{
if (ch < 0x1f70)
{
if (ch < 0x1e01)
{
int i = ch != 0x0587 && ch < 0x10d0;
*pch -= ((i<<5)+(i<<4)); /* 48 */
}
else if (ch < 0x1f00)
{
*pch -= !InRange(ch, 0x1e96, 0x1e9a);
}
else
{
int i = !InRange(ch, 0x1f50, 0x1f56)||(ch & 1);
*pch += (i<<3);
}
}
else
{
static const BYTE abLookup[] =
{ 74, 86, 86, 100, 128, 112, 126 };
if ( ch <= 0x1f7d )
{
*pch += abLookup[(ch-0x1f70)>>1];
}
}
}
else
{
if (ch < 0x24d0)
{
if (ch < 0x1fe5)
{
*pch += (0x0023 & (1<<(ch&15))) ? 8 : 0;
}
else if (ch < 0x2170)
{
*pch += (0x0023 & (1<<(ch&15))) ? 7 : 0;
}
else
{
*pch -= ((ch > 0x24b5)<<4);
}
}
else if (ch < 0xff41)
{
int i = !InRange(ch, 0xfb00, 0xfb17);
*pch -= (i<<4)+(i<<3)+(i<<1); /* 26 */
}
else
{
*pch -= 32;
}
}
}
}
}
else
{
int i = InRange(ch, 0x2170, 0x217f);
*pch -= (i<<4);
}
}
return cchLength;
}
// CharUpper
//----------------------------------------------------------------------
//
// function: CharUpperWrapW( LPWSTR pch )
//
// purpose: Converts character to uppercase. Takes either a pointer
// to a string, or a character masquerading as a pointer.
// In the later case, the HIWORD must be zero. This is
// as spec'd for Win32.
//
// returns: Uppercased character or string. In the string case,
// the uppercasing is done inplace.
//
//----------------------------------------------------------------------
LPWSTR WINAPI
CharUpperWrapW( LPWSTR pch )
{
VALIDATE_PROTOTYPE(CharUpper);
if (g_bRunningOnNT)
{
return CharUpperW( pch );
}
if (!HIWORD(pch))
{
WCHAR ch = (WCHAR)(LONG_PTR)pch;
CharUpperBuffWrapW( &ch, 1 );
pch = (LPWSTR)MAKEINTATOM(ch);
}
else
{
CharUpperBuffWrapW( pch, lstrlenW(pch) );
}
return pch;
}
/*
LPTSTR WINAPI CharUpperWrapW( LPTSTR lpsz ) // single character or pointer to string
{
LPWSTR lpszW = NULL;
LPSTR lpszA = NULL;
LPSTR lpszUpperA = NULL;
VALIDATE_PROTOTYPE(CharUpper);
if (g_bRunningOnNT)
return CharUpperW(lpsz);
lpszA = ConvertWtoA( lpsz );
lpszUpperA = CharUpperA( lpszA );
lpszW = ConvertAtoW( lpszUpperA );
CopyMemory( lpsz, lpszW, My_wcslen(lpszW) * sizeof(WCHAR) );
LocalFreeAndNull( &lpszW );
LocalFreeAndNull( &lpszA );
return lpsz;
}
*/
// RegisterClipboardFormat
UINT WINAPI RegisterClipboardFormatWrapW( LPCTSTR lpszFormat ) // address of name string
{
UINT uRetValue =0;
LPSTR lpszFormatA = NULL;
VALIDATE_PROTOTYPE(RegisterClipboardFormat);
if (g_bRunningOnNT)
return RegisterClipboardFormatW(lpszFormat);
lpszFormatA = ConvertWtoA( lpszFormat );
uRetValue = RegisterClipboardFormatA( lpszFormatA );
LocalFreeAndNull( &lpszFormatA );
return uRetValue;
}
// DispatchMessage
LRESULT WINAPI DispatchMessageWrapW( CONST MSG *lpmsg ) // pointer to structure with message
{
VALIDATE_PROTOTYPE(DispatchMessage);
if (g_bRunningOnNT)
return DispatchMessageW(lpmsg);
return DispatchMessageA(lpmsg);
}
/* No A & W version
BOOL WINAPI TranslateMessage( IN CONST MSG *lpMsg)
*/
// IsDialogMessage
BOOL WINAPI IsDialogMessageWrapW( HWND hDlg, // handle of dialog box
LPMSG lpMsg ) // address of structure with message
{
VALIDATE_PROTOTYPE(IsDialogMessage);
if (g_bRunningOnNT)
return IsDialogMessageW(hDlg, lpMsg);
return IsDialogMessageA(hDlg, lpMsg);
}
// GetMessage
BOOL WINAPI GetMessageWrapW( LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax ) // last message
{
VALIDATE_PROTOTYPE(GetMessage);
if (g_bRunningOnNT)
return GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
return GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
}
// SetDlgItemText
BOOL WINAPI SetDlgItemTextWrapW( HWND hDlg, // handle of dialog box
int nIDDlgItem, // identifier of control
LPCTSTR lpString ) // text to set
{
BOOL bRetValue;
LPSTR lpStringA = NULL;
VALIDATE_PROTOTYPE(SetDlgItemText);
if (g_bRunningOnNT)
return SetDlgItemTextW(hDlg, nIDDlgItem, lpString);
lpStringA = ConvertWtoA( lpString );
bRetValue = SetDlgItemTextA(hDlg, nIDDlgItem, lpStringA);
LocalFreeAndNull( &lpStringA );
return bRetValue;
}
// RegisterClassEx
ATOM WINAPI RegisterClassExWrapW( CONST WNDCLASSEX *lpwcx ) // address of structure with class data
{
ATOM aReturn;
WNDCLASSEXA wcxA;
PSTR lpszClassName = NULL;
PSTR lpszMenuName = NULL;
VALIDATE_PROTOTYPE(RegisterClassEx);
if (g_bRunningOnNT)
return RegisterClassExW(lpwcx);
wcxA.cbSize = sizeof(WNDCLASSEXA);
wcxA.style = lpwcx->style;
wcxA.lpfnWndProc = lpwcx->lpfnWndProc;
wcxA.cbClsExtra = lpwcx->cbClsExtra;
wcxA.cbWndExtra = lpwcx->cbWndExtra;
wcxA.hInstance = lpwcx->hInstance;
wcxA.hIcon = lpwcx->hIcon;
wcxA.hCursor = lpwcx->hCursor;
wcxA.hbrBackground = lpwcx->hbrBackground;
wcxA.hIconSm = lpwcx->hIconSm;
if ( lpwcx->lpszMenuName) {
lpszMenuName = ConvertWtoA(lpwcx->lpszMenuName);
wcxA.lpszMenuName = lpszMenuName;
}
if (lpwcx->lpszClassName) {
lpszClassName = ConvertWtoA(lpwcx->lpszClassName);
wcxA.lpszClassName = lpszClassName;
}
aReturn = RegisterClassExA( &wcxA );
if ( wcxA.lpszMenuName)
LocalFreeAndNull( &lpszMenuName );
if (wcxA.lpszClassName)
LocalFreeAndNull( &lpszClassName );
return aReturn;
}
// LoadAccelerators
HACCEL WINAPI LoadAcceleratorsWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpTableName ) // address of table-name string
{
HACCEL hRetValue = NULL;
LPSTR lpTableNameA = NULL;
VALIDATE_PROTOTYPE(LoadAccelerators);
if (g_bRunningOnNT)
return LoadAcceleratorsW(hInstance, lpTableName);
lpTableNameA = ConvertWtoA( lpTableName );
hRetValue = LoadAcceleratorsA( hInstance, lpTableNameA );
LocalFreeAndNull( &lpTableNameA );
return hRetValue;
}
// LoadMenu
HMENU WINAPI LoadMenuWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpMenuName ) // menu name string or menu-resource identifier
{
HMENU hRetValue = NULL;
LPSTR lpMenuNameA = NULL;
VALIDATE_PROTOTYPE(LoadMenu);
if (g_bRunningOnNT)
return LoadMenuW(hInstance, lpMenuName);
// becuause all the calling to this functions in our project just pass
// and Resource ID as lpMenuName. so don't need to covert like a string
lpMenuNameA = MAKEINTRESOURCEA(lpMenuName);
hRetValue = LoadMenuA(hInstance,lpMenuNameA);
return hRetValue;
}
//LoadIcon
HICON WINAPI LoadIconWrapW( HINSTANCE hInstance, // handle to application instance
LPCTSTR lpIconName ) // icon-name string or icon resource identifier
{
HICON hRetValue = NULL;
LPSTR lpIconNameA = NULL;
VALIDATE_PROTOTYPE(LoadIcon);
if (g_bRunningOnNT)
return LoadIconW(hInstance, lpIconName);
// becuause all the calling to this functions in our project just pass
// and Resource ID as lpMenuName. so don't need to covert like a string
lpIconNameA = MAKEINTRESOURCEA(lpIconName );
hRetValue = LoadIconA(hInstance, lpIconNameA);
return hRetValue;
}
// GetWindowText
int WINAPI GetWindowTextWrapW( HWND hWnd, // handle to window or control with text
LPTSTR lpString, // address of buffer for text
int nMaxCount ) // maximum number of characters to copy
{
int iRetValue =0;
LPSTR lpStringA = NULL;
LPWSTR lpStringW = NULL;
int nCount =0;
VALIDATE_PROTOTYPE(GetWindowText);
*lpString = '\0';
if (g_bRunningOnNT)
return GetWindowTextW(hWnd, lpString, nMaxCount);
nCount = nMaxCount * sizeof( WCHAR );
lpStringA = LocalAlloc( LMEM_ZEROINIT, nCount );
iRetValue = GetWindowTextA(hWnd, lpStringA, nCount);
if ( iRetValue == 0 ) {
LocalFreeAndNull( &lpStringA );
return iRetValue;
}
lpStringW = ConvertAtoW( lpStringA );
nCount = My_wcslen( lpStringW );
if ( nCount >= nMaxCount )
nCount = nMaxCount - 1;
CopyMemory( lpString, lpStringW, nCount * sizeof(WCHAR) );
lpString[nCount] = 0x0000;
iRetValue = nCount;
LocalFreeAndNull( &lpStringA );
LocalFreeAndNull( &lpStringW );
return iRetValue;
}
// CallWindowProcWrap
LRESULT WINAPI CallWindowProcWrapW( WNDPROC lpPrevWndFunc, // pointer to previous procedure
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
VALIDATE_PROTOTYPE(CallWindowProc);
if (g_bRunningOnNT)
return CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
return CallWindowProcA(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
}
// GetClassName
int WINAPI GetClassNameWrapW( HWND hWnd, // handle of window
LPTSTR lpClassName, // address of buffer for class name
int nMaxCount ) // size of buffer, in characters
{
int iRetValue =0;
LPSTR lpClassNameA = NULL;
LPWSTR lpClassNameW = NULL;
int nCount =0;
VALIDATE_PROTOTYPE(GetClassName);
if (g_bRunningOnNT)
return GetClassNameW(hWnd, lpClassName, nMaxCount);
nCount = nMaxCount * sizeof( WCHAR );
lpClassNameA = LocalAlloc( LMEM_ZEROINIT, nCount );
iRetValue = GetClassNameA(hWnd, lpClassNameA, nCount);
if ( iRetValue == 0 ) {
LocalFreeAndNull( &lpClassNameA );
return iRetValue;
}
lpClassNameW = ConvertAtoW( lpClassNameA );
nCount = My_wcslen( lpClassNameW );
if ( nCount >= nMaxCount )
nCount = nMaxCount - 1;
CopyMemory( lpClassName, lpClassNameW, nCount * sizeof(WCHAR) );
lpClassName[nCount] = 0x0000;
iRetValue = nCount;
LocalFreeAndNull( &lpClassNameA );
LocalFreeAndNull( &lpClassNameW );
return iRetValue;
}
// TranslateAccelerator
int WINAPI TranslateAcceleratorWrapW( HWND hWnd, // handle to destination window
HACCEL hAccTable, // handle to accelerator table
LPMSG lpMsg ) // address of structure with message
{
VALIDATE_PROTOTYPE(TranslateAccelerator);
if (g_bRunningOnNT)
return TranslateAcceleratorW(hWnd, hAccTable, lpMsg);
return TranslateAcceleratorA(hWnd, hAccTable, lpMsg);
}
// GetDlgItemText
UINT WINAPI GetDlgItemTextWrapW( HWND hDlg, // handle of dialog box
int nIDDlgItem, // identifier of control
LPTSTR lpString, // address of buffer for text
int nMaxCount ) // maximum size of string
{
int iRetValue = 0;
LPSTR lpStringA = NULL;
LPWSTR lpStringW = NULL;
int nCount =0;
VALIDATE_PROTOTYPE(GetDlgItemText);
*lpString = '\0';
if (g_bRunningOnNT)
return GetDlgItemTextW(hDlg, nIDDlgItem, lpString, nMaxCount);
nCount = nMaxCount * sizeof( WCHAR );
lpStringA = LocalAlloc( LMEM_ZEROINIT, nCount );
iRetValue = GetDlgItemTextA(hDlg, nIDDlgItem, lpStringA, nMaxCount);
if ( iRetValue == 0 ) {
LocalFreeAndNull( &lpStringA );
return iRetValue;
}
lpStringW = ConvertAtoW( lpStringA );
nCount = My_wcslen( lpStringW );
if ( nCount >= nMaxCount )
nCount = nMaxCount - 1;
CopyMemory( lpString, lpStringW, nCount * sizeof(WCHAR) );
lpString[nCount] = 0x0000;
iRetValue = nCount;
LocalFreeAndNull( &lpStringA );
LocalFreeAndNull( &lpStringW );
return iRetValue;
}
// SetMenuItemInfo
BOOL WINAPI SetMenuItemInfoWrapW( HMENU hMenu,
UINT uItem,
BOOL fByPosition,
LPMENUITEMINFO lpmii )
{
BOOL bRetValue;
MENUITEMINFOA miiA;
// VALIDATE_PROTOTYPE(SetMenuItemInfo);
if (g_bRunningOnNT)
return SetMenuItemInfoW(hMenu, uItem, fByPosition, lpmii);
// Bug 1723 WinSE: MFT_STRING is defined as 0. So lpmii->fType can never have MFT_STRING bit set
//if ( ((lpmii->fMask & MIIM_TYPE) == 0 ) || ((lpmii->fType & MFT_STRING) == 0 ) )
if ( ((lpmii->fMask & MIIM_TYPE) == 0 ) || lpmii->fType != MFT_STRING )
{
return SetMenuItemInfoA(hMenu, uItem, fByPosition, (MENUITEMINFOA *)lpmii );
}
CopyMemory(&miiA, lpmii, sizeof(MENUITEMINFOA) );
miiA.cbSize = sizeof(MENUITEMINFOA);
miiA.dwTypeData = ConvertWtoA( lpmii->dwTypeData );
miiA.cch = lstrlenA( miiA.dwTypeData );
bRetValue = SetMenuItemInfoA(hMenu, uItem, fByPosition, &miiA );
LocalFreeAndNull( &miiA.dwTypeData );
return bRetValue;
}
// PeekMessage
BOOL WINAPI PeekMessageWrapW( LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax, // last message
UINT wRemoveMsg ) // removal flags
{
VALIDATE_PROTOTYPE(PeekMessage);
if (g_bRunningOnNT)
return PeekMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
return PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
}
// run time loaded APIs in Comctl32.dll
extern LPIMAGELIST_LOADIMAGE_A gpfnImageList_LoadImageA;
extern LPPROPERTYSHEET_A gpfnPropertySheetA;
extern LP_CREATEPROPERTYSHEETPAGE_A gpfnCreatePropertySheetPageA;
extern LPIMAGELIST_LOADIMAGE_W gpfnImageList_LoadImageW;
extern LPPROPERTYSHEET_W gpfnPropertySheetW;
extern LP_CREATEPROPERTYSHEETPAGE_W gpfnCreatePropertySheetPageW;
HIMAGELIST WINAPI gpfnImageList_LoadImageWrapW(HINSTANCE hi,
LPCWSTR lpbmp,
int cx,
int cGrow,
COLORREF crMask,
UINT uType,
UINT uFlags)
{
WORD rID;
VALIDATE_PROTOTYPE( gpfnImageList_LoadImage );
if (g_bRunningOnNT)
return gpfnImageList_LoadImageW(hi, lpbmp, cx, cGrow, crMask, uType, uFlags) ;
// in our case, all the calling functions pass resources ID to lpbmp,
// so we don't want to convert this arguement.
rID = (WORD)lpbmp;
return gpfnImageList_LoadImageA(hi,(LPCSTR)((DWORD_PTR)(rID)), cx, cGrow, crMask, uType, uFlags) ;
}
INT_PTR WINAPI gpfnPropertySheetWrapW(LPCPROPSHEETHEADERW lppsh)
{
INT_PTR iRetValue;
PROPSHEETHEADERA pshA;
LPSTR pszCaption = NULL;
VALIDATE_PROTOTYPE( gpfnPropertySheet );
if (g_bRunningOnNT)
return gpfnPropertySheetW( lppsh );
CopyMemory( &pshA, lppsh, sizeof( PROPSHEETHEADERA ) );
pshA.dwSize = sizeof(PROPSHEETHEADERA);
pszCaption = ConvertWtoA( lppsh->pszCaption );
pshA.pszCaption = pszCaption;
iRetValue = gpfnPropertySheetA( &pshA );
LocalFreeAndNull( &pszCaption );
return iRetValue;
}
HPROPSHEETPAGE WINAPI gpfnCreatePropertySheetPageWrapW(LPCPROPSHEETPAGEW lppsp)
{
PROPSHEETPAGEA pspA;
HPROPSHEETPAGE hRetValue;
LPSTR lpTitle = NULL;
VALIDATE_PROTOTYPE( gpfnCreatePropertySheetPage );
if (g_bRunningOnNT)
return gpfnCreatePropertySheetPageW( lppsp );
CopyMemory( &pspA, lppsp, sizeof(PROPSHEETPAGEA) );
pspA.dwSize = sizeof( PROPSHEETPAGEA );
lpTitle = ConvertWtoA( lppsp->pszTitle );
pspA.pszTitle = lpTitle;
hRetValue = gpfnCreatePropertySheetPageA( &pspA );
LocalFreeAndNull( &lpTitle );
return hRetValue;
}
// APIs in Commdlg32.dll
extern BOOL (*pfnGetOpenFileNameA)(LPOPENFILENAMEA pof);
extern BOOL (*pfnGetOpenFileNameW)(LPOPENFILENAMEW pof);
BOOL WINAPI pfnGetOpenFileNameWrapW(LPOPENFILENAMEW lpOf)
{
BOOL bRetValue;
OPENFILENAMEA ofA;
LPSTR lpstrFilterA = NULL;
LPSTR lpstrFilterA_T = NULL,lpstrFilterAA=NULL ;
LPWSTR lpstrFilterW = NULL;
CHAR lpstrFileA[MAX_PATH+1] ="";
LPSTR lpstrFileTitleA = NULL;
LPSTR lpstrTitleA = NULL;
LPSTR lpstrDefExtA= NULL;
LPSTR lpTemplateNameA = NULL;
LPSTR lpstrInitialDirA = NULL;
LPWSTR lpstrFileW = NULL;
DWORD dwLen;
VALIDATE_PROTOTYPE(pfnGetOpenFileName);
if (g_bRunningOnNT)
return pfnGetOpenFileNameW( lpOf );
CopyMemory( &ofA, lpOf, sizeof( OPENFILENAMEA ) );
ofA.lStructSize = sizeof( OPENFILENAMEA );
if ( lpOf->lpTemplateName ) {
lpTemplateNameA = ConvertWtoA( lpOf->lpTemplateName );
ofA.lpTemplateName = lpTemplateNameA;
}
else
ofA.lpTemplateName = NULL;
if ( lpOf->lpstrDefExt ) {
lpstrDefExtA = ConvertWtoA( lpOf->lpstrDefExt );
ofA.lpstrDefExt = lpstrDefExtA;
}
else
ofA.lpstrDefExt = NULL;
if ( lpOf->lpstrTitle ) {
lpstrTitleA = ConvertWtoA( lpOf->lpstrTitle );
ofA.lpstrTitle = lpstrTitleA;
}
else
ofA.lpstrTitle = NULL;
if ( lpOf->lpstrFileTitle ) {
lpstrFileTitleA = ConvertWtoA( lpOf->lpstrFileTitle );
ofA.lpstrFileTitle = lpstrFileTitleA;
}
else
ofA.lpstrFileTitle = NULL;
if ( lpOf->lpstrInitialDir ) {
lpstrInitialDirA = ConvertWtoA( lpOf->lpstrInitialDir );
ofA.lpstrInitialDir = lpstrInitialDirA;
}
else
ofA.lpstrInitialDir = NULL;
ofA.lpstrCustomFilter = NULL;
// get the total length of lpOf->lpstrFilter
dwLen = 0;
lpstrFilterW = (LPWSTR)(lpOf->lpstrFilter);
while ( *lpstrFilterW != TEXT('\0') ) {
dwLen += lstrlenW(lpstrFilterW) + 1;
lpstrFilterW += lstrlenW(lpstrFilterW) + 1;
}
dwLen += 1; // for the last null terminator
lpstrFilterW = (LPWSTR)( lpOf->lpstrFilter );
lpstrFilterA = LocalAlloc( LMEM_ZEROINIT, dwLen * sizeof(WCHAR) );
lpstrFilterA_T = lpstrFilterA;
while ( *lpstrFilterW != TEXT('\0') ) {
lpstrFilterAA = ConvertWtoA(lpstrFilterW );
lpstrFilterW += lstrlenW(lpstrFilterW) + 1;
strcpy(lpstrFilterA_T, lpstrFilterAA );
LocalFreeAndNull( &lpstrFilterAA );
lpstrFilterA_T += lstrlenA( lpstrFilterA_T ) + 1;
}
lpstrFilterA_T[lstrlenA(lpstrFilterA_T)+1] = '\0';
ofA.lpstrFilter = lpstrFilterA;
ofA.lpstrFile = lpstrFileA;
ofA.nMaxFile = MAX_PATH + 1;
bRetValue = pfnGetOpenFileNameA( &ofA );
LocalFreeAndNull( &lpTemplateNameA );
LocalFreeAndNull( &lpstrDefExtA );
LocalFreeAndNull( &lpstrTitleA );
LocalFreeAndNull( &lpstrFileTitleA );
LocalFreeAndNull( &lpstrInitialDirA );
LocalFreeAndNull( &lpstrFilterA );
if ( bRetValue != FALSE ) {
lpstrFileW = ConvertAtoW( lpstrFileA );
CopyMemory( lpOf->lpstrFile, lpstrFileW, (lstrlenW(lpstrFileW)+1) * sizeof( WCHAR) );
LocalFreeAndNull( &lpstrFileW );
}
return bRetValue;
}
extern BOOL (*pfnGetSaveFileNameA)(LPOPENFILENAMEA pof);
extern BOOL (*pfnGetSaveFileNameW)(LPOPENFILENAMEW pof);
BOOL WINAPI pfnGetSaveFileNameWrapW(LPOPENFILENAMEW lpOf)
{
BOOL bRetValue;
OPENFILENAMEA ofA;
LPSTR lpstrFilterA = NULL;
LPSTR lpstrFilterA_T = NULL,lpstrFilterAA=NULL ;
LPWSTR lpstrFilterW = NULL;
CHAR lpstrFileA[MAX_PATH+1] ="";
LPSTR lpFileA = NULL;
LPSTR lpstrFileTitleA = NULL;
LPSTR lpstrTitleA = NULL;
LPSTR lpstrDefExtA= NULL;
LPSTR lpTemplateNameA = NULL;
LPSTR lpstrInitialDirA = NULL;
LPWSTR lpstrFileW = NULL;
DWORD dwLen;
VALIDATE_PROTOTYPE(pfnGetOpenFileName);
if (g_bRunningOnNT)
return pfnGetSaveFileNameW( lpOf );
CopyMemory( &ofA, lpOf, sizeof( OPENFILENAMEA ) );
ofA.lStructSize = sizeof( OPENFILENAMEA );
if ( lpOf->lpTemplateName ) {
lpTemplateNameA = ConvertWtoA( lpOf->lpTemplateName );
ofA.lpTemplateName = lpTemplateNameA;
}
else
ofA.lpTemplateName = NULL;
if ( lpOf->lpstrDefExt ) {
lpstrDefExtA = ConvertWtoA( lpOf->lpstrDefExt );
ofA.lpstrDefExt = lpstrDefExtA;
}
else
ofA.lpstrDefExt = NULL;
if ( lpOf->lpstrTitle ) {
lpstrTitleA = ConvertWtoA( lpOf->lpstrTitle );
ofA.lpstrTitle = lpstrTitleA;
}
else
ofA.lpstrTitle = NULL;
if ( lpOf->lpstrFileTitle ) {
lpstrFileTitleA = ConvertWtoA( lpOf->lpstrFileTitle );
ofA.lpstrFileTitle = lpstrFileTitleA;
}
else
ofA.lpstrFileTitle = NULL;
if ( lpOf->lpstrFile ) {
lpFileA = ConvertWtoA( lpOf->lpstrFile );
lstrcpyA(lpstrFileA, lpFileA);
ofA.lpstrFile = lpstrFileA;
ofA.nMaxFile = MAX_PATH + 1;
}
else
ofA.lpstrFile = NULL;
if ( lpOf->lpstrInitialDir ) {
lpstrInitialDirA = ConvertWtoA( lpOf->lpstrInitialDir );
ofA.lpstrInitialDir = lpstrInitialDirA;
}
else
ofA.lpstrInitialDir = NULL;
ofA.lpstrCustomFilter = NULL;
// get the total length of lpOf->lpstrFilter
dwLen = 0;
lpstrFilterW = (LPWSTR)(lpOf->lpstrFilter);
while ( *lpstrFilterW != TEXT('\0') ) {
dwLen += lstrlenW(lpstrFilterW) + 1;
lpstrFilterW += lstrlenW(lpstrFilterW) + 1;
}
dwLen += 1; // for the last null terminator
lpstrFilterW = (LPWSTR)( lpOf->lpstrFilter );
lpstrFilterA = LocalAlloc( LMEM_ZEROINIT, dwLen * sizeof(WCHAR) );
lpstrFilterA_T = lpstrFilterA;
while ( *lpstrFilterW != TEXT('\0') ) {
lpstrFilterAA = ConvertWtoA(lpstrFilterW );
lpstrFilterW += lstrlenW(lpstrFilterW) + 1;
strcpy(lpstrFilterA_T, lpstrFilterAA );
LocalFreeAndNull( &lpstrFilterAA );
lpstrFilterA_T += lstrlenA( lpstrFilterA_T ) + 1;
}
lpstrFilterA_T[lstrlenA(lpstrFilterA_T)+1] = '\0';
ofA.lpstrFilter = lpstrFilterA;
bRetValue = pfnGetSaveFileNameA( &ofA );
LocalFreeAndNull( &lpTemplateNameA );
LocalFreeAndNull( &lpstrDefExtA );
LocalFreeAndNull( &lpstrTitleA );
LocalFreeAndNull( &lpstrFileTitleA );
LocalFreeAndNull( &lpstrInitialDirA );
LocalFreeAndNull( &lpstrFilterA );
LocalFreeAndNull( &lpFileA );
if ( bRetValue != FALSE ) {
lpstrFileW = ConvertAtoW( lpstrFileA );
CopyMemory( lpOf->lpstrFile, lpstrFileW, (lstrlenW(lpstrFileW)+1) * sizeof( WCHAR) );
LocalFreeAndNull( &lpstrFileW );
}
return bRetValue;
}
extern BOOL (*pfnPrintDlgA)(LPPRINTDLGA lppd);
extern BOOL (*pfnPrintDlgW)(LPPRINTDLGW lppd);
BOOL WINAPI pfnPrintDlgWrapW(LPPRINTDLGW lppd)
{
BOOL bRetValue;
PRINTDLGA pdA;
VALIDATE_PROTOTYPE(pfnPrintDlg);
if (g_bRunningOnNT)
return pfnPrintDlgW( lppd );
CopyMemory( &pdA, lppd, sizeof( PRINTDLGA ) );
pdA.lStructSize = sizeof( PRINTDLGA );
// Only lpPrintTemplateName and lpSetupTemplateName has STR type,
// but in our case, only IDD of Resources are passed to these two parameters.
// so don't do conversion.
pdA.lpPrintTemplateName = (LPCSTR)(lppd->lpPrintTemplateName);
pdA.lpSetupTemplateName = (LPCSTR)(lppd->lpSetupTemplateName);
bRetValue = pfnPrintDlgA ( &pdA );
lppd->hDC = pdA.hDC;
lppd->Flags = pdA.Flags;
lppd->nFromPage = pdA.nFromPage;
lppd->nToPage = pdA.nToPage;
lppd->nMinPage = pdA.nMinPage;
lppd->nMaxPage = pdA.nMaxPage;
lppd->nCopies = pdA.nCopies;
return bRetValue;
}
extern HRESULT (*pfnPrintDlgExA)(LPPRINTDLGEXA lppdex);
extern HRESULT (*pfnPrintDlgExW)(LPPRINTDLGEXW lppdex);
HRESULT WINAPI pfnPrintDlgExWrapW(LPPRINTDLGEXW lppdex)
{
HRESULT hRetValue;
PRINTDLGEXA pdexA;
VALIDATE_PROTOTYPE(pfnPrintDlgEx);
if (g_bRunningOnNT)
return pfnPrintDlgExW( lppdex );
CopyMemory( &pdexA, lppdex, sizeof( PRINTDLGEXA ) );
pdexA.lStructSize = sizeof( PRINTDLGEXA );
// Only lpPrintTemplateName and lpSetupTemplateName has STR type,
// but in our case, only IDD of Resources are passed to these two parameters.
// so don't do conversion.
hRetValue = pfnPrintDlgExA( &pdexA );
lppdex->dwResultAction = pdexA.dwResultAction;
lppdex->hDC = pdexA.hDC;
lppdex->lpPageRanges = pdexA.lpPageRanges;
lppdex->nCopies = pdexA.nCopies;
lppdex->nMaxPage = pdexA.nMaxPage;
lppdex->nMaxPageRanges = pdexA.nMaxPageRanges;
lppdex->nMinPage = pdexA.nMinPage;
lppdex->nPageRanges = pdexA.nPageRanges;
lppdex->nPropertyPages = pdexA.nPropertyPages;
lppdex->nStartPage = pdexA.nStartPage;
return hRetValue;
}
// GetWindowTextLength
int WINAPI GetWindowTextLengthWrapW( HWND hWnd)
{
VALIDATE_PROTOTYPE(GetWindowTextLength);
if (g_bRunningOnNT)
return GetWindowTextLengthW(hWnd);
else
return GetWindowTextLengthA(hWnd);
}
// GetFileVersionInfoSize
DWORD GetFileVersionInfoSizeWrapW( LPTSTR lptstrFilename, LPDWORD lpdwHandle )
{
LPSTR lpFileA = NULL;
DWORD dwRet = 0;
VALIDATE_PROTOTYPE(GetFileVersionInfoSize);
if (g_bRunningOnNT)
return GetFileVersionInfoSizeW(lptstrFilename, lpdwHandle);
lpFileA = ConvertWtoA(lptstrFilename);
dwRet = GetFileVersionInfoSizeA(lpFileA, lpdwHandle);
LocalFreeAndNull(&lpFileA);
return dwRet;
}
// GetFileVersionInfo
BOOL GetFileVersionInfoWrapW( LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData)
{
LPSTR lpFileA = NULL;
BOOL bRet = FALSE;
VALIDATE_PROTOTYPE(GetFileVersionInfo);
if (g_bRunningOnNT)
return GetFileVersionInfoW(lptstrFilename, dwHandle, dwLen, lpData);
// Note this is assuming that the dwLen and dwHandle are the same as those returned by
// GetFileVersionInfoSize ..
lpFileA = ConvertWtoA(lptstrFilename);
bRet = GetFileVersionInfoA(lpFileA, dwHandle, dwLen, lpData);
LocalFreeAndNull(&lpFileA);
return bRet;
}
// VerQueryValue
// This one assumes that pBlock etc are all returned by GetFileVersionInfo and GetFileVersionInfoSize etc
BOOL VerQueryValueWrapW( const LPVOID pBlock, LPTSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen)
{
LPSTR lpBlockA = NULL;
BOOL bRet = FALSE;
VALIDATE_PROTOTYPE(GetFileVersionInfo);
if (g_bRunningOnNT)
return VerQueryValueW(pBlock, lpSubBlock, lplpBuffer, puLen);
// Note this is assuming that the dwLen and dwHandle are the same as those returned by
// GetFileVersionInfoSize ..
lpBlockA = ConvertWtoA(lpSubBlock);
bRet = VerQueryValueA(pBlock, lpBlockA, lplpBuffer, puLen);
LocalFreeAndNull(&lpBlockA);
return bRet;
}