windows-nt/Source/XPSP1/NT/net/rras/cm/uapi/uapiinit/uapiinit.cpp
2020-09-26 16:20:57 +08:00

519 lines
18 KiB
C++

//+----------------------------------------------------------------------------
//
// File: uapiinit.cpp
//
// Module: UAPIINIT (static lib)
//
// Synopsis: This static library wraps up the initialization code needed for a module
// to use cmutoa.dll. Calling the InitUnicodeAPI function either sets up
// the modules U pointers (this library also contains all the U pointer
// declarations) with the W version of the API if running on NT or the
// appropriate A or UA API depending on whether conversion is needed before/after
// calling the windows API or not. Modules using this lib should include the
// uapi.h header in their precompiled header and should have cmutoa.dll handy
// on win9x. The idea for this library and the associated dll was borrowed
// from F. Avery Bishop's April 1999 MSJ article "Design a Single Unicode
// App that Runs on Both Windows 98 and Windows 2000"
//
// Copyright (c) 1999 Microsoft Corporation
//
// Author: quintinb Created 4-25-99
//
// History:
//+----------------------------------------------------------------------------
#include <windows.h>
#include <shlobj.h>
#include "cmdebug.h"
#include "cmutoa.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
UAPI_CallWindowProc CallWindowProcU;
UAPI_CharLower CharLowerU;
UAPI_CharPrev CharPrevU;
UAPI_CharNext CharNextU;
UAPI_CharUpper CharUpperU;
UAPI_CreateDialogParam CreateDialogParamU;
UAPI_CreateDirectory CreateDirectoryU;
UAPI_CreateEvent CreateEventU;
UAPI_CreateFile CreateFileU;
UAPI_CreateFileMapping CreateFileMappingU;
UAPI_CreateMutex CreateMutexU;
UAPI_CreateProcess CreateProcessU;
UAPI_CreateWindowEx CreateWindowExU;
UAPI_DefWindowProc DefWindowProcU;
UAPI_DeleteFile DeleteFileU;
UAPI_DialogBoxParam DialogBoxParamU;
UAPI_DispatchMessage DispatchMessageU;
UAPI_ExpandEnvironmentStrings ExpandEnvironmentStringsU;
UAPI_FindResourceEx FindResourceExU;
UAPI_FindWindowEx FindWindowExU;
UAPI_GetClassLong GetClassLongU;
UAPI_GetDateFormat GetDateFormatU;
UAPI_GetDlgItemText GetDlgItemTextU;
UAPI_GetFileAttributes GetFileAttributesU;
UAPI_GetMessage GetMessageU;
UAPI_GetModuleFileName GetModuleFileNameU;
UAPI_GetModuleHandle GetModuleHandleU;
UAPI_GetPrivateProfileInt GetPrivateProfileIntU;
UAPI_GetPrivateProfileString GetPrivateProfileStringU;
UAPI_GetStringTypeEx GetStringTypeExU;
UAPI_GetSystemDirectory GetSystemDirectoryU;
UAPI_GetTempFileName GetTempFileNameU;
UAPI_GetTempPath GetTempPathU;
UAPI_GetTimeFormat GetTimeFormatU;
UAPI_GetUserName GetUserNameU;
UAPI_GetVersionEx GetVersionExU;
UAPI_GetWindowLong GetWindowLongU;
UAPI_GetWindowText GetWindowTextU;
UAPI_GetWindowTextLength GetWindowTextLengthU;
UAPI_InsertMenu InsertMenuU;
UAPI_IsDialogMessage IsDialogMessageU;
UAPI_LoadCursor LoadCursorU;
UAPI_LoadIcon LoadIconU;
UAPI_LoadImage LoadImageU;
UAPI_LoadLibraryEx LoadLibraryExU;
UAPI_LoadMenu LoadMenuU;
UAPI_LoadString LoadStringU;
UAPI_lstrcat lstrcatU;
UAPI_lstrcmp lstrcmpU;
UAPI_lstrcmpi lstrcmpiU;
UAPI_lstrcpy lstrcpyU;
UAPI_lstrcpyn lstrcpynU;
UAPI_lstrlen lstrlenU;
UAPI_OpenEvent OpenEventU;
UAPI_OpenFileMapping OpenFileMappingU;
UAPI_PeekMessage PeekMessageU;
UAPI_PostMessage PostMessageU;
UAPI_PostThreadMessage PostThreadMessageU;
UAPI_RegCreateKeyEx RegCreateKeyExU;
UAPI_RegDeleteKey RegDeleteKeyU;
UAPI_RegDeleteValue RegDeleteValueU;
UAPI_RegEnumKeyEx RegEnumKeyExU;
UAPI_RegisterClassEx RegisterClassExU;
UAPI_RegisterWindowMessage RegisterWindowMessageU;
UAPI_RegOpenKeyEx RegOpenKeyExU;
UAPI_RegQueryValueEx RegQueryValueExU;
UAPI_RegSetValueEx RegSetValueExU;
UAPI_SearchPath SearchPathU;
UAPI_SendDlgItemMessage SendDlgItemMessageU;
UAPI_SendMessage SendMessageU;
UAPI_SetCurrentDirectory SetCurrentDirectoryU;
UAPI_SetDlgItemText SetDlgItemTextU;
UAPI_SetWindowLong SetWindowLongU;
UAPI_SetWindowText SetWindowTextU;
UAPI_UnregisterClass UnregisterClassU;
UAPI_WinHelp WinHelpU;
UAPI_wsprintf wsprintfU;
UAPI_WritePrivateProfileString WritePrivateProfileStringU;
UAPI_wvsprintf wvsprintfU;
//+----------------------------------------------------------------------------
//
// Function: CheckUAPIFunctionPointers
//
// Synopsis: Checks all of the xxxU function pointers to ensure that they are
// non-NULL. Will catch a function load failure.
//
// Arguments: None
//
// Returns: BOOL - TRUE on success
//
// History: quintinb Created 6/24/99
//
//+----------------------------------------------------------------------------
BOOL CheckUAPIFunctionPointers()
{
return (CallWindowProcU &&
CharLowerU &&
CharPrevU &&
CharNextU &&
CharUpperU &&
CreateDialogParamU &&
CreateDirectoryU &&
CreateEventU &&
CreateFileU &&
CreateFileMappingU &&
CreateMutexU &&
CreateProcessU &&
CreateWindowExU &&
DefWindowProcU &&
DeleteFileU &&
DialogBoxParamU &&
DispatchMessageU &&
ExpandEnvironmentStringsU &&
FindResourceExU &&
FindWindowExU &&
GetClassLongU &&
GetDateFormatU &&
GetDlgItemTextU &&
GetFileAttributesU &&
GetMessageU &&
GetModuleFileNameU &&
GetModuleHandleU &&
GetPrivateProfileIntU &&
GetPrivateProfileStringU &&
GetStringTypeExU &&
GetSystemDirectoryU &&
GetTempFileNameU &&
GetTempPathU &&
GetTimeFormatU &&
GetUserNameU &&
GetVersionExU &&
GetWindowLongU &&
GetWindowTextU &&
GetWindowTextLengthU &&
InsertMenuU &&
IsDialogMessageU &&
LoadCursorU &&
LoadIconU &&
LoadImageU &&
LoadLibraryExU &&
LoadMenuU &&
LoadStringU &&
lstrcatU &&
lstrcmpU &&
lstrcmpiU &&
lstrcpyU &&
lstrcpynU &&
lstrlenU &&
OpenEventU &&
OpenFileMappingU &&
PeekMessageU &&
PostMessageU &&
PostThreadMessageU &&
RegCreateKeyExU &&
RegDeleteKeyU &&
RegDeleteValueU &&
RegEnumKeyExU &&
RegisterClassExU &&
RegisterWindowMessageU &&
RegOpenKeyExU &&
RegQueryValueExU &&
RegSetValueExU &&
SearchPathU &&
SendDlgItemMessageU &&
SendMessageU &&
SetCurrentDirectoryU &&
SetDlgItemTextU &&
SetWindowLongU &&
SetWindowTextU &&
UnregisterClassU &&
WinHelpU &&
wsprintfU &&
WritePrivateProfileStringU &&
wvsprintfU);
}
//+----------------------------------------------------------------------------
//
// Function: InitUnicodeAPI
//
// Synopsis: Initializes the Unicode wrapper APIs. Thus on Windows NT we will
// use the native Unicode (xxxW) form of the API and on Win9x we
// will use the UA form located in cmutoa.dll. This prevents have
// a wrapper function to call through on the NT platforms were it is
// really unneccesary.
//
// Arguments: None
//
// Returns: BOOL - TRUE on success
//
// History: quintinb Created 6/24/99
//
//+----------------------------------------------------------------------------
BOOL InitUnicodeAPI()
{
OSVERSIONINFO Osv;
BOOL IsWindowsNT;
HMODULE hCmUtoADll = NULL;
Osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
if(!GetVersionEx(&Osv))
{
return FALSE ;
}
IsWindowsNT = (BOOL) (Osv.dwPlatformId == VER_PLATFORM_WIN32_NT) ;
// define this symbol in UAPI.H to emulate Windows 9x when testing on Windows NT.
#ifdef EMULATE9X
IsWindowsNT = FALSE;
#endif
if(IsWindowsNT)
{
CallWindowProcU = CallWindowProcW;
CharLowerU = CharLowerW;
CharPrevU = CharPrevW;
CharNextU = CharNextW;
CharUpperU = CharUpperW;
CreateDialogParamU = CreateDialogParamW;
CreateDirectoryU = CreateDirectoryW;
CreateEventU = CreateEventW;
CreateFileU = CreateFileW;
CreateFileMappingU = CreateFileMappingW;
CreateMutexU = CreateMutexW;
CreateProcessU = CreateProcessW;
CreateWindowExU = CreateWindowExW;
DefWindowProcU = DefWindowProcW;
DeleteFileU = DeleteFileW;
DialogBoxParamU = DialogBoxParamW;
DispatchMessageU = DispatchMessageW;
ExpandEnvironmentStringsU = ExpandEnvironmentStringsW;
FindResourceExU = FindResourceExW;
FindWindowExU = FindWindowExW;
GetClassLongU = GetClassLongW;
GetDateFormatU = GetDateFormatW;
GetDlgItemTextU = GetDlgItemTextW;
GetFileAttributesU = GetFileAttributesW;
GetMessageU = GetMessageW;
GetModuleFileNameU = GetModuleFileNameW;
GetModuleHandleU = GetModuleHandleW;
GetPrivateProfileIntU = GetPrivateProfileIntW;
GetPrivateProfileStringU = GetPrivateProfileStringW;
GetStringTypeExU = GetStringTypeExW;
GetSystemDirectoryU = GetSystemDirectoryW;
GetTempFileNameU = GetTempFileNameW;
GetTempPathU = GetTempPathW;
GetTimeFormatU = GetTimeFormatW;
GetUserNameU = GetUserNameW;
GetVersionExU = GetVersionExW;
GetWindowLongU = GetWindowLongPtrW;
GetWindowTextU = GetWindowTextW;
GetWindowTextLengthU = GetWindowTextLengthW;
InsertMenuU = InsertMenuW;
IsDialogMessageU = IsDialogMessageW;
LoadCursorU = LoadCursorW;
LoadIconU = LoadIconW;
LoadImageU = LoadImageW;
LoadLibraryExU = LoadLibraryExW;
LoadMenuU = LoadMenuW;
LoadStringU = LoadStringW;
lstrcatU = lstrcatW;
lstrcmpU = lstrcmpW;
lstrcmpiU = lstrcmpiW;
lstrcpyU = lstrcpyW;
lstrcpynU = lstrcpynW;
lstrlenU = lstrlenW;
OpenEventU = OpenEventW;
OpenFileMappingU = OpenFileMappingW;
PeekMessageU = PeekMessageW;
PostMessageU = PostMessageW;
PostThreadMessageU = PostThreadMessageW;
RegCreateKeyExU = RegCreateKeyExW;
RegDeleteKeyU = RegDeleteKeyW;
RegDeleteValueU = RegDeleteValueW;
RegEnumKeyExU = RegEnumKeyExW;
RegisterClassExU = RegisterClassExW;
RegisterWindowMessageU = RegisterWindowMessageW;
RegOpenKeyExU = RegOpenKeyExW;
RegQueryValueExU = RegQueryValueExW;
RegSetValueExU = RegSetValueExW;
SearchPathU = SearchPathW;
SendDlgItemMessageU = SendDlgItemMessageW;
SendMessageU = SendMessageW;
SetCurrentDirectoryU = SetCurrentDirectoryW;
SetDlgItemTextU = SetDlgItemTextW;
SetWindowLongU = SetWindowLongPtrW;
SetWindowTextU = SetWindowTextW;
UnregisterClassU = UnregisterClassW;
WinHelpU = WinHelpW;
wsprintfU = wsprintfW;
WritePrivateProfileStringU = WritePrivateProfileStringW;
wvsprintfU = wvsprintfW;
}
else
{
BOOL (*InitCmUToA)(PUAPIINIT);
UAPIINIT UAInit;
ZeroMemory(&UAInit, sizeof(UAPIINIT));
hCmUtoADll = LoadLibraryExA("cmutoa.DLL", NULL, 0);
if(!hCmUtoADll)
{
DWORD dwError = GetLastError();
CMASSERTMSG(FALSE, TEXT("InitUnicodeAPI -- Cmutoa.dll Failed to Load."));
return FALSE;
}
// Get Initialization routine from the DLL
InitCmUToA = (BOOL (*)(PUAPIINIT)) GetProcAddress(hCmUtoADll, "InitCmUToA") ;
// Set up structure containing locations of U function pointers
UAInit.pCallWindowProcU = &CallWindowProcU;
UAInit.pCharLowerU = &CharLowerU;
UAInit.pCharPrevU = &CharPrevU;
UAInit.pCharNextU = &CharNextU;
UAInit.pCharUpperU = &CharUpperU;
UAInit.pCreateDialogParamU = &CreateDialogParamU;
UAInit.pCreateDirectoryU = &CreateDirectoryU;
UAInit.pCreateEventU = &CreateEventU;
UAInit.pCreateFileU = &CreateFileU;
UAInit.pCreateFileMappingU = &CreateFileMappingU;
UAInit.pCreateMutexU = &CreateMutexU;
UAInit.pCreateProcessU = &CreateProcessU;
UAInit.pCreateWindowExU = &CreateWindowExU;
UAInit.pDefWindowProcU = &DefWindowProcU;
UAInit.pDeleteFileU = &DeleteFileU;
UAInit.pDialogBoxParamU = &DialogBoxParamU;
UAInit.pDispatchMessageU = &DispatchMessageU;
UAInit.pExpandEnvironmentStringsU = &ExpandEnvironmentStringsU;
UAInit.pFindResourceExU = &FindResourceExU;
UAInit.pFindWindowExU = &FindWindowExU;
UAInit.pGetClassLongU = &GetClassLongU;
UAInit.pGetDateFormatU = &GetDateFormatU;
UAInit.pGetDlgItemTextU = &GetDlgItemTextU;
UAInit.pGetFileAttributesU = &GetFileAttributesU;
UAInit.pGetMessageU = &GetMessageU;
UAInit.pGetModuleFileNameU = &GetModuleFileNameU;
UAInit.pGetModuleHandleU = &GetModuleHandleU;
UAInit.pGetPrivateProfileIntU = &GetPrivateProfileIntU;
UAInit.pGetPrivateProfileStringU = &GetPrivateProfileStringU;
UAInit.pGetStringTypeExU = &GetStringTypeExU;
UAInit.pGetSystemDirectoryU = &GetSystemDirectoryU;
UAInit.pGetTempFileNameU = &GetTempFileNameU;
UAInit.pGetTempPathU = &GetTempPathU;
UAInit.pGetTimeFormatU = &GetTimeFormatU;
UAInit.pGetUserNameU = &GetUserNameU;
UAInit.pGetVersionExU = &GetVersionExU;
UAInit.pGetWindowLongU = &GetWindowLongU;
UAInit.pGetWindowTextU = &GetWindowTextU;
UAInit.pGetWindowTextLengthU = &GetWindowTextLengthU;
UAInit.pInsertMenuU = &InsertMenuU;
UAInit.pIsDialogMessageU = &IsDialogMessageU;
UAInit.pLoadCursorU = &LoadCursorU;
UAInit.pLoadIconU = &LoadIconU;
UAInit.pLoadImageU = &LoadImageU;
UAInit.pLoadLibraryExU = &LoadLibraryExU;
UAInit.pLoadMenuU = &LoadMenuU;
UAInit.pLoadStringU = &LoadStringU;
UAInit.plstrcatU = &lstrcatU;
UAInit.plstrcmpU = &lstrcmpU;
UAInit.plstrcmpiU = &lstrcmpiU;
UAInit.plstrcpyU = &lstrcpyU;
UAInit.plstrcpynU = &lstrcpynU;
UAInit.plstrlenU = &lstrlenU;
UAInit.pOpenEventU = &OpenEventU;
UAInit.pOpenFileMappingU = &OpenFileMappingU;
UAInit.pPeekMessageU = &PeekMessageU;
UAInit.pPostMessageU = &PostMessageU;
UAInit.pPostThreadMessageU = &PostThreadMessageU;
UAInit.pRegCreateKeyExU = &RegCreateKeyExU;
UAInit.pRegDeleteKeyU = &RegDeleteKeyU;
UAInit.pRegDeleteValueU = &RegDeleteValueU;
UAInit.pRegEnumKeyExU = &RegEnumKeyExU;
UAInit.pRegisterClassExU = &RegisterClassExU;
UAInit.pRegisterWindowMessageU = &RegisterWindowMessageU;
UAInit.pRegOpenKeyExU = &RegOpenKeyExU;
UAInit.pRegQueryValueExU = &RegQueryValueExU;
UAInit.pRegSetValueExU = &RegSetValueExU;
UAInit.pSearchPathU = &SearchPathU;
UAInit.pSendDlgItemMessageU = &SendDlgItemMessageU;
UAInit.pSendMessageU = &SendMessageU;
UAInit.pSetCurrentDirectoryU = &SetCurrentDirectoryU;
UAInit.pSetDlgItemTextU = &SetDlgItemTextU;
UAInit.pSetWindowLongU = &SetWindowLongU;
UAInit.pSetWindowTextU = &SetWindowTextU;
UAInit.pUnregisterClassU = &UnregisterClassU;
UAInit.pWinHelpU = &WinHelpU;
UAInit.pwsprintfU = &wsprintfU;
UAInit.pWritePrivateProfileStringU = &WritePrivateProfileStringU;
UAInit.pwvsprintfU = &wvsprintfU;
if( NULL == InitCmUToA || !InitCmUToA(&UAInit))
{
CMASSERTMSG(FALSE, TEXT("InitUnicodeAPI -- Unable to find InitCmUToA or InitCmUToA Failed."));
FreeLibrary(hCmUtoADll);
return FALSE;
}
for (int i = 0; i < (sizeof(UAPIINIT) / sizeof(LPVOID)); i++)
{
if (UAInit.ppvUapiFun[i])
{
if (NULL == *(UAInit.ppvUapiFun[i]))
{
CMTRACE1(TEXT("Unable to fill UAInit[%d]. Please Investigate"), i);
}
}
else
{
CMTRACE1(TEXT("No Memory for UAInit[%d]. Please Investigate"), i);
}
}
}
if(!CheckUAPIFunctionPointers())
{
CMASSERTMSG(FALSE, TEXT("InitUnicodeAPI -- CheckUAPIFunctionPointers failed."));
FreeLibrary(hCmUtoADll);
return FALSE;
}
return TRUE ;
}
//+----------------------------------------------------------------------------
//
// Function: UnInitUnicodeAPI
//
// Synopsis: De-Initializes the Unicode wrapper APIs. See InitUnicodeAPI for
// details. Primarily, this function frees the module handle(s).
//
// Arguments: None
//
// Returns: BOOL - TRUE on success
//
// History: sumitc Created 7/01/2000
//
//+----------------------------------------------------------------------------
BOOL UnInitUnicodeAPI()
{
OSVERSIONINFO Osv;
BOOL IsWindowsNT;
Osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
if(!GetVersionEx(&Osv))
{
return FALSE ;
}
IsWindowsNT = (BOOL) (Osv.dwPlatformId == VER_PLATFORM_WIN32_NT) ;
// define this symbol in UAPI.H to emulate Windows 9x when testing on Windows NT.
#ifdef EMULATE9X
IsWindowsNT = FALSE;
#endif
if(!IsWindowsNT)
{
HMODULE hCmUtoADll;
hCmUtoADll = GetModuleHandleA("cmutoa.DLL");
if (!hCmUtoADll)
{
CMTRACE(TEXT("UnInitUnicodeAPI - strange.. cmutoa.dll is not loaded into the process!"));
return FALSE;
}
FreeLibrary(hCmUtoADll);
}
return TRUE;
}
#ifdef __cplusplus
}
#endif /* __cplusplus */