⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vmwinst.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
  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)
          {
            PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
            InstTerminateInstaller(FALSE);
            SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
            return -1;
          }
          else
          {
            SendDlgItemMessage(hwndDlg, IDC_INSTALLINGPROGRESS, PBM_SETMARQUEE, FALSE, 0);
            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSERT_VMWARE_TOOLS);
          }
          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 */
static INT_PTR CALLBACK
PageInstallFailedProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
  switch(uMsg)
  {
    case WM_NOTIFY:
    {
      LPNMHDR pnmh = (LPNMHDR)lParam;
      switch(pnmh->code)
      {
        case PSN_SETACTIVE:
          PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH);
          break;
      }
      break;
    }
  }
  return FALSE;
}

static void
FillComboBox(HWND Dlg, int idComboBox, int From, int To)
{
  int i;
  WCHAR Text[256];

  for(i = From; i <= To; i++)
  {
    if(LoadString(hAppInstance, i, Text, 255) > 0)
    {
      SendDlgItemMessage(Dlg, idComboBox, CB_ADDSTRING, 0, (LPARAM)Text);
    }
  }
}

typedef struct
{
  int ControlID;
  int ResX;
  int ResY;
} MAPCTLRES;

/* Property page dialog callback */
static INT_PTR CALLBACK
PageConfigProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
  LPNMHDR pnmh = (LPNMHDR)lParam;
  switch(uMsg)
  {
    case WM_INITDIALOG:
    {
      DWORD ResX = 0, ResY = 0, ColDepth = 0;
      int cbSel;

      FillComboBox(hwndDlg, IDC_COLORQUALITY, 10001, 10003);
      if(LoadResolutionSettings(&ResX, &ResY, &ColDepth))
      {
        SendDlgItemMessage(hwndDlg, ResX + ResY, BM_SETCHECK, BST_CHECKED, 0);
        switch(ColDepth)
        {
          case 8:
            cbSel = 0;
            break;
          case 16:
            cbSel = 1;
            break;
          case 32:
            cbSel = 2;
            break;
          default:
            cbSel = -1;
            break;
        }
        SendDlgItemMessage(hwndDlg, IDC_COLORQUALITY, CB_SETCURSEL, cbSel, 0);
      }
      break;
    }
    case WM_NOTIFY:
    {
      HWND hwndControl;

      /* Center the wizard window */
      hwndControl = GetParent(hwndDlg);
      CenterWindow (hwndControl);

      switch(pnmh->code)
      {
        case PSN_SETACTIVE:
        {
          PropSheet_SetWizButtons(GetParent(hwndDlg), ((StartVMwConfigWizard || DriverFilesFound) ? PSWIZB_FINISH | PSWIZB_BACK : PSWIZB_FINISH));
          break;
        }
        case PSN_WIZBACK:
        {
          if(StartVMwConfigWizard)
          {
            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION);
            return TRUE;
          }
          if(DriverFilesFound)
          {
            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_WELCOMEPAGE);
            return TRUE;
          }
          break;
        }
        case PSN_WIZFINISH:
        {
          DWORD rx = 800, ry = 600, cd = 32;
          int i;
          static MAPCTLRES Resolutions[11] = {
            {540, 640, 480},
            {1400, 800, 600},
            {1792, 1024, 768},
            {2016, 1152, 864},
            {2240, 1280, 960},
            {2304, 1280, 1024},
            {2450, 1400, 1050},
            {2800, 1600, 1200},
            {3136, 1792, 1344},
            {3248, 1856, 1392},
            {3360, 1920, 1440}
          };
          for(i = 0; i < 11; i++)
          {
            if(SendDlgItemMessage(hwndDlg, Resolutions[i].ControlID, BM_GETCHECK, 0, 0) == BST_CHECKED)
            {
              rx = Resolutions[i].ResX;
              ry = Resolutions[i].ResY;
              break;
            }
          }

          switch(SendDlgItemMessage(hwndDlg, IDC_COLORQUALITY, CB_GETCURSEL, 0, 0))
          {
            case 0:
              cd = 8;
              break;
            case 1:
              cd = 16;
              break;
            case 2:
              cd = 32;
              break;
          }

          SaveResolutionSettings(rx, ry, cd);
          break;
        }
      }
      break;
    }
  }
  return FALSE;
}

/* Property page dialog callback */
static INT_PTR CALLBACK
PageChooseActionProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
  switch(uMsg)
  {
    case WM_INITDIALOG:
      SendDlgItemMessage(hwndDlg, IDC_CONFIGSETTINGS, BM_SETCHECK, BST_CHECKED, 0);
      break;
    case WM_NOTIFY:
    {
      LPNMHDR pnmh = (LPNMHDR)lParam;
      switch(pnmh->code)
      {
        case PSN_SETACTIVE:
          PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
          break;
        case PSN_WIZBACK:
        {
          SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION);
          return TRUE;
        }
        case PSN_WIZNEXT:
        {
          static ULONG SelPage[4] = {IDD_CONFIG, IDD_SELECTDRIVER, IDD_SELECTDRIVER, IDD_CHOOSEACTION};
          int i;

          for(i = IDC_CONFIGSETTINGS; i <= IDC_UNINSTALL; i++)
          {
            if(SendDlgItemMessage(hwndDlg, i, BM_GETCHECK, 0, 0) == BST_CHECKED)
            {
              break;
            }
          }

          UninstallDriver = (i == IDC_UNINSTALL);

          SetWindowLong(hwndDlg, DWL_MSGRESULT, SelPage[i - IDC_CONFIGSETTINGS]);
          return TRUE;
        }
      }
      break;
    }
  }
  return FALSE;
}

