diff options
Diffstat (limited to 'private/oleutest/olebind/widewrap.cxx')
-rw-r--r-- | private/oleutest/olebind/widewrap.cxx | 1840 |
1 files changed, 1840 insertions, 0 deletions
diff --git a/private/oleutest/olebind/widewrap.cxx b/private/oleutest/olebind/widewrap.cxx new file mode 100644 index 000000000..0787b9262 --- /dev/null +++ b/private/oleutest/olebind/widewrap.cxx @@ -0,0 +1,1840 @@ +//+--------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (C) Microsoft Corporation, 1993 - 1993. +// +// File: widewrap.cxx +// +// Contents: Unicode wrapper API, used only on Chicago +// +// Functions: About fifty Win32 function wrappers +// +// Notes: 'sz' is used instead of the "correct" hungarian 'psz' +// throughout to enhance readability. +// +// Not all of every Win32 function is wrapped here. Some +// obscurely-documented features may not be handled correctly +// in these wrappers. Caller beware. +// +// These are privately exported for use by the Shell. +// +// History: 28-Dec-93 ErikGav Created +// 06-14-94 KentCe Various Chicago build fixes. +// 21-Dec-94 BruceMa Use olewcstombs + other fixes +// 21-Feb-95 BruceMa Add support for AreFileApisANSI +// +//---------------------------------------------------------------------------- + +#include <windows.h> +#include "widewrap.h" + +size_t olembstowcs(WCHAR *pwsz, const char *psz, size_t cCh); +size_t olewcstombs(char *psz, const WCHAR *pwsz , size_t cCh); + +inline size_t olembstowcs(WCHAR *pwsz, const char *psz, size_t cCh) +{ + return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, psz, -1, pwsz, cCh); +} + +inline size_t olewcstombs(char *psz, const WCHAR *pwsz , size_t cCh) +{ + return WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pwsz, -1, psz, + cCh, NULL, NULL); +} + +#ifdef _CHICAGO_ + +#define HFINDFILE HANDLE +#define ERR ((char*) -1) + + +// +// BUGBUG: 9869 +// +// The length of a Unicode string (in chars) and a DBCS string are not +// always equal. We need to review all WideChar to MultiByte conversions +// logic to verify that the proper result buffer size is used. +// +// Make the below Win95 only change to get the Win95 FE build out. +// + +int UnicodeToAnsi(LPSTR sz, LPCWSTR pwsz, LONG cb) +{ + int ret; + + ret = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pwsz, -1, sz, cb, NULL, NULL); + +#if DBG==1 + if (ret == -1) + { + DebugBreak(); + } +#endif + + return ret; +} + + +int UnicodeToAnsiOem(LPSTR sz, LPCWSTR pwsz, LONG cb) +{ + int ret; + + if (AreFileApisANSI()) + { + ret = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pwsz, -1, sz, + cb, NULL, NULL); + } + else + { + ret = WideCharToMultiByte(CP_OEMCP, WC_COMPOSITECHECK, pwsz, -1, sz, + cb, NULL, NULL); + } + +#if DBG==1 + if (ret == -1) + { + DebugBreak(); + } +#endif + + return ret; +} + + + +#if DBG==1 +int AnsiToUnicode(LPWSTR pwsz, LPCSTR sz, LONG cb) +{ + int ret; + + ret = olembstowcs(pwsz, sz, cb); + + if (ret == -1) + { + DebugBreak(); + } + + return ret; +} +#else +#define AnsiToUnicode olembstowcs +#endif + + + +int AnsiToUnicodeOem(LPWSTR pwsz, LPCSTR sz, LONG cb) +{ + int ret; + + if (AreFileApisANSI()) + { + ret = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, cb, pwsz, cb); + } + else + { + ret = MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, sz, cb, pwsz, cb); + } + +#if DBG==1 + if (ret == -1) + { + DebugBreak(); + } +#endif + + return ret; +} + + + + +LPSTR Convert(LPCWSTR pwsz) +{ + LONG len; + LPSTR sz = NULL; + + if (pwsz == NULL) + goto Exit; + +#if DBG==1 + // some Win32 API accept atoms in their string parameters +#endif + + len = (wcslen(pwsz) + 1) * 2; + + sz = new CHAR[len]; + if (sz==NULL) + { + sz = ERR; + goto Exit; + } + + __try + { + UnicodeToAnsi(sz, pwsz, len); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { +#if DBG==1 + MessageBoxA(NULL, "GP fault in unicode conversion -- caught", + NULL, MB_OK); +#endif + if (sz) + delete sz; + sz = ERR; + } + +Exit: + return sz; +} + + + + + + + + + +LPSTR ConvertOem(LPCWSTR pwsz) +{ + LONG len; + LPSTR sz = NULL; + + if (pwsz == NULL) + goto Exit; + +#if DBG==1 + // some Win32 API accept atoms in their string parameters +#endif + + len = (wcslen(pwsz) + 1) * 2; + + sz = new CHAR[len]; + if (sz==NULL) + { + sz = ERR; + goto Exit; + } + + __try + { + UnicodeToAnsiOem(sz, pwsz, len); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { +#if DBG==1 + MessageBoxA(NULL, "GP fault in unicode conversion -- caught", + NULL, MB_OK); +#endif + if (sz) + delete sz; + sz = ERR; + } + +Exit: + return sz; +} + + + + + +HANDLE WINAPI CreateFileX(LPCWSTR pwsz, DWORD fdwAccess, DWORD fdwShareMask, + LPSECURITY_ATTRIBUTES lpsa, DWORD fdwCreate, DWORD fdwAttrsAndFlags, + HANDLE hTemplateFile) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateFile\n"); + #endif + + CHAR sz[MAX_PATH * 2]; + UnicodeToAnsiOem(sz, pwsz, sizeof(sz)); + + return CreateFileA(sz, fdwAccess, fdwShareMask, lpsa, fdwCreate, + fdwAttrsAndFlags, hTemplateFile); +} + +BOOL WINAPI DeleteFileX(LPCWSTR pwsz) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("DeleteFile\n"); + #endif + + CHAR sz[MAX_PATH * 2]; + UnicodeToAnsi(sz, pwsz, sizeof(sz)); + + return DeleteFileA(sz); +} + + +LONG APIENTRY RegOpenKeyX(HKEY hKey, LPCWSTR pwszSubKey, PHKEY phkResult) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegOpenKey\n"); + #endif + + LONG ret; + LPSTR sz; + + sz = Convert(pwszSubKey); + + if (sz == ERR) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegOpenKeyA(hKey, sz, phkResult); + if (sz) + delete sz; + return ret; +} + +LONG APIENTRY RegQueryValueX(HKEY hKey, LPCWSTR pwszSubKey, LPWSTR pwszValue, + PLONG lpcbValue) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegQueryValue\n"); + #endif + + LONG cb, ret; + LPSTR szValue = NULL; + LPSTR sz; + + sz = Convert(pwszSubKey); + if (sz == ERR) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegQueryValueA(hKey, sz, NULL, &cb); + + // If the caller was just asking for the size of the value, jump out + // now, without actually retrieving and converting the value. + + if (pwszValue == NULL) + { + // Adjust size of buffer to report, to account for CHAR -> WCHAR + *lpcbValue = cb * sizeof(WCHAR); + goto Exit; + } + + + if (ret == ERROR_SUCCESS) + { + // If the caller was asking for the value, but allocated too small + // of a buffer, set the buffer size and jump out. + + if (*lpcbValue < (LONG) (cb * sizeof(WCHAR))) + { + // Adjust size of buffer to report, to account for CHAR -> WCHAR + *lpcbValue = cb * sizeof(WCHAR); + ret = ERROR_MORE_DATA; + goto Exit; + } + + // Otherwise, retrieve and convert the value. + + szValue = new CHAR[cb]; + if (szValue == NULL) + { + ret = ERROR_OUTOFMEMORY; + goto Exit; + } + + ret = RegQueryValueA(hKey, sz, szValue, &cb); + + if (ret == ERROR_SUCCESS) + { + AnsiToUnicode(pwszValue, szValue, cb); + + // Adjust size of buffer to report, to account for CHAR -> WCHAR + *lpcbValue = cb * sizeof(WCHAR); + } + } + +Exit: + if (szValue) + delete szValue; + if (sz) + delete sz; + + return ret; +} + +LONG APIENTRY RegSetValueX(HKEY hKey, LPCWSTR lpSubKey, DWORD dwType, + LPCWSTR lpData, DWORD cbData) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegSetValue\n"); + #endif + + LPSTR szKey = NULL; + LPSTR szValue = NULL; + LONG ret = ERROR_OUTOFMEMORY; + + szKey = Convert(lpSubKey); + if (szKey == ERR) + { + szKey = NULL; + goto Exit; + } + + szValue = Convert(lpData); + if (szValue == ERR) + { + szValue = NULL; + goto Exit; + } + + ret = RegSetValueA(hKey, szKey, dwType, szValue, cbData); + +Exit: + if (szKey) + delete szKey; + if (szValue) + delete szValue; + return ret; +} + +LONG APIENTRY RegSetValueExX(HKEY hKey, + LPCWSTR lpSubKey, + DWORD dwReserved, + DWORD dwType, + LPBYTE lpData, + DWORD cbData) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegSetValueEx\n"); + #endif + + LPSTR szKey = NULL; + LPBYTE szValue = lpData; + LONG ret = ERROR_OUTOFMEMORY; + + szKey = Convert(lpSubKey); + if (szKey == ERR) + { + szKey = NULL; + goto Exit; + } + + if (dwType == REG_SZ) + { + szValue = (LPBYTE) Convert((LPWSTR)lpData); + } + if (szValue == (LPBYTE) ERR) + { + szValue = NULL; + goto Exit; + } + + ret = RegSetValueExA(hKey, szKey, dwReserved, dwType, szValue, cbData); + +Exit: + if (szKey) + delete szKey; + if ((szValue != lpData) && (szValue != (LPBYTE)ERR)) + delete szValue; + return ret; +} + +UINT WINAPI RegisterWindowMessageX(LPCWSTR lpString) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegisterWindowMessage\n"); + #endif + + UINT ret; +#if 0 + LPSTR sz; + + sz = Convert(lpString); + if (sz == ERR) + { + return 0; + } +#else + // BUGBUG: CairOLE calls this from libmain -- have to use static buffer + + CHAR sz[200]; + UnicodeToAnsi(sz, lpString, sizeof(sz)); +#endif + + ret = RegisterWindowMessageA(sz); +#if 0 + delete sz; +#endif + return ret; +} + +LONG +APIENTRY +RegOpenKeyExX ( + HKEY hKey, + LPCWSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegOpenKeyEx\n"); + #endif + + LONG ret; + LPSTR sz; + + sz = Convert(lpSubKey); + if (sz == ERR) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegOpenKeyExA(hKey, sz, ulOptions, samDesired, phkResult); + if (sz) + delete sz; + return ret; +} + +LONG +APIENTRY +RegQueryValueExX( + HKEY hKey, + LPWSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegQueryValueEx\n"); + #endif + + LPBYTE lpTempBuffer; + DWORD dwTempType; + DWORD cb, cbRequired; + LONG ret; + LPSTR sz; + LPWSTR pwszTempWide; + LPSTR pszTempNarrow; + ULONG ulStringLength; + + sz = Convert(lpValueName); + if (sz == ERR) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegQueryValueExA(hKey, sz, lpReserved, &dwTempType, NULL, &cb); + + // If the caller was just asking for the size of the value, jump out + // now, without actually retrieving and converting the value. + + if (lpData == NULL) + { + switch (dwTempType) + { + case REG_EXPAND_SZ: + case REG_MULTI_SZ: + case REG_SZ: + + // Adjust size of buffer to report, to account for CHAR -> WCHAR + + if (lpcbData != NULL) + *lpcbData = cb * sizeof(WCHAR); + break; + + default: + + if (lpcbData != NULL) + *lpcbData = cb; + break; + } + + // Set the type, if required. + if (lpType != NULL) + { + *lpType = dwTempType; + } + + goto Exit; + } + + + if (ret == ERROR_SUCCESS) + { + // + // Determine the size of buffer needed + // + + switch (dwTempType) + { + case REG_EXPAND_SZ: + case REG_MULTI_SZ: + case REG_SZ: + + cbRequired = cb * sizeof(WCHAR); + break; + + default: + + cbRequired = cb; + break; + } + + // If the caller was asking for the value, but allocated too small + // of a buffer, set the buffer size and jump out. + + if (lpcbData != NULL && *lpcbData < cbRequired) + { + // Adjust size of buffer to report, to account for CHAR -> WCHAR + *lpcbData = cbRequired; + + // Set the type, if required. + if (lpType != NULL) + { + *lpType = dwTempType; + } + + ret = ERROR_MORE_DATA; + goto Exit; + } + + // Otherwise, retrieve and convert the value. + + switch (dwTempType) + { + case REG_EXPAND_SZ: + case REG_MULTI_SZ: + case REG_SZ: + + lpTempBuffer = new BYTE[cbRequired]; + if (lpTempBuffer == NULL) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegQueryValueExA(hKey, + sz, + lpReserved, + &dwTempType, + lpTempBuffer, + &cb); + + if (ret == ERROR_SUCCESS) + { + switch (dwTempType) + { + case REG_EXPAND_SZ: + case REG_SZ: + + AnsiToUnicode((LPWSTR) lpData, (LPSTR) lpTempBuffer, cb); + + // Adjust size of buffer to report, to account for CHAR -> WCHAR + *lpcbData = cbRequired; + + // Set the type, if required. + if (lpType != NULL) + { + *lpType = dwTempType; + } + break; + + case REG_MULTI_SZ: + + pszTempNarrow = (LPSTR) lpTempBuffer; + pwszTempWide = (LPWSTR) lpData; + + while (pszTempNarrow != NULL) + { + ulStringLength = strlen(pszTempNarrow) + 1; + AnsiToUnicode(pwszTempWide, + pszTempNarrow, + ulStringLength); + + // Compiler will scale appropriately here + pszTempNarrow += ulStringLength; + pwszTempWide += ulStringLength; + } + break; + } + } + + if (lpTempBuffer) + delete lpTempBuffer; + + break; + + default: + + // + // No conversion of out parameters needed. Just call narrow + // version with args passed in, and return directly. + // + + ret = RegQueryValueExA(hKey, + sz, + lpReserved, + lpType, + lpData, + lpcbData); + + } + } + +Exit: + if (sz) + delete sz; + return ret; +} + + + +ATOM +WINAPI +RegisterClassX( + CONST WNDCLASSW *lpWndClass) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegisterClass\n"); + #endif + + WNDCLASSA wc; + ATOM ret; + BOOL fAtom = FALSE; + + + memcpy(&wc, lpWndClass, sizeof(WNDCLASS)); + + wc.lpszMenuName = Convert(lpWndClass->lpszMenuName); + if (wc.lpszMenuName==ERR) + { + return NULL; + } + + if (HIWORD(lpWndClass->lpszClassName) == 0) + { + wc.lpszClassName = (LPSTR) lpWndClass->lpszClassName; + fAtom = TRUE; + } + else + { + wc.lpszClassName = Convert(lpWndClass->lpszClassName); + if (wc.lpszClassName==ERR) + { + if ((LPSTR) wc.lpszMenuName) + delete (LPSTR) wc.lpszMenuName; + return NULL; + } + } + + ret = RegisterClassA(&wc); + if ((LPSTR) wc.lpszMenuName) + delete (LPSTR) wc.lpszMenuName; + if (!fAtom) delete (LPSTR) wc.lpszClassName; + return ret; +} + +BOOL +WINAPI +UnregisterClassX( + LPCWSTR lpClassName, + HINSTANCE hInstance) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("UnregisterClass\n"); + #endif + + LPSTR sz; + BOOL ret; + BOOL fAtom = FALSE; + + if (HIWORD(lpClassName) == 0) + { + sz = (LPSTR) lpClassName; + fAtom = TRUE; + } + else + { + sz = Convert(lpClassName); + if (sz == ERR) + return FALSE; + } + + ret = UnregisterClassA(sz, hInstance); + if (!fAtom) delete sz; + return ret; +} + +HANDLE +WINAPI +GetPropX( + HWND hWnd, + LPCWSTR lpString) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetProp\n"); + #endif + + HANDLE ret; + LPSTR sz; + BOOL fAtom = FALSE; + + if (HIWORD(lpString)==0) + { + fAtom = TRUE; + sz = (LPSTR) lpString; + } + else + { + sz = Convert(lpString); + if (sz == ERR) + return NULL; + } + + ret = GetPropA(hWnd, sz); + if (!fAtom) delete sz; + return ret; +} + + +BOOL +WINAPI +SetPropX( + HWND hWnd, + LPCWSTR lpString, + HANDLE hData) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("SetProp\n"); + #endif + + BOOL ret; + LPSTR sz; + BOOL fAtom = FALSE; + + if (HIWORD(lpString)==0) + { + sz = (LPSTR) lpString; + fAtom = TRUE; + } + else + { + sz = Convert(lpString); + if (sz == ERR) + return NULL; + } + + ret = SetPropA(hWnd, sz, hData); + if (!fAtom) delete sz; + return ret; +} + + +HANDLE +WINAPI +RemovePropX( + HWND hWnd, + LPCWSTR lpString) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RemoveProp\n"); + #endif + + HANDLE ret; + LPSTR sz; + BOOL fAtom = FALSE; + + if (HIWORD(lpString)==0) + { + sz = (LPSTR) lpString; + fAtom = TRUE; + } + else + { + sz = Convert(lpString); + if (sz == ERR) + return NULL; + } + + ret = RemovePropA(hWnd, sz); + if (!fAtom) delete sz; + return ret; +} + + +UINT +WINAPI +GetProfileIntX( + LPCWSTR lpAppName, + LPCWSTR lpKeyName, + INT nDefault + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetProfileInt\n"); + #endif + + LPSTR szApp; + LPSTR szKey; + UINT ret; + + szApp = Convert(lpAppName); + if (szApp==ERR) + { + return nDefault; + } + + szKey = Convert(lpKeyName); + if (szApp==ERR) + { + if (szApp) + delete szApp; + return nDefault; + } + + ret = GetProfileIntA(szApp, szKey, nDefault); + if (szApp) + delete szApp; + if (szKey) + delete szKey; + return ret; +} + +ATOM +WINAPI +GlobalAddAtomX( + LPCWSTR lpString + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GlobalAddAtom\n"); + #endif + + ATOM ret; + LPSTR sz; + + sz = Convert(lpString); + if (sz==ERR) + { + return NULL; + } + + ret = GlobalAddAtomA(sz); + if (sz) + delete sz; + return ret; +} + +UINT +WINAPI +GlobalGetAtomNameX( + ATOM nAtom, + LPWSTR pwszBuffer, + int nSize + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GlobalGetAtomName\n"); + #endif + + LPSTR sz; + UINT ret; + + sz = new CHAR[nSize]; + if (sz == NULL) + { + return 0; + } + + ret = GlobalGetAtomNameA(nAtom, sz, nSize); + if (ret) + { + AnsiToUnicode(pwszBuffer, sz, lstrlenA(sz) + 1); + } + if (sz) + delete sz; + return ret; +} + + +DWORD +WINAPI +GetModuleFileNameX( + HINSTANCE hModule, + LPWSTR pwszFilename, + DWORD nSize + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetModuleFileName\n"); + #endif + + LPSTR sz; + DWORD ret; + + sz = new CHAR[nSize]; + if (sz == NULL) + { + return 0; + } + + ret = GetModuleFileNameA(hModule, sz, nSize); + if (ret) + { + AnsiToUnicode(pwszFilename, sz, lstrlenA(sz) + 1); + } + + if (sz) + delete sz; + return ret; +} + + +LPWSTR +WINAPI +CharPrevX( + LPCWSTR lpszStart, + LPCWSTR lpszCurrent) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("CharPrev\n"); + #endif + + if (lpszCurrent == lpszStart) + { + return (LPWSTR) lpszStart; + } + else + { + return (LPWSTR) lpszCurrent - 1; + } +} + +HFONT WINAPI CreateFontX(int a, int b, int c, int d, int e, DWORD f, + DWORD g, DWORD h, DWORD i, DWORD j, DWORD k, + DWORD l, DWORD m, LPCWSTR pwsz) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateFont\n"); + #endif + + LPSTR sz; + HFONT ret; + + sz = Convert(pwsz); + if (sz == ERR) + { + return NULL; + } + + ret = CreateFontA(a,b,c,d,e,f,g,h,i,j,k,l,m,sz); + if (sz) + delete sz; + return ret; +} + + +HINSTANCE +WINAPI +LoadLibraryX( + LPCWSTR pwszFileName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("LoadLibrary\n"); + #endif + + HINSTANCE ret; + LPSTR sz; + + sz = Convert(pwszFileName); + if (sz == ERR) + { + return NULL; + } + + ret = LoadLibraryA(sz); + if (sz) + delete sz; + return ret; +} + + +HMODULE +WINAPI +LoadLibraryExX( + LPCWSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("LoadLibrary\n"); + #endif + + HINSTANCE ret; + LPSTR sz; + + sz = ConvertOem(lpLibFileName); + if (sz == ERR) + { + return NULL; + } + + ret = LoadLibraryExA(sz, hFile, dwFlags); + if (sz) + delete sz; + return ret; +} + + + +LONG +APIENTRY +RegDeleteKeyX( + HKEY hKey, + LPCWSTR pwszSubKey + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegDeleteKey\n"); + #endif + + LONG ret; + LPSTR sz; + + sz = Convert(pwszSubKey); + if (sz == ERR) + { + return ERROR_OUTOFMEMORY; + } + + ret = RegDeleteKeyA(hKey, sz); + if (sz) + delete sz; + return ret; +} + +BOOL +APIENTRY +CreateProcessX( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateProcess\n"); + #endif + + STARTUPINFOA si; + BOOL ret = FALSE; + LPSTR szApp = NULL; + LPSTR szCommand = NULL; + LPSTR szDir = NULL; + + memcpy(&si, lpStartupInfo, sizeof(STARTUPINFO)); + + si.lpTitle = NULL; + + si.lpDesktop = Convert(lpStartupInfo->lpDesktop); + if (si.lpDesktop == ERR) + { + si.lpDesktop = NULL; + goto Error; + } + si.lpTitle = Convert(lpStartupInfo->lpTitle); + if (si.lpTitle == ERR) + { + si.lpTitle = NULL; + goto Error; + } + + szApp = Convert(lpApplicationName); + if (szApp == ERR) + { + szApp = NULL; + goto Error; + } + szCommand = ConvertOem(lpCommandLine); + if (szCommand == ERR) + { + szCommand = NULL; + goto Error; + } + szDir = Convert(lpCurrentDirectory); + if (szDir == ERR) + { + szDir = NULL; + goto Error; + } + + ret = CreateProcessA(szApp, szCommand, lpProcessAttributes, + lpThreadAttributes, bInheritHandles, dwCreationFlags, + lpEnvironment, szDir, &si, lpProcessInformation); + +Error: + if (si.lpDesktop) + delete si.lpDesktop; + if (si.lpTitle) + delete si.lpTitle; + + if (szApp) + delete szApp; + if (szCommand) + delete szCommand; + if (szDir) + delete szDir; + + return ret; +} + +LONG +APIENTRY +RegEnumKeyExX( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpName, + LPDWORD lpcbName, + LPDWORD lpReserved, + LPWSTR lpClass, + LPDWORD lpcbClass, + PFILETIME lpftLastWriteTime + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegEnumKeyEx\n"); + #endif + + LPSTR szName; + LPSTR szClass = NULL; + LONG ret = ERROR_OUTOFMEMORY; + + szName = new CHAR[*lpcbName]; + if (szName == NULL) + goto Exit; + + if (lpClass != NULL) + { + szClass = new CHAR[*lpcbClass + 1]; + if (szName == NULL) + goto Exit; + } + + // + // Return lengths do not include zero char. + // + ret = RegEnumKeyExA(hKey, dwIndex, szName, lpcbName, lpReserved, + szClass, lpcbClass, lpftLastWriteTime); + + if (ret == ERROR_SUCCESS) + { + AnsiToUnicode(lpName, szName, *lpcbName + 1); + + if (szClass) + { + AnsiToUnicode(lpClass, szClass, *lpcbClass + 1); + } + } + +Exit: + return ret; +} + +BOOL +WINAPI +AppendMenuX( + HMENU hMenu, + UINT uFlags, + UINT uIDnewItem, + LPCWSTR lpnewItem + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("AppendMenu\n"); + #endif + + BOOL ret; + LPSTR sz; + + if (uFlags == MF_STRING) + { + sz = Convert(lpnewItem); + if (sz==ERR) + { + return FALSE; + } + } + else + { + sz = (LPSTR) lpnewItem; + } + + ret = AppendMenuA(hMenu, uFlags, uIDnewItem, sz); + + if (uFlags == MF_STRING) + { + if (sz) + delete sz; + } + + return ret; +} + +HANDLE +WINAPI +OpenEventX( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("OpenEvent\n"); + #endif + + LPSTR sz; + HANDLE ret; + + sz = Convert(lpName); + if (sz == ERR) + { + return NULL; + } + + ret = OpenEventA(dwDesiredAccess, bInheritHandle, sz); + if (sz) + delete sz; + return ret; +} + +HANDLE +WINAPI +CreateEventX( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCWSTR lpName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateEvent\n"); + #endif + + LPSTR sz; + HANDLE ret; + + sz = Convert(lpName); + if (sz == ERR) + { + return NULL; + } + + ret = CreateEventA(lpEventAttributes, bManualReset, bInitialState, sz); + if (sz) + delete sz; + return ret; +} + +UINT +WINAPI +GetDriveTypeX( + LPCWSTR lpRootPathName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetDriveType\n"); + #endif + + LPSTR sz; + UINT ret; + + sz = Convert(lpRootPathName); + if (sz == ERR) + { + return 0; + } + + ret = GetDriveTypeA(sz); + if (sz) + delete sz; + return ret; +} + +DWORD +WINAPI +GetFileAttributesX( + LPCWSTR lpFileName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetFileAttributes\n"); + #endif + + LPSTR sz; + DWORD ret; + + sz = ConvertOem(lpFileName); + if (sz == ERR) + return 0xFFFFFFFF; + + ret = GetFileAttributesA(sz); + if (sz) + delete sz; + return ret; +} + +LONG +APIENTRY +RegEnumKeyX( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpName, + DWORD cbName + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("RegEnumKey\n"); + #endif + + CHAR sz[MAX_PATH+1]; + LONG ret; + + // + // Return lengths do not include zero char. + // + ret = RegEnumKeyA(hKey, dwIndex, sz, cbName); + if (ret == ERROR_SUCCESS) + { + AnsiToUnicode(lpName, sz, lstrlenA(sz) + 1); + } + return ret; +} + +HFINDFILE +WINAPI +FindFirstFileX( + LPCWSTR lpFileName, + LPWIN32_FIND_DATAW pwszFd + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("FindFirstFile\n"); + #endif + + WIN32_FIND_DATAA fd; + CHAR sz[MAX_PATH * 2]; + HFINDFILE ret; + int len = wcslen(lpFileName) + 1; + + UnicodeToAnsiOem(sz, lpFileName, sizeof(sz)); + ret = FindFirstFileA(sz, &fd); + if (ret != INVALID_HANDLE_VALUE) + { + memcpy(pwszFd, &fd, sizeof(FILETIME)*3 + sizeof(DWORD)*5); + AnsiToUnicodeOem(pwszFd->cFileName, fd.cFileName, + lstrlenA(fd.cFileName) + 1); + AnsiToUnicodeOem(pwszFd->cAlternateFileName, fd.cAlternateFileName, + 14); + } + + return ret; +} + +//+--------------------------------------------------------------------------- +// +// Function: wsprintfX +// +// Synopsis: Nightmare string function +// +// Arguments: [pwszOut] -- +// [pwszFormat] -- +// [...] -- +// +// Returns: +// +// History: 1-06-94 ErikGav Created +// +// Notes: If you're reading this, you're probably having a problem with +// this function. Make sure that your "%s" in the format string +// says "%ws" if you are passing wide strings. +// +// %s on NT means "wide string" +// %s on Chicago means "ANSI string" +// +//---------------------------------------------------------------------------- + +int WINAPIV wsprintfX(LPWSTR pwszOut, LPCWSTR pwszFormat, ...) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("wsprintf\n"); + #endif + + LPSTR szFormat; + LPWSTR pwszTemp = NULL; + int i = 0; + + // Convert the format string over + + szFormat = Convert(pwszFormat); + if (szFormat == ERR) + { + szFormat = NULL; + goto Exit; + } + + // magic voodoo follows: + // + // 1. Call wvsprintf passing the varargs + // 2. Use the pwszOut as a temp buffer to hold the ANSI output + // 3. Save the returned characters + + i = wvsprintfA((LPSTR) pwszOut, szFormat, + (LPSTR) ((BYTE*)&pwszFormat) + sizeof(pwszFormat)); + + // allocate a buffer for the Ansi to Unicode conversion + + pwszTemp = new WCHAR[i+1]; + + // convert the string + + AnsiToUnicode(pwszTemp, (LPSTR) pwszOut, i+1); + + // copy it to the out buffer + + wcsncpy(pwszOut, pwszTemp, i+1); + +Exit: + if (pwszTemp) + delete pwszTemp; + if (szFormat) + delete szFormat; + return i; +} + +BOOL +WINAPI +GetComputerNameX( + LPWSTR pwszName, + LPDWORD lpcchBuffer + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetComputerName\n"); + #endif + + BOOL ret; + LPSTR sz; + + sz = new CHAR[*lpcchBuffer]; + ret = GetComputerNameA(sz, lpcchBuffer); + + if (ret) + { + AnsiToUnicode(pwszName, sz, *lpcchBuffer); + } + + if (sz) + delete sz; + return ret; +} + +DWORD +WINAPI +GetFullPathNameX( + LPCWSTR lpFileName, + DWORD cchBuffer, + LPWSTR lpPathBuffer, + LPWSTR *lppFilePart + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetFullPathName\n"); + #endif + + LPSTR szFileName; + CHAR szPathBuffer[MAX_PATH]; + LPSTR szFilePart; + DWORD ret; + + + szFileName = ConvertOem(lpFileName); + if (szFileName == ERR) + return 0; + + ret = GetFullPathNameA(szFileName, cchBuffer, szPathBuffer, &szFilePart); + + AnsiToUnicode(lpPathBuffer, szPathBuffer, cchBuffer); + + *lppFilePart = lpPathBuffer + (szFilePart - szPathBuffer); + + if (szFileName) + delete szFileName; + + return ret; +} + + +DWORD +WINAPI +GetShortPathNameX( + LPCWSTR lpszFullPath, + LPWSTR lpszShortPath, + DWORD cchBuffer + ) +{ + #ifdef DEBUG_OUTPUT + OutputDebugString("GetShortPathName\n"); + #endif + + LPSTR szFullPath; + CHAR szShortBuffer[MAX_PATH]; + DWORD ret; + + + szFullPath = Convert(lpszFullPath); + if (szFullPath == ERR) + return 0; + + if (lpszShortPath == NULL) + { + ret = GetShortPathNameA(szFullPath, NULL, cchBuffer); + } + else + { + ret = GetShortPathNameA(szFullPath, szShortBuffer, sizeof(szShortBuffer)); + + // + // Only convert the actual data, not the whole buffer. + // + if (cchBuffer > ret + 1) + cchBuffer = ret + 1; + + AnsiToUnicode(lpszShortPath, szShortBuffer, cchBuffer); + } + + delete szFullPath; + + return ret; +} + + +DWORD +WINAPI +SearchPathX( + LPCWSTR lpPath, + LPCWSTR lpFileName, + LPCWSTR lpExtension, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart + ) +{ + LPSTR lpszFileName; + CHAR szBuffer[MAX_PATH]; + DWORD ret; + + + #ifdef DEBUG_OUTPUT + OutputDebugString("SearchPath\n"); + #endif + + lpszFileName = Convert(lpFileName); + if (lpszFileName == ERR) + return 0; + + ret = SearchPathA(NULL, lpszFileName, NULL, sizeof(szBuffer), szBuffer, NULL); + + AnsiToUnicode(lpBuffer, szBuffer, lstrlenA(szBuffer) + 1); + + delete lpszFileName; + + return ret; +} + + +ATOM +WINAPI +GlobalFindAtomX( + LPCWSTR lpString + ) +{ + LPSTR lpszString; + ATOM retAtom; + + + #ifdef DEBUG_OUTPUT + OutputDebugString("GlobalFindAtom\n"); + #endif + + lpszString = Convert(lpString); + if (lpszString == ERR) + return 0; + + retAtom = GlobalFindAtomA(lpszString); + + delete lpszString; + + return retAtom; +} + + +int +WINAPI +GetClassNameX( + HWND hWnd, + LPWSTR lpClassName, + int nMaxCount) +{ + LPSTR lpszClassName; + int ret; + + + #ifdef DEBUG_OUTPUT + OutputDebugString("GetClassName\n"); + #endif + + lpszClassName = Convert(lpClassName); + if (lpszClassName == ERR) + return 0; + + ret = GetClassNameA(hWnd, lpszClassName, nMaxCount); + + delete lpszClassName; + + return ret; +} + + +int +WINAPI +lstrlenX(LPCWSTR lpString) +{ + return wcslen(lpString); +} + +LPWSTR +WINAPI +lstrcatX( + LPWSTR lpString1, + LPCWSTR lpString2) +{ + return wcscat(lpString1, lpString2); +} + +int +WINAPI +lstrcmpX( + LPCWSTR lpString1, + LPCWSTR lpString2 + ) +{ + return wcscmp(lpString1, lpString2); +} + +int +WINAPI +lstrcmpiX( + LPCWSTR lpString1, + LPCWSTR lpString2 + ) +{ + return _wcsicmp(lpString1, lpString2); +} + +LPWSTR +WINAPI +lstrcpyX( + LPWSTR lpString1, + LPCWSTR lpString2 + ) +{ + return wcscpy(lpString1, lpString2); +} + + + +HANDLE +WINAPI +CreateFileMappingX( + HANDLE hFile, + LPSECURITY_ATTRIBUTES lpFileMappingAttributes, + DWORD flProtect, + DWORD dwMaximumSizeHigh, + DWORD dwMaximumSizeLow, + LPCWSTR lpName + ) +{ + LPSTR lpszAName; + HANDLE ret; + + + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateFileMapping\n"); + #endif + + lpszAName = Convert(lpName); + + if (lpszAName == ERR) + { + return 0; + } + + ret = CreateFileMappingA( + hFile, + lpFileMappingAttributes, + flProtect, + dwMaximumSizeHigh, + dwMaximumSizeLow, + lpszAName); + + delete lpszAName; + + return ret; +} + + +HANDLE +WINAPI +OpenFileMappingX( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName + ) +{ + LPSTR lpszAName; + HANDLE ret; + + + #ifdef DEBUG_OUTPUT + OutputDebugString("CreateFileMapping\n"); + #endif + + lpszAName = Convert(lpName); + + if (lpszAName == ERR) + { + return 0; + } + + ret = OpenFileMappingA( + dwDesiredAccess, + bInheritHandle, + lpszAName); + + delete lpszAName; + + return ret; +} + +#endif // CHICAGO |