ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

hdwwiz.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.