Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

695 lines
21 KiB

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
//
// UTIL.C - common utility functions
//
// HISTORY:
//
// 12/21/94 jeremys Created.
// 96/03/24 markdu Replaced memset with ZeroMemory for consistency.
// 96/04/06 markdu NASH BUG 15653 Use exported autodial API.
// Need to keep a modified SetInternetConnectoid to set the
// MSN backup connectoid.
// 96/05/14 markdu NASH BUG 21706 Removed BigFont functions.
//
#include "pre.h"
// function prototypes
VOID _cdecl FormatErrorMessage(LPTSTR pszMsg,DWORD cbMsg,LPTSTR pszFmt,LPTSTR szArg);
VOID Win95JMoveDlgItem( HWND hwndParent, HWND hwndItem, int iUp );
// Static data
static const TCHAR szRegValICWCompleted[] = TEXT("Completed");
#define MAX_STRINGS 5
#define OEM_CONFIG_INS_FILENAME TEXT("icw\\OEMCNFG.INS")
#define OEM_CONFIG_REGKEY TEXT("SOFTWARE\\Microsoft\\Internet Connection Wizard\\INS processing")
#define OEM_CONFIG_REGVAL_FAILED TEXT("Process failed")
#define OEM_CONFIG_REGVAL_ISPNAME TEXT("ISP name")
#define OEM_CONFIG_REGVAL_SUPPORTNUM TEXT("Support number")
#define OEM_CONFIG_INS_SECTION TEXT("Entry")
#define OEM_CONFIG_INS_ISPNAME TEXT("Entry_Name")
#define OEM_CONFIG_INS_SUPPORTNUM TEXT("Support_Number")
int iSzTable=0;
TCHAR szStrTable[MAX_STRINGS][512];
//+----------------------------------------------------------------------------
// NAME: GetSz
//
// Load strings from resources
//
// Created 1/28/96, Chris Kauffman
//+----------------------------------------------------------------------------
LPTSTR GetSz(WORD wszID)
{
LPTSTR psz = szStrTable[iSzTable];
iSzTable++;
if (iSzTable >= MAX_STRINGS)
iSzTable = 0;
if (!LoadString(g_hInstance, wszID, psz, 512))
{
*psz = 0;
}
return (psz);
}
/*******************************************************************
NAME: MsgBox
SYNOPSIS: Displays a message box with the specified string ID
********************************************************************/
int MsgBox(HWND hWnd,UINT nMsgID,UINT uIcon,UINT uButtons)
{
return (MessageBox(hWnd,
GetSz((USHORT)nMsgID),
GetSz(IDS_APPNAME),
uIcon | uButtons));
}
/*******************************************************************
NAME: MsgBoxSz
SYNOPSIS: Displays a message box with the specified text
********************************************************************/
int MsgBoxSz(HWND hWnd,LPTSTR szText,UINT uIcon,UINT uButtons)
{
return (MessageBox(hWnd,szText,GetSz(IDS_APPNAME),uIcon | uButtons));
}
void OlsFinish()
{
QuickCompleteSignup();
g_bRunDefaultHtm = FALSE;
g_szShellNext[0] = '\0';
}
void SetICWComplete(void)
{
// Set the completed bit
HKEY hkey = NULL;
DWORD dwValue = 1;
DWORD dwDisposition = 0;
if(ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER,
ICWSETTINGSPATH,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition))
{
RegSetValueEx(hkey,
szRegValICWCompleted,
0,
REG_BINARY,
(LPBYTE) &dwValue,
sizeof(DWORD));
RegCloseKey(hkey);
}
}
LPWSTR WINAPI A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars)
{
ASSERT(lpa != NULL);
ASSERT(lpw != NULL);\
// verify that no illegal character present
// since lpw was allocated based on the size of lpa
// don't worry about the number of chars
lpw[0] = '\0';
MultiByteToWideChar(CP_ACP, 0, lpa, -1, lpw, nChars);
return lpw;
}
LPSTR WINAPI W2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars)
{
ASSERT(lpw != NULL);
ASSERT(lpa != NULL);
// verify that no illegal character present
// since lpa was allocated based on the size of lpw
// don't worry about the number of chars
lpa[0] = '\0';
WideCharToMultiByte(CP_ACP, 0, lpw, -1, lpa, nChars, NULL, NULL);
return lpa;
}
HRESULT ConnectToICWConnectionPoint
(
IUnknown *punkThis,
REFIID riidEvent,
BOOL fConnect,
IUnknown *punkTarget,
DWORD *pdwCookie,
IConnectionPoint **ppcpOut
)
{
// We always need punkTarget, we only need punkThis on connect
if (!punkTarget || (fConnect && !punkThis))
{
return E_FAIL;
}
if (ppcpOut)
*ppcpOut = NULL;
HRESULT hr;
IConnectionPointContainer *pcpContainer;
if (SUCCEEDED(hr = punkTarget->QueryInterface(IID_IConnectionPointContainer, (void **)&pcpContainer)))
{
IConnectionPoint *pcp;
if(SUCCEEDED(hr = pcpContainer->FindConnectionPoint(riidEvent, &pcp)))
{
if(fConnect)
{
// Add us to the list of people interested...
hr = pcp->Advise(punkThis, pdwCookie);
if (FAILED(hr))
*pdwCookie = 0;
}
else
{
// Remove us from the list of people interested...
hr = pcp->Unadvise(*pdwCookie);
*pdwCookie = 0;
}
if (ppcpOut && SUCCEEDED(hr))
*ppcpOut = pcp;
else
pcp->Release();
pcp = NULL;
}
pcpContainer->Release();
pcpContainer = NULL;
}
return hr;
}
BOOL ConfirmCancel(HWND hWnd)
{
TCHAR szTitle[MAX_TITLE];
TCHAR szMessage[MAX_MESSAGE];
LoadString(g_hInstance, IDS_APPNAME, szTitle, ARRAYSIZE(szTitle));
LoadString(g_hInstance, IDS_WANTTOEXIT, szMessage, ARRAYSIZE(szMessage));
if (IDYES == MessageBox(hWnd,
szMessage,
szTitle,
MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2))
{
return TRUE;
}
else
{
return FALSE;
}
}
BOOL Restart(HWND hWnd)
{
TCHAR szLongString[1024];
LPTSTR pszSmallString1, pszSmallString2;
pszSmallString1 = GetSz(IDS_NEEDRESTART1);
pszSmallString2 = GetSz(IDS_NEEDRESTART2);
lstrcpy(szLongString,pszSmallString1);
lstrcat(szLongString,pszSmallString2);
if (IDYES == MessageBox(hWnd,
szLongString,
GetSz(IDS_APPNAME),
MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2))
{
SetupForReboot(1);
return TRUE;
}
else
{
return FALSE;
}
}
void Reboot(HWND hWnd)
{
TCHAR szLongString[1024];
LPTSTR pszSmallString1, pszSmallString2;
// 4/28/97 ChrisK
// Fix build break, because string was too long for compiler.
pszSmallString1 = GetSz(IDS_NEEDREBOOT1);
pszSmallString2 = GetSz(IDS_NEEDREBOOT2);
lstrcpy(szLongString,pszSmallString1);
lstrcat(szLongString,pszSmallString2);
//
// ChrisK Olympus 419
// We changed our mind again and decided to no give the user a chance to avoid rebooting.
//
MessageBox( hWnd,
szLongString,
GetSz(IDS_APPNAME),
MB_APPLMODAL |
MB_ICONINFORMATION |
MB_SETFOREGROUND |
MB_OK);
SetupForReboot(0);
}
BOOL WINAPI ConfigureSystem(HWND hDlg)
{
BOOL bReboot = FALSE;
BOOL bRestart = FALSE;
BOOL bQuitWizard = FALSE;
BOOL bNoPWCaching = FALSE;
PropSheet_SetWizButtons(GetParent(hDlg),0);
gpWizardState->cmnStateData.pICWSystemConfig->ConfigSystem(&gpWizardState->cmnStateData.bSystemChecked);
PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT);
if (!gpWizardState->cmnStateData.bSystemChecked)
{
gpWizardState->cmnStateData.pICWSystemConfig->get_NeedsReboot(&bReboot);
if (bReboot)
{
Reboot(hDlg);
gfQuitWizard = TRUE;
return FALSE;
}
gpWizardState->cmnStateData.pICWSystemConfig->get_NeedsRestart(&bRestart);
if (bRestart)
{
if (Restart(hDlg))
{
gfQuitWizard = TRUE;
return FALSE;
}
else
{
if (ConfirmCancel(hDlg))
{
gfQuitWizard = TRUE;
}
return FALSE;
}
}
gpWizardState->cmnStateData.pICWSystemConfig->get_QuitWizard(&bQuitWizard);
if(bQuitWizard)
{
gfQuitWizard = TRUE;
return FALSE;
}
else
{
if (ConfirmCancel(hDlg))
gfQuitWizard = TRUE;
return FALSE;
}
}
// Make sure there is not a policy against password caching
gpWizardState->cmnStateData.pICWSystemConfig->CheckPasswordCachingPolicy(&bNoPWCaching);
if (bNoPWCaching)
{
// too bad, no password caching, no ICW
gfQuitWizard = TRUE;
return FALSE;
}
return true;
}
BOOL IsNT5()
{
OSVERSIONINFO OsVersionInfo;
ZeroMemory(&OsVersionInfo, sizeof(OSVERSIONINFO));
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);
return ((VER_PLATFORM_WIN32_NT == OsVersionInfo.dwPlatformId) && (OsVersionInfo.dwMajorVersion >= 5));
}
BOOL IsNT()
{
OSVERSIONINFO OsVersionInfo;
ZeroMemory(&OsVersionInfo, sizeof(OSVERSIONINFO));
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);
return (VER_PLATFORM_WIN32_NT == OsVersionInfo.dwPlatformId);
}
BOOL IsWhistler()
{
BOOL bRet = FALSE;
OSVERSIONINFO OsVersionInfo;
ZeroMemory(&OsVersionInfo, sizeof(OSVERSIONINFO));
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&OsVersionInfo))
{
if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
OsVersionInfo.dwMajorVersion >= 5 &&
OsVersionInfo.dwMinorVersion >= 1)
{
bRet = TRUE;
}
}
return bRet;
}
BOOL DoesUserHaveAdminPrivleges(HINSTANCE hInstance)
{
HKEY hKey = NULL;
BOOL bRet = FALSE;
if (!IsNT())
return TRUE;
// BUGBUG: We should allow NT5 to run in all user groups
// except normal users.
if (IsNT5())
return TRUE;
//
// Ensure caller is an administrator on this machine.
//
if(RegOpenKeyEx(HKEY_USERS, TEXT(".DEFAULT"), 0, KEY_WRITE, &hKey) == 0)
{
RegCloseKey(hKey);
bRet = TRUE;
}
return bRet;
}
void WINAPI FillWindowWithAppBackground
(
HWND hWndToFill,
HDC hdc
)
{
RECT rcUpdate;
RECT rcBmp;
HDC hdcWnd;
HDC hSourceDC;
HGDIOBJ hgdiOldBitmap;
// If we are passed in the DC to use then use it, otherwise get
// the DC from the window handle
if (hdc)
hdcWnd = hdc;
else
hdcWnd = GetDC(hWndToFill);
hSourceDC = CreateCompatibleDC( hdcWnd );
// Compute the client area of the main window that needs to be
// erased, so that we can extract that chunk of the background
// bitmap
GetUpdateRect(hWndToFill, &rcUpdate, FALSE);
// Make sure the rectangle is not empty
if (IsRectEmpty(&rcUpdate))
{
InvalidateRect(hWndToFill, NULL, FALSE);
GetUpdateRect(hWndToFill, &rcUpdate, FALSE);
}
rcBmp = rcUpdate;
if (hWndToFill != gpWizardState->cmnStateData.hWndApp)
MapWindowPoints(hWndToFill, gpWizardState->cmnStateData.hWndApp, (LPPOINT)&rcBmp, 2);
// paint the background bitmap
hgdiOldBitmap = SelectObject( hSourceDC, (HGDIOBJ) gpWizardState->cmnStateData.hbmBkgrnd);
BitBlt( hdcWnd,
rcUpdate.left,
rcUpdate.top,
RECTWIDTH(rcUpdate),
RECTHEIGHT(rcUpdate),
hSourceDC,
rcBmp.left,
rcBmp.top,
SRCCOPY );
// Cleanup GDI Objects
SelectObject( hSourceDC, hgdiOldBitmap );
DeleteDC(hSourceDC);
// If we were not passed the DC, then release the one that we
// got from the window handle
if (!hdc)
ReleaseDC(hWndToFill, hdcWnd);
}
// Fill in a rectangle within the specificed DC with the app's bkgrnd.
// lpRectDC is a rectangle in the DC's coordinate space, and lpRectApp
// is a rectangle in the Apps coordinate space
void FillDCRectWithAppBackground
(
LPRECT lpRectDC,
LPRECT lpRectApp,
HDC hdc
)
{
HDC hSourceDC = CreateCompatibleDC( hdc );
HGDIOBJ hgdiOldBitmap;
// paint the background bitmap
hgdiOldBitmap = SelectObject( hSourceDC, (HGDIOBJ) gpWizardState->cmnStateData.hbmBkgrnd);
BitBlt( hdc,
lpRectDC->left,
lpRectDC->top,
RECTWIDTH(*lpRectDC),
RECTHEIGHT(*lpRectDC),
hSourceDC,
lpRectApp->left,
lpRectApp->top,
SRCCOPY );
// Cleanup GDI Objects
SelectObject( hSourceDC, hgdiOldBitmap );
DeleteDC(hSourceDC);
}
BOOL CheckForOemConfigFailure(HINSTANCE hInstance)
{
HKEY hKey = NULL;
DWORD dwFailed = 0;
DWORD dwSize = sizeof(dwFailed);
TCHAR szIspName [MAX_PATH+1] = TEXT("\0");
TCHAR szSupportNum [MAX_PATH+1] = TEXT("\0");
TCHAR szErrMsg1 [MAX_RES_LEN] = TEXT("\0");
TCHAR szErrMsg2 [MAX_RES_LEN] = TEXT("\0");
TCHAR szErrMsgTmp1 [MAX_RES_LEN] = TEXT("\0");
TCHAR szErrMsgTmp2 [MAX_RES_LEN] = TEXT("\0");
TCHAR szCaption [MAX_RES_LEN] = TEXT("\0");
TCHAR szErrDlgMsg [MAX_PATH*2 + MAX_RES_LEN + 2] = TEXT("\0");
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
OEM_CONFIG_REGKEY,
0,
KEY_ALL_ACCESS,
&hKey);
if(hKey)
{
RegQueryValueEx(hKey,
OEM_CONFIG_REGVAL_FAILED,
0,
NULL,
(LPBYTE)&dwFailed,
&dwSize);
if(dwFailed)
{
dwSize = sizeof(szIspName);
RegQueryValueEx(hKey,
OEM_CONFIG_REGVAL_ISPNAME,
0,
NULL,
(LPBYTE)&szIspName,
&dwSize);
dwSize = sizeof(szSupportNum);
RegQueryValueEx(hKey,
OEM_CONFIG_REGVAL_SUPPORTNUM,
0,
NULL,
(LPBYTE)&szSupportNum,
&dwSize);
if(*szIspName)
{
LoadString(hInstance, IDS_PRECONFIG_ERROR_1, szErrMsg1, ARRAYSIZE(szErrMsg1));
wsprintf(szErrMsgTmp1, szErrMsg1, szIspName);
lstrcpy(szErrDlgMsg,szErrMsgTmp1);
}
else
{
LoadString(hInstance, IDS_PRECONFIG_ERROR_1_NOINFO, szErrMsg1, ARRAYSIZE(szErrMsg1));
lstrcpy(szErrDlgMsg, szErrMsg1);
}
if(*szSupportNum)
{
LoadString(hInstance, IDS_PRECONFIG_ERROR_2, szErrMsg2, ARRAYSIZE(szErrMsg2));
wsprintf(szErrMsgTmp2, szErrMsg2, szSupportNum);
lstrcat(szErrDlgMsg, szErrMsgTmp2);
}
else
{
LoadString(hInstance, IDS_PRECONFIG_ERROR_2_NOINFO, szErrMsg2, ARRAYSIZE(szErrMsg2));
lstrcat(szErrDlgMsg, szErrMsg2);
}
LoadString(hInstance, IDS_APPNAME, szCaption, ARRAYSIZE(szCaption));
MessageBox(NULL, szErrDlgMsg, szCaption, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
dwFailed = 0;
RegSetValueEx(hKey,
OEM_CONFIG_REGVAL_FAILED,
0,
REG_DWORD,
(LPBYTE)&dwFailed,
sizeof(dwFailed));
RegCloseKey(hKey);
return TRUE;
}
RegCloseKey(hKey);
}
return FALSE;
}
//returns TRUE if it could successfully find locate the file
//and attempt to configure the system, this does not mean however that the process was successful
BOOL RunOemconfigIns()
{
TCHAR szInsPath [MAX_PATH+1] = TEXT("\0");
TCHAR szIspName [MAX_PATH+1] = TEXT("\0");
TCHAR szSupportNum [MAX_PATH+1] = TEXT("\0");
BOOL bRet = FALSE;
GetWindowsDirectory(szInsPath, MAX_PATH+1);
if(!szInsPath)
return FALSE;
if(*CharPrev(szInsPath, szInsPath + lstrlen(szInsPath)) != TEXT('\\'))
lstrcat(szInsPath, TEXT("\\"));
lstrcat(szInsPath, OEM_CONFIG_INS_FILENAME);
//if we can't find the file return false
if(0xFFFFFFFF == GetFileAttributes(szInsPath))
return FALSE;
//ProcessINS will nuke the file so if we want this info we should get it now
GetPrivateProfileString(OEM_CONFIG_INS_SECTION,
OEM_CONFIG_INS_ISPNAME,
TEXT(""),
szIspName,
ARRAYSIZE(szIspName),
szInsPath);
GetPrivateProfileString(OEM_CONFIG_INS_SECTION,
OEM_CONFIG_INS_SUPPORTNUM,
TEXT(""),
szSupportNum,
ARRAYSIZE(szSupportNum),
szInsPath);
//set silent mode to disallow UI
gpWizardState->pINSHandler->put_SilentMode(TRUE);
// Process the inf file.
gpWizardState->pINSHandler->ProcessINS(A2W(szInsPath), &bRet);
if(bRet)
QuickCompleteSignup();
else
{
HKEY hKey = NULL;
DWORD dwDisposition = 0;
DWORD dwFailed = 1;
//Let's make double sure we nuke the file.
if(0xFFFFFFFF != GetFileAttributes(szInsPath))
{
DeleteFile(szInsPath);
}
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
OEM_CONFIG_REGKEY,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition);
if(hKey)
{
RegSetValueEx(hKey,
OEM_CONFIG_REGVAL_FAILED,
0,
REG_DWORD,
(LPBYTE)&dwFailed,
sizeof(dwFailed));
RegSetValueEx(hKey,
OEM_CONFIG_REGVAL_ISPNAME,
0,
REG_SZ,
(LPBYTE)szIspName,
sizeof(TCHAR)*lstrlen(szIspName));
RegSetValueEx(hKey,
OEM_CONFIG_REGVAL_SUPPORTNUM,
0,
REG_SZ,
(LPBYTE)szSupportNum,
sizeof(TCHAR)*lstrlen(szSupportNum));
CloseHandle(hKey);
}
}
return TRUE;
}