/*
- * ReactOS applications
- * Copyright (C) 2004 ReactOS Team
+ * ReactOS VMware(r) driver installation utility
+ * Copyright (C) 2004 ReactOS Team
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * VMware is a registered trademark of VMware, Inc.
*/
-/* $Id: vmwinst.c,v 1.5 2004/06/01 19:08:53 sedwards Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS VMware(r) driver installation utility
* FILE: subsys/system/vmwinst/vmwinst.c
* PROGRAMMERS: Thomas Weidenmueller (w3seek@users.sourceforge.net)
+ * Klemens Friedl (frik85@hotmail.com)
*/
#include <windows.h>
#include <commctrl.h>
static WCHAR *SrcPath = PathToVideoDrivers45;
+static HANDLE hInstallationThread = NULL;
+static HWND hInstallationNotifyWnd = NULL;
+static LONG AbortInstall = 0;
+#define WM_INSTABORT (WM_USER + 2)
+#define WM_INSTCOMPLETE (WM_USER + 3)
+#define WM_INSTSTATUSUPDATE (WM_USER + 4)
+
/* Helper functions */
LONG WINAPI ExceptionHandler(LPEXCEPTION_POINTERS ExceptionInfo)
return TRUE;
}
+static VOID
+CenterWindow(HWND hWnd)
+{
+ HWND hWndParent;
+ RECT rcParent;
+ RECT rcWindow;
+
+ hWndParent = GetParent(hWnd);
+ if (hWndParent == NULL)
+ hWndParent = GetDesktopWindow();
+
+ GetWindowRect(hWndParent, &rcParent);
+ GetWindowRect(hWnd, &rcWindow);
+
+ SetWindowPos(hWnd,
+ HWND_TOP,
+ ((rcParent.right - rcParent.left) - (rcWindow.right - rcWindow.left)) / 2,
+ ((rcParent.bottom - rcParent.top) - (rcWindow.bottom - rcWindow.top)) / 2,
+ 0,
+ 0,
+ SWP_NOSIZE);
+}
+
+
/* Copy file */
BOOL
InstallFile(WCHAR *Destination, WCHAR *File)
return (Value == 1);
}
+
+
BOOL
SaveResolutionSettings(DWORD ResX, DWORD ResY, DWORD ColDepth)
{
/* GUI */
void
-InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
+InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DWORD Flags, DLGPROC DlgProc)
{
ZeroMemory(psp, sizeof(PROPSHEETPAGE));
psp->dwSize = sizeof(PROPSHEETPAGE);
- psp->dwFlags = PSP_DEFAULT;
+ psp->dwFlags = PSP_DEFAULT | Flags;
psp->hInstance = hAppInstance;
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
psp->pfnDlgProc = DlgProc;
}
/* Property page dialog callback */
-int CALLBACK
+INT_PTR CALLBACK
PageWelcomeProc(
HWND hwndDlg,
UINT uMsg,
{
case WM_NOTIFY:
{
+ HWND hwndControl;
+
+ /* Center the wizard window */
+ hwndControl = GetParent(hwndDlg);
+ CenterWindow (hwndControl);
+
LPNMHDR pnmh = (LPNMHDR)lParam;
switch(pnmh->code)
{
{
if(!EnableVmwareDriver(FALSE, FALSE, TRUE))
{
+
WCHAR Msg[1024];
LoadString(hAppInstance, IDS_FAILEDTOACTIVATEDRIVER, Msg, sizeof(Msg) / sizeof(WCHAR));
MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
}
/* Property page dialog callback */
-int CALLBACK
+INT_PTR CALLBACK
PageInsertDiscProc(
HWND hwndDlg,
UINT uMsg,
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
break;
case PSN_WIZNEXT:
- PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
- ProcessMessages();
- if(!IsVMwareCDInDrive(&CDDrive))
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSTALLING_VMWARE_TOOLS);
+ break;
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+VOID
+InstTerminateInstaller(BOOL Wait)
+{
+ if(hInstallationThread != NULL)
+ {
+ if(Wait)
+ {
+ InterlockedExchange((LONG*)&AbortInstall, 2);
+ WaitForSingleObject(hInstallationThread, INFINITE);
+ }
+ else
+ {
+ InterlockedExchange((LONG*)&AbortInstall, 1);
+ }
+ }
+}
+
+DWORD STDCALL
+InstInstallationThread(LPVOID lpParameter)
+{
+ HANDLE hThread;
+ BOOL DriveAvailable;
+ int DrivesTested = 0;
+
+ if(AbortInstall != 0) goto done;
+ PostMessage(hInstallationNotifyWnd, WM_INSTSTATUSUPDATE, IDS_SEARCHINGFORCDROM, 0);
+
+ while(AbortInstall == 0)
+ {
+ Sleep(500);
+ DriveAvailable = IsVMwareCDInDrive(&CDDrive);
+ if(DriveAvailable)
+ break;
+ if(DrivesTested++ > 20)
+ {
+ PostMessage(hInstallationNotifyWnd, WM_INSTABORT, IDS_FAILEDTOLOCATEDRIVERS, 0);
+ goto cleanup;
+ }
+ }
+
+ if(AbortInstall != 0) goto done;
+ PostMessage(hInstallationNotifyWnd, WM_INSTSTATUSUPDATE, IDS_COPYINGFILES, 0);
+
+ if(AbortInstall != 0) goto done;
+ if(!InstallFile(DestinationPath, vmx_fb))
+ {
+ PostMessage(hInstallationNotifyWnd, WM_INSTABORT, IDS_FAILEDTOCOPYFILES, 0);
+ goto cleanup;
+ }
+
+ Sleep(250);
+
+ if(AbortInstall != 0) goto done;
+ if(!InstallFile(DestinationPath, vmx_mode))
+ {
+ PostMessage(hInstallationNotifyWnd, WM_INSTABORT, IDS_FAILEDTOCOPYFILES, 0);
+ goto cleanup;
+ }
+
+ Sleep(250);
+
+ if(AbortInstall != 0) goto done;
+ if(!InstallFile(DestinationDriversPath, vmx_svga))
+ {
+ PostMessage(hInstallationNotifyWnd, WM_INSTABORT, IDS_FAILEDTOCOPYFILES, 0);
+ goto cleanup;
+ }
+
+ Sleep(250);
+
+ if(AbortInstall != 0) goto done;
+ PostMessage(hInstallationNotifyWnd, WM_INSTSTATUSUPDATE, IDS_ENABLINGDRIVER, 0);
+ if(!EnableVmwareDriver(FALSE, FALSE, TRUE))
+ {
+ PostMessage(hInstallationNotifyWnd, WM_INSTABORT, IDS_FAILEDTOACTIVATEDRIVER, 0);
+ goto cleanup;
+ }
+
+ Sleep(500);
+
+done:
+ switch(AbortInstall)
+ {
+ case 0:
+ SendMessage(hInstallationNotifyWnd, WM_INSTCOMPLETE, 0, 0);
+ break;
+ case 1:
+ SendMessage(hInstallationNotifyWnd, WM_INSTABORT, 0, 0);
+ break;
+ }
+
+cleanup:
+ hThread = (HANDLE)InterlockedExchange((LONG*)&hInstallationThread, 0);
+ if(hThread != NULL)
+ {
+ CloseHandle(hThread);
+ }
+ return 0;
+}
+
+BOOL
+InstStartInstallationThread(HWND hwndNotify)
+{
+ if(hInstallationThread == NULL)
+ {
+ DWORD ThreadId;
+ hInstallationNotifyWnd = hwndNotify;
+ AbortInstall = 0;
+ hInstallationThread = CreateThread(NULL,
+ 0,
+ InstInstallationThread,
+ NULL,
+ CREATE_SUSPENDED,
+ &ThreadId);
+ if(hInstallationThread == NULL)
+ {
+ return FALSE;
+ }
+
+ ResumeThread(hInstallationThread);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+PageInstallingProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch(uMsg)
+ {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+ switch(pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ SetDlgItemText(hwndDlg, IDC_INSTALLINGSTATUS, NULL);
+ SendDlgItemMessage(hwndDlg, IDC_INSTALLINGPROGRESS, PBM_SETMARQUEE, TRUE, 50);
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
+ InstStartInstallationThread(hwndDlg);
+ break;
+ case PSN_RESET:
+ InstTerminateInstaller(TRUE);
+ break;
+ case PSN_WIZBACK:
+ if(hInstallationThread != NULL)
{
- WCHAR Msg[1024];
- LoadString(hAppInstance, IDS_FAILEDTOLOCATEDRIVERS, Msg, sizeof(Msg) / sizeof(WCHAR));
- MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
- PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSERT_VMWARE_TOOLS);
- return TRUE;
+ PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
+ InstTerminateInstaller(FALSE);
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return -1;
}
-
- if(!InstallFile(DestinationPath, vmx_fb) ||
- !InstallFile(DestinationPath, vmx_mode) ||
- !InstallFile(DestinationDriversPath, vmx_svga))
+ else
{
- WCHAR Msg[1024];
- LoadString(hAppInstance, IDS_FAILEDTOCOPYFILES, Msg, sizeof(Msg) / sizeof(WCHAR));
- MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
- PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+ SendDlgItemMessage(hwndDlg, IDC_INSTALLINGPROGRESS, PBM_SETMARQUEE, FALSE, 0);
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSERT_VMWARE_TOOLS);
- return TRUE;
}
-
- if(!EnableVmwareDriver(FALSE, FALSE, TRUE))
- {
- WCHAR Msg[1024];
- LoadString(hAppInstance, IDS_FAILEDTOACTIVATEDRIVER, Msg, sizeof(Msg) / sizeof(WCHAR));
- MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSTALLATION_FAILED);
- return TRUE;
- }
-
- PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
break;
}
break;
}
+ case WM_INSTABORT:
+ /* go back in case we aborted the installation thread */
+ SendDlgItemMessage(hwndDlg, IDC_INSTALLINGPROGRESS, PBM_SETMARQUEE, FALSE, 0);
+ PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSERT_VMWARE_TOOLS);
+ if(wParam != 0)
+ {
+ WCHAR Msg[1024];
+ LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
+ MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
+ }
+ break;
+ case WM_INSTCOMPLETE:
+ SendDlgItemMessage(hwndDlg, IDC_INSTALLINGPROGRESS, PBM_SETMARQUEE, FALSE, 0);
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+ PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_CONFIG);
+ break;
+ case WM_INSTSTATUSUPDATE:
+ {
+ WCHAR Msg[1024];
+ LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
+ SetDlgItemText(hwndDlg, IDC_INSTALLINGSTATUS, Msg);
+ break;
+ }
}
return FALSE;
}
/* Property page dialog callback */
-BOOL CALLBACK
+INT_PTR CALLBACK
PageInstallFailedProc(
HWND hwndDlg,
UINT uMsg,
} MAPCTLRES;
/* Property page dialog callback */
-BOOL CALLBACK
+INT_PTR CALLBACK
PageConfigProc(
HWND hwndDlg,
UINT uMsg,
}
case WM_NOTIFY:
{
+ HWND hwndControl;
+
+ /* Center the wizard window */
+ hwndControl = GetParent(hwndDlg);
+ CenterWindow (hwndControl);
+
LPNMHDR pnmh = (LPNMHDR)lParam;
switch(pnmh->code)
{
}
/* Property page dialog callback */
-BOOL CALLBACK
+INT_PTR CALLBACK
PageChooseActionProc(
HWND hwndDlg,
UINT uMsg,
}
/* Property page dialog callback */
-BOOL CALLBACK
+INT_PTR CALLBACK
PageSelectDriverProc(
HWND hwndDlg,
UINT uMsg,
switch(uMsg)
{
case WM_INITDIALOG:
- SendDlgItemMessage(hwndDlg, IDC_VGA, BM_SETCHECK, BST_CHECKED, 0);
+ SendDlgItemMessage(hwndDlg, IDC_VBE, BM_SETCHECK, BST_CHECKED, 0);
break;
case WM_NOTIFY:
{
MessageBox(Owner, Msg, NULL, MB_ICONINFORMATION);
}
-BOOL CALLBACK
+INT_PTR CALLBACK
PageDoUninstallProc(
HWND hwndDlg,
UINT uMsg,
static LONG
CreateWizard(VOID)
{
- PROPSHEETPAGE psp[7];
PROPSHEETHEADER psh;
+ HPROPSHEETPAGE ahpsp[8];
+ PROPSHEETPAGE psp;
WCHAR Caption[1024];
LoadString(hAppInstance, IDS_WIZARD_NAME, Caption, sizeof(Caption) / sizeof(TCHAR));
-
- ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+
+ /* Create the Welcome page */
+ ZeroMemory (&psp, sizeof(PROPSHEETPAGE));
+ psp.dwSize = sizeof(PROPSHEETPAGE);
+ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
+ psp.hInstance = hAppInstance;
+ psp.pfnDlgProc = PageWelcomeProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_WELCOMEPAGE);
+ ahpsp[0] = CreatePropertySheetPage(&psp);
+
+ /* Create the INSERT_VMWARE_TOOLS page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_INSERT_VMWARE_TOOLSTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_INSERT_VMWARE_TOOLSSUBTITLE);
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_INSERT_VMWARE_TOOLS);
+ psp.pfnDlgProc = PageInsertDiscProc;
+ ahpsp[1] = CreatePropertySheetPage(&psp);
+
+ /* Create the INSTALLING_VMWARE_TOOLS page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_INSTALLING_VMWARE_TOOLSTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_INSTALLING_VMWARE_TOOLSSUBTITLE);
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLING_VMWARE_TOOLS);
+ psp.pfnDlgProc = PageInstallingProc;
+ ahpsp[2] = CreatePropertySheetPage(&psp);
+
+ /* Create the CONFIG page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_CONFIGTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_CONFIGSUBTITLE);
+ psp.pfnDlgProc = PageConfigProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_CONFIG);
+ ahpsp[3] = CreatePropertySheetPage(&psp);
+
+ /* Create the INSTALLATION_FAILED page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_INSTALLATION_FAILEDTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_INSTALLATION_FAILEDSUBTITLE);
+ psp.pfnDlgProc = PageInstallFailedProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLATION_FAILED);
+ ahpsp[4] = CreatePropertySheetPage(&psp);
+
+ /* Create the CHOOSEACTION page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_CHOOSEACTIONTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_CHOOSEACTIONSUBTITLE);
+ psp.pfnDlgProc = PageChooseActionProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_CHOOSEACTION);
+ ahpsp[5] = CreatePropertySheetPage(&psp);
+
+ /* Create the SELECTDRIVER page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_SELECTDRIVERTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_SELECTDRIVERSUBTITLE);
+ psp.pfnDlgProc = PageSelectDriverProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_SELECTDRIVER);
+ ahpsp[6] = CreatePropertySheetPage(&psp);
+
+ /* Create the DOUNINSTALL page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pszHeaderTitle = MAKEINTRESOURCE(IDD_DOUNINSTALLTITLE);
+ psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDD_DOUNINSTALLSUBTITLE);
+ psp.pfnDlgProc = PageDoUninstallProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_DOUNINSTALL);
+ ahpsp[7] = CreatePropertySheetPage(&psp);
+
+ /* Create the property sheet */
psh.dwSize = sizeof(PROPSHEETHEADER);
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD;
- psh.hwndParent = NULL;
+ psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
psh.hInstance = hAppInstance;
- psh.hIcon = 0;
- psh.pszCaption = Caption;
+ psh.hwndParent = NULL;
psh.nPages = 7;
- psh.nStartPage = (StartVMwConfigWizard ? 4 : 0);
- psh.ppsp = psp;
-
- InitPropSheetPage(&psp[0], IDD_WELCOMEPAGE, PageWelcomeProc);
- InitPropSheetPage(&psp[1], IDD_INSERT_VMWARE_TOOLS, PageInsertDiscProc);
- InitPropSheetPage(&psp[2], IDD_CONFIG, PageConfigProc);
- InitPropSheetPage(&psp[3], IDD_INSTALLATION_FAILED, PageInstallFailedProc);
- InitPropSheetPage(&psp[4], IDD_CHOOSEACTION, PageChooseActionProc);
- InitPropSheetPage(&psp[5], IDD_SELECTDRIVER, PageSelectDriverProc);
- InitPropSheetPage(&psp[6], IDD_DOUNINSTALL, PageDoUninstallProc);
+ psh.nStartPage = (StartVMwConfigWizard ? 5 : 0);
+ psh.phpage = ahpsp;
+ psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
+ psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
+
+ /* Display the wizard */
+ PropertySheet(&psh);
+
return (LONG)(PropertySheet(&psh) != -1);
}
LPSTR lpszCmdLine,
int nCmdShow)
{
+
LPTOP_LEVEL_EXCEPTION_FILTER OldHandler;
int Version;
WCHAR *lc;
hAppInstance = hInstance;
-
+
/* Setup our exception "handler" ;-) */
OldHandler = SetUnhandledExceptionFilter(ExceptionHandler);
-
+
if(!DetectVMware(&Version))
{
ExitProcess(1);
return 1;
}
-
+
/* restore the exception handler */
SetUnhandledExceptionFilter(OldHandler);
/* Show the wizard */
CreateWizard();
-
+
return 2;
}