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
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;
|
|
}
|