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.
 
 
 
 
 
 

304 lines
8.5 KiB

#include <shlobj.h>
#include <windowsx.h>
#include <shellapi.h>
#include <shlwapi.h>
#include <resource.h>
#include <regstr.h>
#include <shpriv.h>
#include <ccstock.h>
#include <strsafe.h>
// device bit entries
#ifndef ARRAYSIZE
#define ARRAYSIZE(x) (sizeof(x) / sizeof((x)[0]))
#endif
#define NUMPAGES 1
HFONT g_hTitleFont = NULL;
HINSTANCE g_hInstance = NULL;
////////////////////////////////////////////////////////
HRESULT _LoadPath(BOOL fFlash, LPTSTR pszBuffer, UINT cchBuffer)
{
HRESULT hr;
if (!GetWindowsDirectory(pszBuffer, cchBuffer))
{
hr = E_FAIL;
}
else
{
TCHAR szTemp[MAX_PATH];
if (!LoadString(g_hInstance, fFlash ? IDS_DIR_FLASH : IDS_DIR_HTML, szTemp, ARRAYSIZE(szTemp)))
{
hr = E_FAIL;
}
else
{
if (!PathAppend(pszBuffer, szTemp))
{
hr = E_FAIL;
}
else
{
if (GetSystemDefaultUILanguage() == GetUserDefaultUILanguage()) // not on MUI
{
hr = S_OK;
}
else
{
TCHAR szMUITemplate[16];
LANGID langid = GetUserDefaultUILanguage();
hr = StringCchPrintf(szMUITemplate, ARRAYSIZE(szMUITemplate), TEXT("mui\\%04lx"), langid);
if (SUCCEEDED(hr))
{
if (!PathAppend(pszBuffer, szMUITemplate))
{
hr = E_FAIL;
}
else
{
hr = S_OK;
}
}
}
}
}
}
return hr;
}
HRESULT _DeleteTourBalloon()
{
IShellReminderManager* psrm;
HRESULT hr = CoCreateInstance(CLSID_PostBootReminder, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellReminderManager, &psrm));
if (SUCCEEDED(hr))
{
hr = psrm->Delete(L"Microsoft.OfferTour");
psrm->Release();
}
return hr;
}
HRESULT _ExecuteTour(BOOL fFlash)
{
TCHAR szDir[MAX_PATH];
HRESULT hr = _LoadPath(fFlash, szDir, ARRAYSIZE(szDir));
if (SUCCEEDED(hr))
{
TCHAR szTarget[MAX_PATH];
if (!LoadString(g_hInstance, fFlash ? IDS_EXE_FLASH : IDS_EXE_HTML, szTarget, ARRAYSIZE(szTarget)))
{
hr = E_FAIL;
}
else
{
if (32 < (INT_PTR)ShellExecute(NULL, NULL, szTarget, NULL, szDir, SW_SHOWNORMAL))
{
hr = S_OK;
}
else
{
hr = E_FAIL;
}
}
}
return hr;
}
HRESULT _HaveFlashTour()
{
HRESULT hr;
TCHAR szHaveLocalizedTour[6];
if (!LoadString(g_hInstance, IDS_FLASH_LOCALIZED, szHaveLocalizedTour, ARRAYSIZE(szHaveLocalizedTour)))
{
hr = E_FAIL;
}
else
{
// if the string in the .rc is not "TRUE", then we know we don't have a flash tour
if (0 != StrCmp(szHaveLocalizedTour, TEXT("TRUE")))
{
hr = S_FALSE;
}
else
{
// if the string in the .rc is "TRUE", then we still check if the tour.exe is there
TCHAR szPath[MAX_PATH];
hr = _LoadPath(TRUE, szPath, ARRAYSIZE(szPath));
if (SUCCEEDED(hr))
{
TCHAR szTarget[MAX_PATH];
if (!LoadString(g_hInstance, IDS_EXE_FLASH, szTarget, ARRAYSIZE(szTarget)))
{
hr = E_FAIL;
}
else
{
if (!PathAppend(szPath, szTarget))
{
hr = E_FAIL;
}
else
{
if (PathFileExists(szPath))
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
}
}
}
}
}
return hr;
}
///////////////////////////////////////////////////////////
INT_PTR _IntroDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
INT_PTR ipRet = FALSE;
switch (wMsg)
{
case WM_INITDIALOG:
{
SetWindowFont(GetDlgItem(hDlg, IDC_TEXT_WELCOME), g_hTitleFont, TRUE);
}
break;
case WM_NOTIFY :
{
LPNMHDR lpnm = (LPNMHDR) lParam;
switch (lpnm->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
SendMessage(GetDlgItem(hDlg, IDC_RADIO_FLASH), BM_CLICK, 0, 0);
break;
case PSN_WIZNEXT:
if (BST_CHECKED == SendMessage(GetDlgItem(hDlg, IDC_RADIO_FLASH), BM_GETCHECK, 0, 0))
{
_ExecuteTour(TRUE);
}
else
{
_ExecuteTour(FALSE);
}
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
break;
}
break;
}
}
return ipRet;
}
///////////////////////////////////////////////////////////
HRESULT Run()
{
// Disable the balloon tip
DWORD dwCount = 0;
SHRegSetUSValue(REGSTR_PATH_SETUP TEXT("\\Applets\\Tour"), TEXT("RunCount"), REG_DWORD, &dwCount, sizeof(DWORD), SHREGSET_FORCE_HKCU);
_DeleteTourBalloon();
// Before we do anything, check to see if we have the choice of a FLASH tour. If we don't,
// then we don't need to launch any wizard.
if (S_OK == _HaveFlashTour())
{
// Init common controls
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_USEREX_CLASSES;
InitCommonControlsEx(&icex);
//
//Create the Wizard page
//
PROPSHEETPAGE psp = {0}; //defines the property sheet page
HPROPSHEETPAGE rghpsp[NUMPAGES]; // an array to hold the page's HPROPSHEETPAGE handles
psp.dwSize = sizeof(psp);
psp.hInstance = g_hInstance;
psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER;
psp.pszHeaderTitle = NULL;
psp.pszHeaderSubTitle = NULL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_INTRO);
psp.pfnDlgProc = _IntroDlgProc;
rghpsp[0] = CreatePropertySheetPage(&psp);
// create the font
NONCLIENTMETRICS ncm = {0};
ncm.cbSize = sizeof(ncm);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
LOGFONT TitleLogFont = ncm.lfMessageFont;
TitleLogFont.lfWeight = FW_BOLD;
LoadString(g_hInstance, IDS_TITLELOGFONT, TitleLogFont.lfFaceName, LF_FACESIZE);
HDC hdc = GetDC(NULL); //gets the screen DC
if (hdc)
{
TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * 12 / 72;
g_hTitleFont = CreateFontIndirect(&TitleLogFont);
ReleaseDC(NULL, hdc);
}
//Create the property sheet
PROPSHEETHEADER _psh;
_psh.hInstance = g_hInstance;
_psh.hwndParent = NULL;
_psh.phpage = rghpsp;
_psh.dwSize = sizeof(_psh);
_psh.dwFlags = PSH_WIZARD97|PSH_WATERMARK|PSH_USEICONID;
_psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
_psh.pszIcon = MAKEINTRESOURCE(IDI_WIZ_ICON);
_psh.nStartPage = 0;
_psh.nPages = NUMPAGES;
// run property sheet
PropertySheet(&_psh);
// clean up font
if (g_hTitleFont)
{
DeleteObject(g_hTitleFont);
}
}
else
{
_ExecuteTour(FALSE);
}
return S_OK;
}
///////////////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, INT nCmdShow)
{
OleInitialize(NULL);
g_hInstance = hInstance;
Run();
OleUninitialize();
return 0;
}