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.
 
 
 
 
 
 

563 lines
18 KiB

#include "asctlpch.h"
#include "globals.h"
#include "resource.h"
#include "util.h"
#include "util2.h"
#include "sdsutils.h"
#ifdef TESTCERT
#define TESTCERTVALUE 0xA0
#endif
const char c_gszMSTrustRegKey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\WinTrust\\Trust Providers\\Software Publishing\\Trust Database\\0";
const char c_gszMSTrust[] = "bhhphijojgfcdocagmhjgjbhmieinfap jpjmcfmhckkdfknkfemjikfiodeelkbd";
const char c_gszMSTrust2[] = "bhhphijojgfcdocagmhjgjbhmieinfap immbkmbpjfdkajbkncahcedfmndgehba";
const char c_gszMSTrust3[] = "bhhphijojgfcdocagmhjgjbhmieinfap doamnolbnlpmdlpnkcnpckgfimpaaicl"; // New MS Europe
const char c_gszMSTrust4[] = "bhhphijojgfcdocagmhjgjbhmieinfap hbgflemajngobcablgnalaidgojggghj";
const char c_gszMSTrust5[] = "bhhphijojgfcdocagmhjgjbhmieinfap kefdggbdmbmgbogjdcnmkoodcknmmghc"; // New MS Europe effective from 4/16/99
const char c_gszMSTrust6[] = "bhhphijojgfcdocagmhjgjbhmieinfap debgjcefniaahdamnhbggedppfiianff"; // new MS effective from 4/16/99
const char c_gszMSTrust7[] = "bhhphijojgfcdocagmhjgjbhmieinfap fmgfeljfbejhfcbbgnokplkipiiopchf"; // new MS effective from 4/16/2000
const char c_gszMSTrust8[] = "bhhphijojgfcdocagmhjgjbhmieinfap jcphiillknjhbelgeadhnbgpjajjkhdh"; // New MS Europe effective from 4/16/2000
const char c_gszMSTrust9[] = "klhfnkecpinogjmfaoamiabmhafnjldh adaaaaaaaaaahihcddgb"; // New MS effective 12/22/2000
const char c_gszMSTrust10[] = "klhfnkecpinogjmfaoamiabmhafnjldh alaaaaaaaaaainckaggb"; // New MS effective 3/29/2001
const char c_gszMSTrust11[] = "klhfnkecpinogjmfaoamiabmhafnjldh aeaaaaaaaaaafpnldegb"; // New MS Europe effective from 12/22/2000
const char c_gszMSTrustValue[] = "Microsoft Corporation";
const char c_gszMSTrustValue3[] = "Microsoft Corporation (Europe)";
#ifdef TESTCERT
const char c_gszTrustStateRegKey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\WinTrust\\Trust Providers\\Software Publishing";
const char c_gszState[] = "State";
#endif
typedef struct _TRUSTEDPROVIDER
{
DWORD dwFlag;
LPCSTR pValue; // Value part in the registeru
LPCSTR pData; // Data part in the registry
} TRUSTEDPROVIDER;
TRUSTEDPROVIDER pTrustedProvider[] = { {MSTRUSTKEY1, c_gszMSTrust, c_gszMSTrustValue}, // MS US
{MSTRUSTKEY2, c_gszMSTrust2, c_gszMSTrustValue}, // MS US
{MSTRUSTKEY3, c_gszMSTrust3, c_gszMSTrustValue3}, // MS Europa
{MSTRUSTKEY4, c_gszMSTrust4, c_gszMSTrustValue}, // MS US
{MSTRUSTKEY5, c_gszMSTrust5, c_gszMSTrustValue3}, // New MS Europe effective from 4/16/99
{MSTRUSTKEY6, c_gszMSTrust6, c_gszMSTrustValue}, // new MS effective from 4/16/99
{MSTRUSTKEY7, c_gszMSTrust7, c_gszMSTrustValue}, // new MS effective from 4/16/2000
{MSTRUSTKEY8, c_gszMSTrust8, c_gszMSTrustValue3}, // New MS Europe effective from 4/16/2000
{MSTRUSTKEY9, c_gszMSTrust9, c_gszMSTrustValue3}, // New MS Europe effective from 4/16/2000
{MSTRUSTKEY10, c_gszMSTrust10, c_gszMSTrustValue3}, // New MS Europe effective from 4/16/2000
{MSTRUSTKEY11, c_gszMSTrust11, c_gszMSTrustValue3}, // New MS Europe effective from 12/22/2000
{0,NULL, NULL} }; // Terminates the array.
HFONT g_hFont = NULL;
#define ACTIVESETUP_KEY "Software\\Microsoft\\Active Setup"
#define TRUSTKEYREG "AllowMSTrustKey"
// NT reboot
//
BOOL MyNTReboot()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// get a token from this process
if ( !OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
{
return FALSE;
}
// get the LUID for the shutdown privilege
LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid );
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//get the shutdown privilege for this proces
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
{
return FALSE;
}
// shutdown the system and force all applications to close
if (!ExitWindowsEx( EWX_REBOOT, 0 ) )
{
return FALSE;
}
return TRUE;
}
//=--------------------------------------------------------------------------=
// Function name here
//=--------------------------------------------------------------------------=
// Function description
//
// Parameters:
//
// Returns:
//
// Notes:
//
HRESULT LaunchProcess(LPCSTR pszCmd, HANDLE *phProc, LPCSTR pszDir, UINT uShow)
{
STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
HRESULT hr = S_OK;
BOOL fRet;
if(phProc)
*phProc = NULL;
// Create process on pszCmd
ZeroMemory(&startInfo, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
startInfo.dwFlags |= STARTF_USESHOWWINDOW;
startInfo.wShowWindow = (WORD)uShow;
fRet = CreateProcess(NULL, (LPSTR) pszCmd, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, pszDir, &startInfo, &processInfo);
if(!fRet)
return E_FAIL;
if(phProc)
*phProc = processInfo.hProcess;
else
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return S_OK;
}
#define SOFTBOOT_CMDLINE "softboot.exe /s:,60"
// Display a dialog asking the user to restart Windows, with a button that
// will do it for them if possible.
//
BOOL MyRestartDialog(HWND hParent, BOOL bShowPrompt)
{
char szBuf[256];
char szTitle[256];
UINT id = IDYES;
if(bShowPrompt)
{
LoadSz(IDS_TITLE, szTitle, sizeof(szTitle));
LoadSz(IDS_REBOOT, szBuf, sizeof(szBuf));
id = MessageBox(hParent, szBuf, szTitle, MB_ICONQUESTION | MB_YESNO | MB_TASKMODAL | MB_SETFOREGROUND);
}
if ( id == IDYES )
{
// path to softboot plus a little slop for the command line
char szBuf[MAX_PATH + 10];
szBuf[0] = 0;
GetSystemDirectory(szBuf, sizeof(szBuf));
AddPath(szBuf, SOFTBOOT_CMDLINE);
if(FAILED(LaunchProcess(szBuf, NULL, NULL, SW_SHOWNORMAL)))
{
if(g_fSysWin95)
{
ExitWindowsEx( EWX_REBOOT , 0 );
}
else
{
MyNTReboot();
}
}
}
return (id == IDYES);
}
int ErrMsgBox(LPSTR pszText, LPCSTR pszTitle, UINT mbFlags)
{
HWND hwndActive;
int id;
hwndActive = GetActiveWindow();
id = MessageBox(hwndActive, pszText, pszTitle, mbFlags | MB_ICONERROR | MB_TASKMODAL);
return id;
}
int LoadSz(UINT id, LPSTR pszBuf, UINT cMaxSize)
{
if(cMaxSize == 0)
return 0;
pszBuf[0] = 0;
return LoadString(g_hInstance, id, pszBuf, cMaxSize);
}
void WriteMSTrustKey(BOOL bSet, DWORD dwSetMSTrustKey, BOOL bForceMSTrust /*= FALSE*/)
{
char szTmp[512];
HKEY hKey;
int i = 0;
static BOOL fAllowMSTrustKey = 42;
if(fAllowMSTrustKey == 42)
{
fAllowMSTrustKey = FALSE;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, ACTIVESETUP_KEY,0, KEY_READ | KEY_WRITE, &hKey) == ERROR_SUCCESS)
{
DWORD dwSize = sizeof(DWORD);
DWORD dwValue = 1;
if(RegQueryValueEx(hKey, TRUSTKEYREG, NULL, NULL, (LPBYTE) &dwValue, &dwSize) == ERROR_SUCCESS)
{
fAllowMSTrustKey = (dwValue ? TRUE : FALSE);
}
RegCloseKey(hKey);
}
}
if(!fAllowMSTrustKey && !bForceMSTrust && bSet)
return;
lstrcpy(szTmp, ".Default\\");
lstrcat(szTmp, c_gszMSTrustRegKey); // build the key for HKEY_USERS
if (RegCreateKeyEx(HKEY_USERS, szTmp, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
{
if (bSet)
{
while (pTrustedProvider[i].dwFlag > 0)
{
if (dwSetMSTrustKey & pTrustedProvider[i].dwFlag)
RegSetValueEx( hKey, pTrustedProvider[i].pValue, 0, REG_SZ, (LPBYTE)pTrustedProvider[i].pData, lstrlen(pTrustedProvider[i].pData) + 1 );
i++;
}
}
else
{
while (pTrustedProvider[i].dwFlag > 0)
{
if (dwSetMSTrustKey & pTrustedProvider[i].dwFlag)
RegDeleteValue(hKey, pTrustedProvider[i].pValue);
i++;
}
}
RegCloseKey(hKey);
}
i = 0;
if (RegCreateKeyEx(HKEY_CURRENT_USER, c_gszMSTrustRegKey, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
{
if (bSet)
{
while (pTrustedProvider[i].dwFlag > 0)
{
if (dwSetMSTrustKey & pTrustedProvider[i].dwFlag)
{
RegSetValueEx( hKey, pTrustedProvider[i].pValue, 0, REG_SZ, (LPBYTE)pTrustedProvider[i].pData, lstrlen(pTrustedProvider[i].pData) + 1 );
}
i++;
}
}
else
{
while (pTrustedProvider[i].dwFlag > 0)
{
if (dwSetMSTrustKey & pTrustedProvider[i].dwFlag)
RegDeleteValue(hKey, pTrustedProvider[i].pValue);
i++;
}
}
RegCloseKey(hKey);
}
}
DWORD MsTrustKeyCheck()
{
DWORD dwTmp;
DWORD dwValue;
HKEY hKey;
DWORD dwMSTrustKeyToSet = 0;
int i = 0;
// Check MS Vendor trust key and set
if (RegOpenKeyEx(HKEY_CURRENT_USER, c_gszMSTrustRegKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
while (pTrustedProvider[i].dwFlag > 0)
{
if (RegQueryValueEx( hKey, pTrustedProvider[i].pValue, 0, NULL, NULL, &dwTmp ) != ERROR_SUCCESS)
dwMSTrustKeyToSet |= pTrustedProvider[i].dwFlag;
i++;
}
RegCloseKey(hKey);
}
else
dwMSTrustKeyToSet = MSTRUST_ALL;
return dwMSTrustKeyToSet;
}
BOOL KeepTransparent(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lres)
{
*lres = 0;
HWND hwndParent;
hwndParent = GetParent(hwnd);
if (hwndParent)
{
POINT pt = {0,0};
MapWindowPoints(hwnd, hwndParent, &pt, 1);
OffsetWindowOrgEx((HDC)wParam, pt.x, pt.y, &pt);
*lres = SendMessage(hwndParent, msg, wParam, lParam);
SetWindowOrgEx((HDC)wParam, pt.x, pt.y, NULL);
if (*lres)
return TRUE; // we handled it!
}
return FALSE;
}
#ifdef TESTCERT
void UpdateTrustState()
{
HKEY hKey;
DWORD dwState;
DWORD dwType;
DWORD dwSize = sizeof(dwState);
if (RegCreateKeyEx(HKEY_CURRENT_USER, c_gszTrustStateRegKey, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, c_gszState, 0, &dwType, (LPBYTE)&dwState, &dwSize) == ERROR_SUCCESS)
{
dwState |= TESTCERTVALUE;
}
else
dwState = TESTCERTVALUE;
RegSetValueEx( hKey, c_gszState, 0, REG_DWORD, (LPBYTE)&dwState, sizeof(dwState));
RegCloseKey(hKey);
}
}
void ResetTestrootCertInTrustState()
{
HKEY hKey;
DWORD dwState;
DWORD dwType;
DWORD dwSize = sizeof(dwState);
if (RegOpenKeyEx(HKEY_CURRENT_USER, c_gszTrustStateRegKey, 0,
KEY_READ | KEY_WRITE, &hKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, c_gszState, 0, &dwType, (LPBYTE)&dwState, &dwSize) == ERROR_SUCCESS)
{
// Clear the bits for trusting test root certs
dwState &= (DWORD)~TESTCERTVALUE;
RegSetValueEx( hKey, c_gszState, 0, REG_DWORD, (LPBYTE)&dwState, sizeof(dwState));
}
RegCloseKey(hKey);
}
}
#endif
void WriteActiveSetupValue(BOOL bSet)
// If bSet is TRUE, add a reg value so that if IE4 base is installed, it would think that it is
// being run from Active Setup. This would prevent softboot from being kicked off by IE4 base.
// If bSet is FALSE, delete the reg value.
{
static const char c_szIE4Options[] = "Software\\Microsoft\\IE Setup\\Options";
static const char c_szActiveSetup[] = "ActiveSetup";
HKEY hk;
LONG lErr;
lErr = bSet ?
RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szIE4Options, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hk, NULL) :
RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szIE4Options, 0, KEY_WRITE, &hk);
if (lErr == ERROR_SUCCESS)
{
if (bSet)
{
DWORD dwData = 1;
RegSetValueEx(hk, c_szActiveSetup, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData));
}
else
RegDeleteValue(hk, c_szActiveSetup);
RegCloseKey(hk);
}
}
DWORD WaitForEvent(HANDLE hEvent, HWND hwnd)
{
BOOL fQuit = FALSE;
BOOL fDone = FALSE;
DWORD dwRet;
while(!fQuit && !fDone)
{
dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE,
INFINITE, QS_ALLINPUT);
// Give abort the highest priority
if(dwRet == WAIT_OBJECT_0)
{
fDone = TRUE;
}
else
{
MSG msg;
// read all of the messages in this next loop
// removing each message as we read it
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(!hwnd || !IsDialogMessage(hwnd, &msg))
{
// if it's a quit message we're out of here
if (msg.message == WM_QUIT)
fQuit = TRUE;
else
{
// otherwise dispatch it
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} // end of PeekMessage while loop
}
}
}
return (fQuit ? EVENTWAIT_QUIT : EVENTWAIT_DONE);
}
#define SHFREE_ORDINAL 195 // Required for BrowseForDir
const char achSHBrowseForFolder[] = "SHBrowseForFolder";
const char achSHGetPathFromIDList[] = "SHGetPathFromIDList";
const char achShell32Lib[] = "Shell32.dll";
//***************************************************************************
//***************************************************************************
// Required for BrowseForDir()
int CALLBACK BrowseCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch(uMsg)
{
case BFFM_INITIALIZED:
// lpData is the path string
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
break;
}
return 0;
}
typedef WINSHELLAPI LPITEMIDLIST (WINAPI *SHBROWSEFORFOLDER)(LPBROWSEINFO);
typedef WINSHELLAPI void (WINAPI *SHFREE)(LPVOID);
typedef WINSHELLAPI BOOL (WINAPI *SHGETPATHFROMIDLIST)( LPCITEMIDLIST, LPTSTR );
//***************************************************************************
//* *
//* NAME: BrowseForDir *
//* *
//* SYNOPSIS: Let user browse for a directory on their system or network. *
//* *
//* REQUIRES: hwndParent: *
//* *
//* RETURNS: BOOL: *
//* *
//* NOTES: It would be really cool to set the status line of the *
//* browse window to display "Yes, there's enough space", or *
//* "no there is not". *
//* *
//***************************************************************************
BOOL BrowseForDir( HWND hwndParent, LPSTR pszFolder, LPSTR pszTitle)
{
BROWSEINFO bi;
LPITEMIDLIST pidl;
HINSTANCE hShell32Lib;
SHFREE pfSHFree;
SHGETPATHFROMIDLIST pfSHGetPathFromIDList;
SHBROWSEFORFOLDER pfSHBrowseForFolder;
BOOL fChange = FALSE;
// Load the Shell 32 Library to get the SHBrowseForFolder() features
if ( ( hShell32Lib = LoadLibrary( achShell32Lib ) ) != NULL )
{
if ( ( !( pfSHBrowseForFolder = (SHBROWSEFORFOLDER)
GetProcAddress( hShell32Lib, achSHBrowseForFolder ) ) )
|| ( ! ( pfSHFree = (SHFREE) GetProcAddress( hShell32Lib,
MAKEINTRESOURCE(SHFREE_ORDINAL) ) ) )
|| ( ! ( pfSHGetPathFromIDList = (SHGETPATHFROMIDLIST)
GetProcAddress( hShell32Lib, achSHGetPathFromIDList ) ) ) )
{
FreeLibrary( hShell32Lib );
return FALSE;
}
}
else
{
return FALSE;
}
bi.hwndOwner = hwndParent;
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = pszTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallback;
bi.lParam = (LPARAM)pszFolder;
pidl = pfSHBrowseForFolder( &bi );
if ( pidl )
{
pfSHGetPathFromIDList( pidl, pszFolder );
pfSHFree( pidl );
fChange = TRUE;
}
FreeLibrary( hShell32Lib );
return fChange;
}
BOOL IsSiteInRegion(IDownloadSite *pISite, LPSTR pszRegion)
{
BOOL bInRegion = FALSE;
DOWNLOADSITE *psite;
if(SUCCEEDED(pISite->GetData(&psite)))
{
if(lstrcmpi(psite->pszRegion, pszRegion) == 0)
bInRegion = TRUE;
}
return bInRegion;
}
void SetControlFont()
{
LOGFONT lFont;
if (GetSystemMetrics(SM_DBCSENABLED) &&
(GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof (lFont), &lFont) > 0))
{
g_hFont = CreateFontIndirect((LPLOGFONT)&lFont);
}
}
void SetFontForControl(HWND hwnd, UINT uiID)
{
if (g_hFont)
{
SendDlgItemMessage(hwnd, uiID, WM_SETFONT, (WPARAM)g_hFont ,0L);
}
}