- PROPSHEETHEADER psh;
- HPROPSHEETPAGE ahpsp[5];
- PROPSHEETPAGE psp;
- BOOL ret;
-
- /* Clear devinst data */
- ZeroMemory(&DevInstData, sizeof(DEVINSTDATA));
- DevInstData.devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */
-
-
- DevInstData.hDevInfo = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL);
- if (DevInstData.hDevInfo == INVALID_HANDLE_VALUE)
- {
- DPRINT("SetupDiCreateDeviceInfoListExW() failed with error 0x%lx\n", GetLastError());
- CleanUp();
- return FALSE;
- }
-
- DevInstData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
- ret = SetupDiOpenDeviceInfoW(
- DevInstData.hDevInfo,
- InstanceId,
- NULL,
- 0, /* Open flags */
- &DevInstData.devInfoData);
- if (!ret)
- {
- DPRINT("SetupDiOpenDeviceInfoW() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId);
- DevInstData.devInfoData.cbSize = 0;
- CleanUp();
- return FALSE;
- }
-
- SetLastError(ERROR_GEN_FAILURE);
- ret = SetupDiGetDeviceRegistryProperty(
- DevInstData.hDevInfo,
- &DevInstData.devInfoData,
- SPDRP_DEVICEDESC,
- &DevInstData.regDataType,
- NULL, 0,
- &DevInstData.requiredSize);
-
- if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData.regDataType == REG_SZ)
- {
- DevInstData.buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData.requiredSize);
- if (!DevInstData.buffer)
- {
- DPRINT("HeapAlloc() failed\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- }
- else
- {
- ret = SetupDiGetDeviceRegistryProperty(
- DevInstData.hDevInfo,
- &DevInstData.devInfoData,
- SPDRP_DEVICEDESC,
- &DevInstData.regDataType,
- DevInstData.buffer, DevInstData.requiredSize,
- &DevInstData.requiredSize);
- }
- }
- if (!ret)
- {
- DPRINT("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId);
- CleanUp();
- return FALSE;
- }
-
- DPRINT("Installing %S (%S)\n", DevInstData.buffer, InstanceId);
-
- if ((!FindDriver(&DevInstData)) && (Show != SW_HIDE))
- {
-
- /* Create the Welcome page */
- ZeroMemory (&psp, sizeof(PROPSHEETPAGE));
- psp.dwSize = sizeof(PROPSHEETPAGE);
- psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
- psp.hInstance = hDllInstance;
- psp.lParam = (LPARAM)&DevInstData;
- psp.pfnDlgProc = WelcomeDlgProc;
- psp.pszTemplate = MAKEINTRESOURCE(IDD_WELCOMEPAGE);
- ahpsp[IDD_WELCOMEPAGE] = CreatePropertySheetPage(&psp);
-
- /* Create the Select Source page */
- psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
- psp.pfnDlgProc = CHSourceDlgProc;
- psp.pszTemplate = MAKEINTRESOURCE(IDD_CHSOURCE);
- ahpsp[IDD_CHSOURCE] = CreatePropertySheetPage(&psp);
-
- /* Create the Search driver page */
- psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
- psp.pfnDlgProc = SearchDrvDlgProc;
- psp.pszTemplate = MAKEINTRESOURCE(IDD_SEARCHDRV);
- ahpsp[IDD_SEARCHDRV] = CreatePropertySheetPage(&psp);
-
- /* Create the Finish page */
- psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
- psp.pfnDlgProc = FinishDlgProc;
- psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE);
- ahpsp[IDD_FINISHPAGE] = CreatePropertySheetPage(&psp);
-
- /* Create the Install failed page */
- psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
- psp.pfnDlgProc = InstFailDlgProc;
- psp.pszTemplate = MAKEINTRESOURCE(IDD_NODRIVER);
- ahpsp[IDD_NODRIVER] = CreatePropertySheetPage(&psp);
-
- /* Create the property sheet */
- psh.dwSize = sizeof(PROPSHEETHEADER);
- psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
- psh.hInstance = hDllInstance;
- psh.hwndParent = NULL;
- psh.nPages = 5;
- psh.nStartPage = 0;
- psh.phpage = ahpsp;
- psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
- psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
-
- /* Create title font */
- DevInstData.hTitleFont = CreateTitleFont();
-
- /* Display the wizard */
- PropertySheet(&psh);
-
- DeleteObject(DevInstData.hTitleFont);
-
- }
- else
- {
- InstallDriver ( &DevInstData );
- }
-
- CleanUp();
- return TRUE;
+ PROPSHEETHEADER psh;
+ HPROPSHEETPAGE ahpsp[5];
+ PROPSHEETPAGE psp;
+ BOOL ret;
+ DWORD config_flags;
+ /*TCHAR buf[128];*/
+
+ /* Clear devinst data */
+ ZeroMemory(&DevInstData, sizeof(DEVINSTDATA));
+ DevInstData.devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */
+
+
+ DevInstData.hDevInfo = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL);
+ if (DevInstData.hDevInfo == INVALID_HANDLE_VALUE)
+ {
+ DPRINT("SetupDiCreateDeviceInfoListExW() failed with error 0x%lx\n", GetLastError());
+ CleanUp();
+ return FALSE;
+ }
+
+ DevInstData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+ ret = SetupDiOpenDeviceInfoW(
+ DevInstData.hDevInfo,
+ InstanceId,
+ NULL,
+ 0, /* Open flags */
+ &DevInstData.devInfoData);
+ if (!ret)
+ {
+ DPRINT("SetupDiOpenDeviceInfoW() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId);
+ DevInstData.devInfoData.cbSize = 0;
+ CleanUp();
+ return FALSE;
+ }
+
+ SetLastError(ERROR_GEN_FAILURE);
+ ret = SetupDiGetDeviceRegistryProperty(
+ DevInstData.hDevInfo,
+ &DevInstData.devInfoData,
+ SPDRP_DEVICEDESC,
+ &DevInstData.regDataType,
+ NULL, 0,
+ &DevInstData.requiredSize);
+
+ if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData.regDataType == REG_SZ)
+ {
+ DevInstData.buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData.requiredSize);
+ if (!DevInstData.buffer)
+ {
+ DPRINT("HeapAlloc() failed\n");
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ }
+ else
+ {
+ ret = SetupDiGetDeviceRegistryProperty(
+ DevInstData.hDevInfo,
+ &DevInstData.devInfoData,
+ SPDRP_DEVICEDESC,
+ &DevInstData.regDataType,
+ DevInstData.buffer, DevInstData.requiredSize,
+ &DevInstData.requiredSize);
+ }
+ }
+ if (!ret)
+ {
+ DPRINT("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId);
+ CleanUp();
+ return FALSE;
+ }
+
+ if(SetupDiGetDeviceRegistryProperty(DevInstData.hDevInfo,
+ &DevInstData.devInfoData,
+ SPDRP_CONFIGFLAGS,
+ NULL,
+ (BYTE *)&config_flags,
+ sizeof(config_flags),
+ NULL))
+ {
+ if (config_flags & CONFIGFLAG_FAILEDINSTALL)
+ {
+ CleanUp();
+ return TRUE;
+ }
+ }
+ /*
+ else
+ {
+ swprintf(buf, _T("%ld"), GetLastError());
+ MessageBox(0,buf,buf,0);
+ }
+ */
+
+ DPRINT("Installing %S (%S)\n", DevInstData.buffer, InstanceId);
+
+ if ((!FindDriver(&DevInstData)) && (Show != SW_HIDE))
+ {
+
+ /* Create the Welcome page */
+ ZeroMemory (&psp, sizeof(PROPSHEETPAGE));
+ psp.dwSize = sizeof(PROPSHEETPAGE);
+ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
+ psp.hInstance = hDllInstance;
+ psp.lParam = (LPARAM)&DevInstData;
+ psp.pfnDlgProc = WelcomeDlgProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_WELCOMEPAGE);
+ ahpsp[IDD_WELCOMEPAGE] = CreatePropertySheetPage(&psp);
+
+ /* Create the Select Source page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pfnDlgProc = CHSourceDlgProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_CHSOURCE);
+ ahpsp[IDD_CHSOURCE] = CreatePropertySheetPage(&psp);
+
+ /* Create the Search driver page */
+ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
+ psp.pfnDlgProc = SearchDrvDlgProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_SEARCHDRV);
+ ahpsp[IDD_SEARCHDRV] = CreatePropertySheetPage(&psp);
+
+ /* Create the Finish page */
+ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
+ psp.pfnDlgProc = FinishDlgProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE);
+ ahpsp[IDD_FINISHPAGE] = CreatePropertySheetPage(&psp);
+
+ /* Create the Install failed page */
+ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
+ psp.pfnDlgProc = InstFailDlgProc;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_NODRIVER);
+ ahpsp[IDD_NODRIVER] = CreatePropertySheetPage(&psp);
+
+ /* Create the property sheet */
+ psh.dwSize = sizeof(PROPSHEETHEADER);
+ psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
+ psh.hInstance = hDllInstance;
+ psh.hwndParent = NULL;
+ psh.nPages = 5;
+ psh.nStartPage = 0;
+ psh.phpage = ahpsp;
+ psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
+ psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
+
+ /* Create title font */
+ DevInstData.hTitleFont = CreateTitleFont();
+
+ /* Display the wizard */
+ PropertySheet(&psh);
+
+ DeleteObject(DevInstData.hTitleFont);
+
+ }
+ else
+ {
+ InstallDriver ( &DevInstData );
+ }
+
+ CleanUp();
+ return TRUE;