Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhdwwiz.c
Go to the documentation of this file.
00001 /* 00002 * ReactOS New devices installation 00003 * Copyright (C) 2005, 2008 ReactOS Team 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Lesser General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2.1 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Lesser General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Lesser General Public 00016 * License along with this library; if not, write to the Free Software 00017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00018 */ 00019 /* 00020 * PROJECT: ReactOS Add hardware control panel 00021 * FILE: dll/cpl/hdwwiz/hdwwiz.c 00022 * PURPOSE: ReactOS Add hardware control panel 00023 * PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org) 00024 * Dmitry Chapyshev (dmitry@reactos.org) 00025 */ 00026 00027 #include "resource.h" 00028 #include "hdwwiz.h" 00029 00030 /* GLOBALS ******************************************************************/ 00031 00032 HINSTANCE hApplet = NULL; 00033 HFONT hTitleFont; 00034 SP_CLASSIMAGELIST_DATA ImageListData; 00035 PWSTR pDeviceStatusText; 00036 HANDLE hProcessHeap; 00037 HDEVINFO hDevInfoTypes; 00038 00039 typedef BOOL (WINAPI *PINSTALL_NEW_DEVICE)(HWND, LPGUID, PDWORD); 00040 00041 00042 /* STATIC FUNCTIONS *********************************************************/ 00043 00044 static HFONT 00045 CreateTitleFont(VOID) 00046 { 00047 NONCLIENTMETRICS ncm; 00048 LOGFONT LogFont; 00049 HDC hdc; 00050 INT FontSize; 00051 HFONT hFont; 00052 00053 ncm.cbSize = sizeof(NONCLIENTMETRICS); 00054 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); 00055 00056 LogFont = ncm.lfMessageFont; 00057 LogFont.lfWeight = FW_BOLD; 00058 wcscpy(LogFont.lfFaceName, L"MS Shell Dlg"); 00059 00060 hdc = GetDC(NULL); 00061 FontSize = 12; 00062 LogFont.lfHeight = 0 - GetDeviceCaps (hdc, LOGPIXELSY) * FontSize / 72; 00063 hFont = CreateFontIndirect(&LogFont); 00064 ReleaseDC(NULL, hdc); 00065 00066 return hFont; 00067 } 00068 00069 static INT_PTR CALLBACK 00070 StartPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00071 { 00072 switch (uMsg) 00073 { 00074 case WM_INITDIALOG: 00075 { 00076 /* Set title font */ 00077 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE); 00078 } 00079 break; 00080 00081 case WM_NOTIFY: 00082 { 00083 LPNMHDR lpnm = (LPNMHDR)lParam; 00084 00085 switch (lpnm->code) 00086 { 00087 case PSN_SETACTIVE: 00088 { 00089 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); 00090 } 00091 break; 00092 } 00093 } 00094 break; 00095 } 00096 00097 return FALSE; 00098 } 00099 00100 static INT_PTR CALLBACK 00101 SearchPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00102 { 00103 switch (uMsg) 00104 { 00105 case WM_INITDIALOG: 00106 { 00107 /* TODO: PnP devices search */ 00108 } 00109 break; 00110 00111 case WM_NOTIFY: 00112 { 00113 LPNMHDR lpnm = (LPNMHDR)lParam; 00114 00115 switch (lpnm->code) 00116 { 00117 case PSN_SETACTIVE: 00118 { 00119 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); 00120 } 00121 break; 00122 } 00123 } 00124 break; 00125 } 00126 00127 return FALSE; 00128 } 00129 00130 static INT_PTR CALLBACK 00131 IsConnctedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00132 { 00133 switch (uMsg) 00134 { 00135 case WM_COMMAND: 00136 { 00137 if(HIWORD(wParam) == BN_CLICKED) 00138 { 00139 if ((SendDlgItemMessage(hwndDlg, IDC_CONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED) || 00140 (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED)) 00141 { 00142 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); 00143 } 00144 else 00145 { 00146 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK); 00147 } 00148 } 00149 } 00150 break; 00151 00152 case WM_NOTIFY: 00153 { 00154 LPNMHDR lpnm = (LPNMHDR)lParam; 00155 00156 switch (lpnm->code) 00157 { 00158 case PSN_SETACTIVE: 00159 { 00160 if ((SendDlgItemMessage(hwndDlg, IDC_CONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED) || 00161 (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED)) 00162 { 00163 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); 00164 } 00165 else 00166 { 00167 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK); 00168 } 00169 } 00170 break; 00171 00172 case PSN_WIZNEXT: 00173 { 00174 if (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED) 00175 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_NOTCONNECTEDPAGE); 00176 else 00177 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE); 00178 00179 return TRUE; 00180 } 00181 } 00182 } 00183 break; 00184 } 00185 00186 return FALSE; 00187 } 00188 00189 static INT_PTR CALLBACK 00190 FinishPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00191 { 00192 switch (uMsg) 00193 { 00194 case WM_INITDIALOG: 00195 { 00196 /* Set title font */ 00197 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE); 00198 } 00199 break; 00200 00201 case WM_NOTIFY: 00202 { 00203 LPNMHDR lpnm = (LPNMHDR)lParam; 00204 00205 switch (lpnm->code) 00206 { 00207 case PSN_SETACTIVE: 00208 { 00209 /* Only "Finish" button */ 00210 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH); 00211 } 00212 break; 00213 } 00214 } 00215 break; 00216 } 00217 00218 return FALSE; 00219 } 00220 00221 static INT_PTR CALLBACK 00222 NotConnectedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00223 { 00224 switch (uMsg) 00225 { 00226 case WM_INITDIALOG: 00227 { 00228 /* Set title font */ 00229 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE); 00230 } 00231 break; 00232 00233 case WM_NOTIFY: 00234 { 00235 LPNMHDR lpnm = (LPNMHDR)lParam; 00236 00237 switch (lpnm->code) 00238 { 00239 case PSN_SETACTIVE: 00240 { 00241 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH | PSWIZB_BACK); 00242 } 00243 break; 00244 00245 case PSN_WIZBACK: 00246 { 00247 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE); 00248 return TRUE; 00249 } 00250 } 00251 } 00252 break; 00253 } 00254 00255 return FALSE; 00256 } 00257 00258 static VOID 00259 TrimGuidString(LPWSTR szString, LPWSTR szNewString) 00260 { 00261 WCHAR szBuffer[39]; 00262 INT Index; 00263 00264 if (wcslen(szString) == 38) 00265 { 00266 if ((szString[0] == L'{') && (szString[37] == L'}')) 00267 { 00268 for (Index = 0; Index < wcslen(szString); Index++) 00269 szBuffer[Index] = szString[Index + 1]; 00270 00271 szBuffer[36] = L'\0'; 00272 wcscpy(szNewString, szBuffer); 00273 return; 00274 } 00275 } 00276 wcscpy(szNewString, L"\0"); 00277 } 00278 00279 static VOID 00280 InitProbeListPage(HWND hwndDlg) 00281 { 00282 LV_COLUMN Column; 00283 LV_ITEM Item; 00284 WCHAR szBuffer[MAX_STR_SIZE], szGuid[MAX_STR_SIZE], 00285 szTrimGuid[MAX_STR_SIZE], szStatusText[MAX_STR_SIZE]; 00286 HWND hList = GetDlgItem(hwndDlg, IDC_PROBELIST); 00287 PWSTR pstrStatusText; 00288 HDEVINFO hDevInfo; 00289 SP_DEVINFO_DATA DevInfoData; 00290 ULONG ulStatus, ulProblemNumber; 00291 GUID ClassGuid; 00292 RECT Rect; 00293 DWORD Index; 00294 00295 if (!hList) return; 00296 00297 ZeroMemory(&Column, sizeof(LV_COLUMN)); 00298 00299 GetClientRect(hList, &Rect); 00300 00301 Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 00302 Column.fmt = LVCFMT_LEFT; 00303 Column.iSubItem = 0; 00304 Column.pszText = NULL; 00305 Column.cx = Rect.right - GetSystemMetrics(SM_CXVSCROLL); 00306 (VOID) ListView_InsertColumn(hList, 0, &Column); 00307 00308 ZeroMemory(&Item, sizeof(LV_ITEM)); 00309 00310 LoadString(hApplet, IDS_ADDNEWDEVICE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); 00311 00312 Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; 00313 Item.pszText = (LPWSTR) szBuffer; 00314 Item.iItem = (INT) ListView_GetItemCount(hList); 00315 Item.iImage = -1; 00316 (VOID) ListView_InsertItem(hList, &Item); 00317 00318 hDevInfo = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, 0); 00319 00320 if (hDevInfo == INVALID_HANDLE_VALUE) return; 00321 00322 /* Get the device image List */ 00323 ImageListData.cbSize = sizeof(ImageListData); 00324 SetupDiGetClassImageList(&ImageListData); 00325 00326 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 00327 for (Index = 0; TRUE; Index++) 00328 { 00329 szBuffer[0] = L'\0'; 00330 00331 if (!SetupDiEnumDeviceInfo(hDevInfo, Index, &DevInfoData)) break; 00332 00333 if (CM_Get_DevNode_Status_Ex(&ulStatus, &ulProblemNumber, DevInfoData.DevInst, 0, NULL) == CR_SUCCESS) 00334 { 00335 if (ulStatus & DN_NO_SHOW_IN_DM) continue; 00336 } 00337 00338 /* Get the device's friendly name */ 00339 if (!SetupDiGetDeviceRegistryProperty(hDevInfo, 00340 &DevInfoData, 00341 SPDRP_FRIENDLYNAME, 00342 0, 00343 (BYTE*)szBuffer, 00344 MAX_STR_SIZE, 00345 NULL)) 00346 { 00347 /* If the friendly name fails, try the description instead */ 00348 SetupDiGetDeviceRegistryProperty(hDevInfo, 00349 &DevInfoData, 00350 SPDRP_DEVICEDESC, 00351 0, 00352 (BYTE*)szBuffer, 00353 MAX_STR_SIZE, 00354 NULL); 00355 } 00356 00357 SetupDiGetDeviceRegistryProperty(hDevInfo, 00358 &DevInfoData, 00359 SPDRP_CLASSGUID, 00360 0, 00361 (BYTE*)szGuid, 00362 MAX_STR_SIZE, 00363 NULL); 00364 00365 TrimGuidString(szGuid, szTrimGuid); 00366 UuidFromStringW(szTrimGuid, &ClassGuid); 00367 00368 SetupDiGetClassImageIndex(&ImageListData, 00369 &ClassGuid, 00370 &Item.iImage); 00371 00372 DeviceProblemTextW(NULL, 00373 DevInfoData.DevInst, 00374 ulProblemNumber, 00375 szStatusText, 00376 sizeof(szStatusText) / sizeof(WCHAR)); 00377 00378 pstrStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, sizeof(szStatusText)); 00379 lstrcpy(pstrStatusText, szStatusText); 00380 00381 if (szBuffer[0] != L'\0') 00382 { 00383 /* Set device name */ 00384 Item.pszText = (LPWSTR) szBuffer; 00385 Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; 00386 Item.lParam = (LPARAM) pstrStatusText; 00387 Item.iItem = (INT) ListView_GetItemCount(hList); 00388 (VOID) ListView_InsertItem(hList, &Item); 00389 } 00390 00391 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 00392 } 00393 00394 (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL); 00395 (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT); 00396 SetupDiDestroyDeviceInfoList(hDevInfo); 00397 } 00398 00399 static INT_PTR CALLBACK 00400 ProbeListPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00401 { 00402 INT Index; 00403 00404 switch (uMsg) 00405 { 00406 case WM_INITDIALOG: 00407 { 00408 pDeviceStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, MAX_STR_SIZE); 00409 InitProbeListPage(hwndDlg); 00410 } 00411 break; 00412 00413 case WM_NOTIFY: 00414 { 00415 LPNMHDR lpnm = (LPNMHDR)lParam; 00416 00417 switch (lpnm->code) 00418 { 00419 case PSN_SETACTIVE: 00420 { 00421 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); 00422 } 00423 break; 00424 00425 case PSN_WIZNEXT: 00426 { 00427 Index = (INT) SendMessage(GetDlgItem(hwndDlg, IDC_PROBELIST), LVM_GETNEXTITEM, -1, LVNI_FOCUSED); 00428 if (Index == -1) Index = 0; 00429 00430 if (Index == 0) 00431 { 00432 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE); 00433 } 00434 else 00435 { 00436 LVITEM Item; 00437 PWSTR pts; 00438 00439 ZeroMemory(&Item, sizeof(LV_ITEM)); 00440 Item.mask = LVIF_PARAM; 00441 Item.iItem = Index; 00442 (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item); 00443 pts = (PWSTR) Item.lParam; 00444 wcscpy(pDeviceStatusText, pts); 00445 00446 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_HWSTATUSPAGE); 00447 } 00448 return TRUE; 00449 } 00450 } 00451 } 00452 break; 00453 00454 case WM_DESTROY: 00455 { 00456 INT Index; 00457 LVITEM Item; 00458 00459 for (Index = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_PROBELIST)); --Index > 0;) 00460 { 00461 ZeroMemory(&Item, sizeof(LV_ITEM)); 00462 Item.mask = LVIF_PARAM; 00463 Item.iItem = Index; 00464 (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item); 00465 HeapFree(hProcessHeap, 0, (LPVOID) Item.lParam); 00466 } 00467 HeapFree(hProcessHeap, 0, (LPVOID) pDeviceStatusText); 00468 } 00469 break; 00470 } 00471 00472 return FALSE; 00473 } 00474 00475 static INT_PTR CALLBACK 00476 SelectWayPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00477 { 00478 switch (uMsg) 00479 { 00480 case WM_NOTIFY: 00481 { 00482 LPNMHDR lpnm = (LPNMHDR)lParam; 00483 00484 switch (lpnm->code) 00485 { 00486 case PSN_SETACTIVE: 00487 { 00488 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); 00489 if (SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_GETCHECK, 0, 0) == BST_CHECKED) 00490 SendDlgItemMessage(hwndDlg, IDC_MANUALLYINST, BM_SETCHECK, 0, 0); 00491 else 00492 { 00493 SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_SETCHECK, 1, 1); 00494 SendDlgItemMessage(hwndDlg, IDC_MANUALLYINST, BM_SETCHECK, 0, 0); 00495 } 00496 } 00497 break; 00498 00499 case PSN_WIZNEXT: 00500 { 00501 if (SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_GETCHECK, 0, 0) == BST_CHECKED) 00502 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROGRESSPAGE); 00503 else 00504 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_HWTYPESPAGE); 00505 00506 return TRUE; 00507 } 00508 } 00509 } 00510 break; 00511 } 00512 00513 return FALSE; 00514 } 00515 00516 static INT_PTR CALLBACK 00517 DevStatusPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00518 { 00519 switch (uMsg) 00520 { 00521 case WM_INITDIALOG: 00522 { 00523 /* Set title font */ 00524 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE); 00525 } 00526 break; 00527 00528 case WM_NOTIFY: 00529 { 00530 LPNMHDR lpnm = (LPNMHDR)lParam; 00531 00532 switch (lpnm->code) 00533 { 00534 case PSN_SETACTIVE: 00535 { 00536 /* Set status text */ 00537 SetWindowText(GetDlgItem(hwndDlg, IDC_HWSTATUSEDIT), pDeviceStatusText); 00538 00539 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH | PSWIZB_BACK); 00540 } 00541 break; 00542 00543 case PSN_WIZBACK: 00544 { 00545 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE); 00546 return TRUE; 00547 } 00548 } 00549 } 00550 break; 00551 } 00552 00553 return FALSE; 00554 } 00555 00556 static INT 00557 EnumDeviceClasses(INT ClassIndex, 00558 LPWSTR DevClassName, 00559 LPWSTR DevClassDesc, 00560 BOOL *DevPresent, 00561 INT *ClassImage) 00562 { 00563 GUID ClassGuid; 00564 HKEY KeyClass; 00565 WCHAR ClassName[MAX_STR_SIZE]; 00566 DWORD RequiredSize = MAX_STR_SIZE; 00567 UINT Ret; 00568 00569 *DevPresent = FALSE; 00570 *DevClassName = L'\0'; 00571 00572 Ret = CM_Enumerate_Classes(ClassIndex, 00573 &ClassGuid, 00574 0); 00575 if (Ret != CR_SUCCESS) 00576 { 00577 /* All classes enumerated */ 00578 if(Ret == CR_NO_SUCH_VALUE) 00579 { 00580 hDevInfoTypes = NULL; 00581 return -1; 00582 } 00583 00584 if (Ret == CR_INVALID_DATA) 00585 { 00586 ; /* FIXME: What should we do here? */ 00587 } 00588 00589 /* Handle other errors... */ 00590 } 00591 00592 if (SetupDiClassNameFromGuid(&ClassGuid, 00593 ClassName, 00594 RequiredSize, 00595 &RequiredSize)) 00596 { 00597 lstrcpy(DevClassName, ClassName); 00598 } 00599 00600 if (!SetupDiGetClassImageIndex(&ImageListData, 00601 &ClassGuid, 00602 ClassImage)) 00603 { 00604 /* FIXME: Can we do this? 00605 * Set the blank icon: IDI_SETUPAPI_BLANK = 41 00606 * It'll be image 24 in the imagelist */ 00607 *ClassImage = 24; 00608 } 00609 00610 /* Get device info for all devices of a particular class */ 00611 hDevInfoTypes = SetupDiGetClassDevs(&ClassGuid, 00612 NULL, 00613 NULL, 00614 DIGCF_PRESENT); 00615 if (hDevInfoTypes == INVALID_HANDLE_VALUE) 00616 { 00617 hDevInfoTypes = NULL; 00618 return 0; 00619 } 00620 00621 KeyClass = SetupDiOpenClassRegKeyEx(&ClassGuid, 00622 MAXIMUM_ALLOWED, 00623 DIOCR_INSTALLER, 00624 NULL, 00625 0); 00626 if (KeyClass != INVALID_HANDLE_VALUE) 00627 { 00628 00629 LONG dwSize = MAX_STR_SIZE; 00630 00631 if (RegQueryValue(KeyClass, 00632 NULL, 00633 DevClassDesc, 00634 &dwSize) != ERROR_SUCCESS) 00635 { 00636 *DevClassDesc = L'\0'; 00637 } 00638 } 00639 else 00640 { 00641 return -3; 00642 } 00643 00644 *DevPresent = TRUE; 00645 00646 RegCloseKey(KeyClass); 00647 00648 return 0; 00649 } 00650 00651 static VOID 00652 InitHardWareTypesPage(HWND hwndDlg) 00653 { 00654 HWND hList = GetDlgItem(hwndDlg, IDC_HWTYPESLIST); 00655 WCHAR DevName[MAX_STR_SIZE]; 00656 WCHAR DevDesc[MAX_STR_SIZE]; 00657 BOOL DevExist = FALSE; 00658 INT ClassRet, DevImage, Index = 0; 00659 LV_COLUMN Column; 00660 LV_ITEM Item; 00661 RECT Rect; 00662 00663 if (!hList) return; 00664 00665 ZeroMemory(&Column, sizeof(LV_COLUMN)); 00666 00667 GetClientRect(hList, &Rect); 00668 00669 Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 00670 Column.fmt = LVCFMT_LEFT; 00671 Column.iSubItem = 0; 00672 Column.pszText = NULL; 00673 Column.cx = Rect.right - GetSystemMetrics(SM_CXVSCROLL); 00674 (VOID) ListView_InsertColumn(hList, 0, &Column); 00675 00676 ZeroMemory(&Item, sizeof(LV_ITEM)); 00677 00678 do 00679 { 00680 ClassRet = EnumDeviceClasses(Index, 00681 DevName, 00682 DevDesc, 00683 &DevExist, 00684 &DevImage); 00685 00686 if ((ClassRet != -1) && (DevExist)) 00687 { 00688 Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; 00689 Item.iItem = Index; 00690 Item.iImage = DevImage; 00691 00692 if (DevDesc[0] != L'\0') 00693 Item.pszText = (LPWSTR) DevDesc; 00694 else 00695 Item.pszText = (LPWSTR) DevName; 00696 00697 (VOID) ListView_InsertItem(hList, &Item); 00698 00699 /* Kill InfoList initialized in EnumDeviceClasses */ 00700 if (hDevInfoTypes) 00701 { 00702 SetupDiDestroyDeviceInfoList(hDevInfoTypes); 00703 hDevInfoTypes = NULL; 00704 } 00705 } 00706 Index++; 00707 } 00708 while (ClassRet != -1); 00709 00710 (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL); 00711 } 00712 00713 static INT_PTR CALLBACK 00714 HdTypesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00715 { 00716 switch (uMsg) 00717 { 00718 case WM_INITDIALOG: 00719 { 00720 InitHardWareTypesPage(hwndDlg); 00721 } 00722 break; 00723 00724 case WM_NOTIFY: 00725 { 00726 LPNMHDR lpnm = (LPNMHDR)lParam; 00727 00728 switch (lpnm->code) 00729 { 00730 case PSN_SETACTIVE: 00731 { 00732 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK); 00733 } 00734 break; 00735 00736 case PSN_WIZBACK: 00737 { 00738 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE); 00739 return TRUE; 00740 } 00741 } 00742 } 00743 break; 00744 } 00745 00746 return FALSE; 00747 } 00748 00749 static INT_PTR CALLBACK 00750 ProgressPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 00751 { 00752 switch (uMsg) 00753 { 00754 case WM_NOTIFY: 00755 { 00756 LPNMHDR lpnm = (LPNMHDR)lParam; 00757 00758 switch (lpnm->code) 00759 { 00760 case PSN_SETACTIVE: 00761 { 00762 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK); 00763 } 00764 break; 00765 00766 case PSN_WIZBACK: 00767 { 00768 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE); 00769 return TRUE; 00770 } 00771 } 00772 } 00773 break; 00774 } 00775 00776 return FALSE; 00777 } 00778 00779 static VOID 00780 HardwareWizardInit(HWND hwnd) 00781 { 00782 HPROPSHEETPAGE ahpsp[10]; 00783 PROPSHEETPAGE psp = {0}; 00784 PROPSHEETHEADER psh; 00785 UINT nPages = 0; 00786 00787 /* Create the Start page, until setup is working */ 00788 psp.dwSize = sizeof(PROPSHEETPAGE); 00789 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; 00790 psp.hInstance = hApplet; 00791 psp.lParam = 0; 00792 psp.pfnDlgProc = StartPageDlgProc; 00793 psp.pszTemplate = MAKEINTRESOURCE(IDD_STARTPAGE); 00794 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00795 00796 /* Create search page */ 00797 psp.dwSize = sizeof(PROPSHEETPAGE); 00798 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00799 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SEARCHTITLE); 00800 psp.pszHeaderSubTitle = NULL; 00801 psp.hInstance = hApplet; 00802 psp.lParam = 0; 00803 psp.pfnDlgProc = SearchPageDlgProc; 00804 psp.pszTemplate = MAKEINTRESOURCE(IDD_SEARCHPAGE); 00805 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00806 00807 /* Create is connected page */ 00808 psp.dwSize = sizeof(PROPSHEETPAGE); 00809 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00810 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_ISCONNECTED); 00811 psp.pszHeaderSubTitle = NULL; 00812 psp.hInstance = hApplet; 00813 psp.lParam = 0; 00814 psp.pfnDlgProc = IsConnctedPageDlgProc; 00815 psp.pszTemplate = MAKEINTRESOURCE(IDD_ISCONNECTEDPAGE); 00816 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00817 00818 /* Create probe list page */ 00819 psp.dwSize = sizeof(PROPSHEETPAGE); 00820 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00821 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_PROBELISTTITLE); 00822 psp.pszHeaderSubTitle = NULL; 00823 psp.hInstance = hApplet; 00824 psp.lParam = 0; 00825 psp.pfnDlgProc = ProbeListPageDlgProc; 00826 psp.pszTemplate = MAKEINTRESOURCE(IDD_PROBELISTPAGE); 00827 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00828 00829 /* Create select search way page */ 00830 psp.dwSize = sizeof(PROPSHEETPAGE); 00831 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00832 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SELECTWAYTITLE); 00833 psp.pszHeaderSubTitle = NULL; 00834 psp.hInstance = hApplet; 00835 psp.lParam = 0; 00836 psp.pfnDlgProc = SelectWayPageDlgProc; 00837 psp.pszTemplate = MAKEINTRESOURCE(IDD_SELECTWAYPAGE); 00838 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00839 00840 /* Create device status page */ 00841 psp.dwSize = sizeof(PROPSHEETPAGE); 00842 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; 00843 psp.hInstance = hApplet; 00844 psp.lParam = 0; 00845 psp.pfnDlgProc = DevStatusPageDlgProc; 00846 psp.pszTemplate = MAKEINTRESOURCE(IDD_HWSTATUSPAGE); 00847 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00848 00849 /* Create hardware types page */ 00850 psp.dwSize = sizeof(PROPSHEETPAGE); 00851 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00852 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_HDTYPESTITLE); 00853 psp.pszHeaderSubTitle = NULL; 00854 psp.hInstance = hApplet; 00855 psp.lParam = 0; 00856 psp.pfnDlgProc = HdTypesPageDlgProc; 00857 psp.pszTemplate = MAKEINTRESOURCE(IDD_HWTYPESPAGE); 00858 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00859 00860 /* Create progress page */ 00861 psp.dwSize = sizeof(PROPSHEETPAGE); 00862 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; 00863 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SEARCHTITLE); 00864 psp.pszHeaderSubTitle = NULL; 00865 psp.hInstance = hApplet; 00866 psp.lParam = 0; 00867 psp.pfnDlgProc = ProgressPageDlgProc; 00868 psp.pszTemplate = MAKEINTRESOURCE(IDD_PROGRESSPAGE); 00869 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00870 00871 /* Create finish page */ 00872 psp.dwSize = sizeof(PROPSHEETPAGE); 00873 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; 00874 psp.hInstance = hApplet; 00875 psp.lParam = 0; 00876 psp.pfnDlgProc = FinishPageDlgProc; 00877 psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE); 00878 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00879 00880 /* Create not connected page */ 00881 psp.dwSize = sizeof(PROPSHEETPAGE); 00882 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; 00883 psp.hInstance = hApplet; 00884 psp.lParam = 0; 00885 psp.pfnDlgProc = NotConnectedPageDlgProc; 00886 psp.pszTemplate = MAKEINTRESOURCE(IDD_NOTCONNECTEDPAGE); 00887 ahpsp[nPages++] = CreatePropertySheetPage(&psp); 00888 00889 /* Create the property sheet */ 00890 psh.dwSize = sizeof(PROPSHEETHEADER); 00891 psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; 00892 psh.hInstance = hApplet; 00893 psh.hwndParent = hwnd; 00894 psh.nPages = nPages; 00895 psh.nStartPage = 0; 00896 psh.phpage = ahpsp; 00897 psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK); 00898 psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER); 00899 00900 /* Create title font */ 00901 hTitleFont = CreateTitleFont(); 00902 00903 /* Display the wizard */ 00904 PropertySheet(&psh); 00905 00906 DeleteObject(hTitleFont); 00907 } 00908 00909 /* FUNCTIONS ****************************************************************/ 00910 00911 BOOL WINAPI 00912 InstallNewDevice(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot) 00913 { 00914 return FALSE; 00915 } 00916 00917 VOID WINAPI 00918 AddHardwareWizard(HWND hwnd, LPWSTR lpName) 00919 { 00920 if (lpName != NULL) 00921 { 00922 DPRINT1("No support of remote installation yet!\n"); 00923 return; 00924 } 00925 00926 HardwareWizardInit(hwnd); 00927 } 00928 00929 /* Control Panel Callback */ 00930 LONG CALLBACK 00931 CPlApplet(HWND hwndCpl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) 00932 { 00933 switch (uMsg) 00934 { 00935 case CPL_INIT: 00936 return TRUE; 00937 00938 case CPL_GETCOUNT: 00939 return 1; 00940 00941 case CPL_INQUIRE: 00942 { 00943 CPLINFO *CPlInfo = (CPLINFO*)lParam2; 00944 CPlInfo->lData = 0; 00945 CPlInfo->idIcon = IDI_CPLICON; 00946 CPlInfo->idName = IDS_CPLNAME; 00947 CPlInfo->idInfo = IDS_CPLDESCRIPTION; 00948 } 00949 break; 00950 00951 case CPL_DBLCLK: 00952 AddHardwareWizard(hwndCpl, NULL); 00953 break; 00954 } 00955 00956 return FALSE; 00957 } 00958 00959 BOOL WINAPI 00960 DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) 00961 { 00962 UNREFERENCED_PARAMETER(lpvReserved); 00963 00964 switch (dwReason) 00965 { 00966 case DLL_PROCESS_ATTACH: 00967 hApplet = hinstDLL; 00968 hProcessHeap = GetProcessHeap(); 00969 DisableThreadLibraryCalls(hinstDLL); 00970 break; 00971 } 00972 00973 return TRUE; 00974 } Generated on Sun May 27 2012 04:20:57 for ReactOS by
1.7.6.1
|