/* Property page dialog callback */
static INT_PTR CALLBACK
PageSelectDriverProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
  switch(uMsg)
  {
    case WM_INITDIALOG:
      SendDlgItemMessage(hwndDlg, IDC_VBE, BM_SETCHECK, BST_CHECKED, 0);
      break;
    case WM_NOTIFY:
    {
      LPNMHDR pnmh = (LPNMHDR)lParam;
      switch(pnmh->code)
      {
        case PSN_SETACTIVE:
          PropSheet_SetWizButtons(GetParent(hwndDlg), (UninstallDriver ? PSWIZB_NEXT | PSWIZB_BACK : PSWIZB_BACK | PSWIZB_FINISH));
          break;
        case PSN_WIZBACK:
        {
          SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION);
          return TRUE;
        }
        case PSN_WIZNEXT:
        {
          ActivateVBE = (SendDlgItemMessage(hwndDlg, IDC_VBE, BM_GETCHECK, 0, 0) == BST_CHECKED);

          if(UninstallDriver)
          {
            return FALSE;
          }
          return TRUE;
        }
        case PSN_WIZFINISH:
        {
          if(UninstallDriver)
          {
            return FALSE;
          }
          ActivateVBE = (SendDlgItemMessage(hwndDlg, IDC_VBE, BM_GETCHECK, 0, 0) == BST_CHECKED);
          if(!EnableVmwareDriver(ActivateVBE,
                                 TRUE,
                                 FALSE))
          {
            WCHAR Msg[1024];
            LoadString(hAppInstance, (ActivateVBE ? IDS_FAILEDTOSELVBEDRIVER : IDS_FAILEDTOSELVGADRIVER), Msg, sizeof(Msg) / sizeof(WCHAR));
            MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTDRIVER);
            return TRUE;
          }
          break;
        }
      }
      break;
    }
  }
  return FALSE;
}

static VOID
ShowUninstNotice(HWND Owner)
{
  WCHAR Msg[1024];
  LoadString(hAppInstance, IDS_UNINSTNOTICE, Msg, sizeof(Msg) / sizeof(WCHAR));
  MessageBox(Owner, Msg, NULL, MB_ICONINFORMATION);
}

static INT_PTR CALLBACK
PageDoUninstallProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
  switch(uMsg)
  {
    case WM_NOTIFY:
    {
      LPNMHDR pnmh = (LPNMHDR)lParam;
      switch(pnmh->code)
      {
        case PSN_SETACTIVE:
          PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
          break;
        case PSN_WIZFINISH:
        {
          if(UninstallDriver)
          {
            if(!EnableVmwareDriver(ActivateVBE,
                                   TRUE,
                                   FALSE))
            {
              WCHAR Msg[1024];
              LoadString(hAppInstance, (ActivateVBE ? IDS_FAILEDTOSELVBEDRIVER : IDS_FAILEDTOSELVGADRIVER), Msg, sizeof(Msg) / sizeof(WCHAR));
              MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
              SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTDRIVER);
              return TRUE;
            }
            ShowUninstNotice(GetParent(hwndDlg));
          }
          return FALSE;
        }
      }
      break;
    }
  }
  return FALSE;
}

static LONG
CreateWizard(VOID)
{
  PROPSHEETHEADER psh;
  HPROPSHEETPAGE ahpsp[8];
  PROPSHEETPAGE psp;
  WCHAR Caption[1024];

  LoadString(hAppInstance, IDS_WIZARD_NAME, Caption, sizeof(Caption) / sizeof(TCHAR));

  /* 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_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
  psh.hInstance = hAppInstance;
  psh.hwndParent = NULL;
  psh.nPages = 7;
  psh.nStartPage = (StartVMwConfigWizard ? 5 : 0);
  psh.phpage = ahpsp;
  psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
  psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);

  /* Display the wizard */
  return (LONG)(PropertySheet(&psh) != -1);
}

int WINAPI
WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpszCmdLine,
	int nCmdShow)
{

  PVOID ExceptionHandler;
  int Version;
  WCHAR *lc;

  hAppInstance = hInstance;

  /* Setup a vectored exception handler to protect the detection. Don't use SEH
     here so we notice the next time someone removes support for vectored
     exception handling from ros... */
  if (!(ExceptionHandler = AddVectoredExceptionHandler(0,
                                                       VectoredExceptionHandler)))
  {
    return 1;
  }

  if(!DetectVMware(&Version))
  {
    return 1;
  }

  /* unregister the handler */
  RemoveVectoredExceptionHandler(ExceptionHandler);

  lc = DestinationPath;
  lc += GetSystemDirectory(DestinationPath, MAX_PATH) - 1;
  if(lc >= DestinationPath && *lc != L'\\')
  {
    wcscat(DestinationPath, L"\\");
  }
  DestinationDriversPath[0] = L'\0';
  wcscat(DestinationDriversPath, DestinationPath);
  wcscat(DestinationDriversPath, L"drivers\\");

  SetCurrentDirectory(DestinationPath);

  DriverFilesFound = FileExists(DestinationPath, vmx_fb) &&
                     FileExists(DestinationPath, vmx_mode) &&
                     FileExists(DestinationDriversPath, vmx_svga);

  StartVMwConfigWizard = DriverFilesFound && IsVmwSVGAEnabled();

  /* Show the wizard */
  CreateWizard();

  return 2;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -