mirror of
https://github.com/reactos/reactos.git
synced 2025-06-05 17:30:32 +00:00
add the driver details dialog (not fully implemented)
svn path=/trunk/; revision=20440
This commit is contained in:
parent
b89e3ce2ba
commit
847c1627b2
6 changed files with 451 additions and 2 deletions
|
@ -143,3 +143,4 @@ BEGIN
|
||||||
LTEXT "Treiberversion:", -1, 37, 67, 60, 8, SS_NOPREFIX
|
LTEXT "Treiberversion:", -1, 37, 67, 60, 8, SS_NOPREFIX
|
||||||
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@ BEGIN
|
||||||
IDS_PROPERTIES "P&roperties"
|
IDS_PROPERTIES "P&roperties"
|
||||||
IDS_UPDATEDRV "U&pdate Driver..."
|
IDS_UPDATEDRV "U&pdate Driver..."
|
||||||
IDS_REBOOT "Restart &Computer..."
|
IDS_REBOOT "Restart &Computer..."
|
||||||
|
IDS_NOTAVAILABLE "Not available"
|
||||||
|
IDS_NOTDIGITALLYSIGNED "Not digitally signed"
|
||||||
|
IDS_NODRIVERS "No driver files are required or have been loaded for this device."
|
||||||
END
|
END
|
||||||
|
|
||||||
/* error messages, source: http://www.z123.org/techsupport/medm.htm */
|
/* error messages, source: http://www.z123.org/techsupport/medm.htm */
|
||||||
|
@ -141,4 +144,31 @@ BEGIN
|
||||||
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
||||||
LTEXT "Driver version:", -1, 37, 67, 60, 8, SS_NOPREFIX
|
LTEXT "Driver version:", -1, 37, 67, 60, 8, SS_NOPREFIX
|
||||||
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
||||||
|
LTEXT "Digital Signer:", -1, 37, 81, 60, 8, SS_NOPREFIX
|
||||||
|
EDITTEXT IDC_DIGITALSIGNER, 100, 81, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
|
||||||
|
PUSHBUTTON "&Driver Details...", IDC_DRIVERDETAILS, 7, 106, 70, 15
|
||||||
|
LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_DRIVERDETAILS DIALOG DISCARDABLE 0, 0, 224, 250
|
||||||
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
|
||||||
|
CAPTION "Driver File Details"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
ICON "", IDC_DEVICON, 7, 7, 20, 20
|
||||||
|
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
|
||||||
|
LTEXT "&Driver files:", -1, 7, 36, 204, 8
|
||||||
|
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
|
||||||
|
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
|
||||||
|
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
|
||||||
|
LTEXT "Provider:", -1, 14, 134, 50, 8
|
||||||
|
LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
|
||||||
|
LTEXT "File version:", -1, 14, 150, 50, 8
|
||||||
|
LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
|
||||||
|
LTEXT "Copyright:", -1, 14, 166, 50, 8
|
||||||
|
LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
|
||||||
|
LTEXT "Digital Signer:", -1, 14, 182, 50, 8
|
||||||
|
LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
|
||||||
|
PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
|
@ -76,9 +76,209 @@ typedef struct _DEVADVPROP_INFO
|
||||||
/* struct may be dynamically expanded here! */
|
/* struct may be dynamically expanded here! */
|
||||||
} DEVADVPROP_INFO, *PDEVADVPROP_INFO;
|
} DEVADVPROP_INFO, *PDEVADVPROP_INFO;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _ENUMDRIVERFILES_CONTEXT
|
||||||
|
{
|
||||||
|
HWND hDriversListView;
|
||||||
|
UINT nCount;
|
||||||
|
} ENUMDRIVERFILES_CONTEXT, *PENUMDRIVERFILES_CONTEXT;
|
||||||
|
|
||||||
#define PM_INITIALIZE (WM_APP + 0x101)
|
#define PM_INITIALIZE (WM_APP + 0x101)
|
||||||
|
|
||||||
|
|
||||||
|
static UINT WINAPI
|
||||||
|
EnumDeviceDriverFilesCallback(IN PVOID Context,
|
||||||
|
IN UINT Notification,
|
||||||
|
IN UINT_PTR Param1,
|
||||||
|
IN UINT_PTR Param2)
|
||||||
|
{
|
||||||
|
LVITEM li;
|
||||||
|
PENUMDRIVERFILES_CONTEXT EnumDriverFilesContext = (PENUMDRIVERFILES_CONTEXT)Context;
|
||||||
|
|
||||||
|
li.mask = LVIF_TEXT | LVIF_STATE;
|
||||||
|
li.iItem = EnumDriverFilesContext->nCount++;
|
||||||
|
li.iSubItem = 0;
|
||||||
|
li.state = (li.iItem == 0 ? LVIS_SELECTED : 0);
|
||||||
|
li.stateMask = LVIS_SELECTED;
|
||||||
|
li.pszText = (LPWSTR)Param1;
|
||||||
|
ListView_InsertItem(EnumDriverFilesContext->hDriversListView,
|
||||||
|
&li);
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
UpdateDriverDetailsDlg(IN HWND hwndDlg,
|
||||||
|
IN HWND hDriversListView,
|
||||||
|
IN PDEVADVPROP_INFO dap)
|
||||||
|
{
|
||||||
|
HDEVINFO DeviceInfoSet;
|
||||||
|
PSP_DEVINFO_DATA DeviceInfoData;
|
||||||
|
SP_DRVINFO_DATA DriverInfoData;
|
||||||
|
ENUMDRIVERFILES_CONTEXT EnumDriverFilesContext;
|
||||||
|
|
||||||
|
if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DeviceInfoSet = dap->CurrentDeviceInfoSet;
|
||||||
|
DeviceInfoData = &dap->CurrentDeviceInfoData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DeviceInfoSet = dap->DeviceInfoSet;
|
||||||
|
DeviceInfoData = &dap->DeviceInfoData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set the device image */
|
||||||
|
SendDlgItemMessage(hwndDlg,
|
||||||
|
IDC_DEVICON,
|
||||||
|
STM_SETICON,
|
||||||
|
(WPARAM)dap->hDevIcon,
|
||||||
|
0);
|
||||||
|
|
||||||
|
/* set the device name edit control text */
|
||||||
|
SetDlgItemText(hwndDlg,
|
||||||
|
IDC_DEVNAME,
|
||||||
|
dap->szDevName);
|
||||||
|
|
||||||
|
/* fill the driver files list view */
|
||||||
|
EnumDriverFilesContext.hDriversListView = hDriversListView;
|
||||||
|
EnumDriverFilesContext.nCount = 0;
|
||||||
|
|
||||||
|
ListView_DeleteAllItems(EnumDriverFilesContext.hDriversListView);
|
||||||
|
DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
|
||||||
|
if (FindCurrentDriver(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&DriverInfoData) &&
|
||||||
|
SetupDiSetSelectedDriver(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&DriverInfoData))
|
||||||
|
{
|
||||||
|
HSPFILEQ queueHandle;
|
||||||
|
|
||||||
|
queueHandle = SetupOpenFileQueue();
|
||||||
|
if (queueHandle != (HSPFILEQ)INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SP_DEVINSTALL_PARAMS DeviceInstallParams = {0};
|
||||||
|
DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
|
||||||
|
if (SetupDiGetDeviceInstallParams(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&DeviceInstallParams))
|
||||||
|
{
|
||||||
|
DeviceInstallParams.FileQueue = queueHandle;
|
||||||
|
DeviceInstallParams.Flags |= DI_NOVCP;
|
||||||
|
|
||||||
|
if (SetupDiSetDeviceInstallParams(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&DeviceInstallParams) &&
|
||||||
|
SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES,
|
||||||
|
DeviceInfoSet,
|
||||||
|
DeviceInfoData))
|
||||||
|
{
|
||||||
|
DWORD scanResult;
|
||||||
|
RECT rcClient;
|
||||||
|
LVCOLUMN lvc;
|
||||||
|
|
||||||
|
/* enumerate the driver files */
|
||||||
|
SetupScanFileQueue(queueHandle,
|
||||||
|
SPQ_SCAN_USE_CALLBACK,
|
||||||
|
NULL,
|
||||||
|
EnumDeviceDriverFilesCallback,
|
||||||
|
&EnumDriverFilesContext,
|
||||||
|
&scanResult);
|
||||||
|
|
||||||
|
/* update the list view column width */
|
||||||
|
GetClientRect(hDriversListView,
|
||||||
|
&rcClient);
|
||||||
|
lvc.mask = LVCF_WIDTH;
|
||||||
|
lvc.cx = rcClient.right;
|
||||||
|
ListView_SetColumn(hDriversListView,
|
||||||
|
0,
|
||||||
|
&lvc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupCloseFileQueue(queueHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static INT_PTR
|
||||||
|
CALLBACK
|
||||||
|
DriverDetailsDlgProc(IN HWND hwndDlg,
|
||||||
|
IN UINT uMsg,
|
||||||
|
IN WPARAM wParam,
|
||||||
|
IN LPARAM lParam)
|
||||||
|
{
|
||||||
|
PDEVADVPROP_INFO dap;
|
||||||
|
INT_PTR Ret = FALSE;
|
||||||
|
|
||||||
|
dap = (PDEVADVPROP_INFO)GetWindowLongPtr(hwndDlg,
|
||||||
|
DWL_USER);
|
||||||
|
|
||||||
|
if (dap != NULL || uMsg == WM_INITDIALOG)
|
||||||
|
{
|
||||||
|
switch (uMsg)
|
||||||
|
{
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDOK:
|
||||||
|
{
|
||||||
|
EndDialog(hwndDlg,
|
||||||
|
IDOK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_CLOSE:
|
||||||
|
{
|
||||||
|
EndDialog(hwndDlg,
|
||||||
|
IDCANCEL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
LV_COLUMN lvc;
|
||||||
|
HWND hDriversListView;
|
||||||
|
|
||||||
|
dap = (PDEVADVPROP_INFO)lParam;
|
||||||
|
if (dap != NULL)
|
||||||
|
{
|
||||||
|
SetWindowLongPtr(hwndDlg,
|
||||||
|
DWL_USER,
|
||||||
|
(DWORD_PTR)dap);
|
||||||
|
|
||||||
|
hDriversListView = GetDlgItem(hwndDlg,
|
||||||
|
IDC_DRIVERFILES);
|
||||||
|
|
||||||
|
/* add a column to the list view control */
|
||||||
|
lvc.mask = LVCF_FMT | LVCF_WIDTH;
|
||||||
|
lvc.fmt = LVCFMT_LEFT;
|
||||||
|
lvc.cx = 0;
|
||||||
|
ListView_InsertColumn(hDriversListView,
|
||||||
|
0,
|
||||||
|
&lvc);
|
||||||
|
|
||||||
|
UpdateDriverDetailsDlg(hwndDlg,
|
||||||
|
hDriversListView,
|
||||||
|
dap);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ret = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
UpdateDriverDlg(IN HWND hwndDlg,
|
UpdateDriverDlg(IN HWND hwndDlg,
|
||||||
IN PDEVADVPROP_INFO dap)
|
IN PDEVADVPROP_INFO dap)
|
||||||
|
@ -161,6 +361,23 @@ AdvProcDriverDlgProc(IN HWND hwndDlg,
|
||||||
{
|
{
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDC_DRIVERDETAILS:
|
||||||
|
{
|
||||||
|
DialogBoxParam(hDllInstance,
|
||||||
|
MAKEINTRESOURCE(IDD_DRIVERDETAILS),
|
||||||
|
hwndDlg,
|
||||||
|
DriverDetailsDlgProc,
|
||||||
|
(ULONG_PTR)dap);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
{
|
{
|
||||||
NMHDR *hdr = (NMHDR*)lParam;
|
NMHDR *hdr = (NMHDR*)lParam;
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
*/
|
*/
|
||||||
#include <precomp.h>
|
#include <precomp.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
HINSTANCE hDllInstance = NULL;
|
HINSTANCE hDllInstance = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
@ -566,7 +569,7 @@ GetDriverVersionString(IN HDEVINFO DeviceInfoSet,
|
||||||
{
|
{
|
||||||
/* unable to query the information */
|
/* unable to query the information */
|
||||||
if (LoadString(hDllInstance,
|
if (LoadString(hDllInstance,
|
||||||
IDS_UNKNOWN,
|
IDS_NOTAVAILABLE,
|
||||||
szBuffer,
|
szBuffer,
|
||||||
BufferSize))
|
BufferSize))
|
||||||
{
|
{
|
||||||
|
@ -632,7 +635,7 @@ GetDriverDateString(IN HDEVINFO DeviceInfoSet,
|
||||||
{
|
{
|
||||||
/* unable to query the information */
|
/* unable to query the information */
|
||||||
if (LoadString(hDllInstance,
|
if (LoadString(hDllInstance,
|
||||||
IDS_UNKNOWN,
|
IDS_NOTAVAILABLE,
|
||||||
szBuffer,
|
szBuffer,
|
||||||
BufferSize))
|
BufferSize))
|
||||||
{
|
{
|
||||||
|
@ -882,6 +885,189 @@ GetDeviceDescriptionString(IN HDEVINFO DeviceInfoSet,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
FindCurrentDriver(IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
|
OUT PSP_DRVINFO_DATA DriverInfoData)
|
||||||
|
{
|
||||||
|
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||||
|
SP_DEVINSTALL_PARAMS InstallParams = {0};
|
||||||
|
SP_DRVINFO_DETAIL_DATA DriverInfoDetailData = {0};
|
||||||
|
WCHAR InfPath[MAX_PATH];
|
||||||
|
WCHAR InfSection[LINE_LEN];
|
||||||
|
DWORD dwType, dwLength;
|
||||||
|
DWORD i = 0;
|
||||||
|
LONG rc;
|
||||||
|
BOOL Ret = FALSE;
|
||||||
|
|
||||||
|
/* Steps to find the right driver:
|
||||||
|
* 1) Get the device install parameters
|
||||||
|
* 2) Open the driver registry key
|
||||||
|
* 3) Read the .inf file name
|
||||||
|
* 4) Update install params, by setting DI_ENUMSINGLEINF and .inf file name
|
||||||
|
* 5) Build class driver list
|
||||||
|
* 6) Read inf section and inf section extension from registry
|
||||||
|
* 7) Enumerate drivers
|
||||||
|
* 8) Find the one who is in the same section as current driver?
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 1) Get the install params */
|
||||||
|
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
|
||||||
|
if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&InstallParams))
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DI_FLAGSEX_INSTALLEDDRIVER
|
||||||
|
InstallParams.FlagsEx |= (DI_FLAGSEX_INSTALLEDDRIVER | DI_FLAGSEX_ALLOWEXCLUDEDDRVS);
|
||||||
|
if (SetupDiSetDeviceInstallParams(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&InstallParams))
|
||||||
|
{
|
||||||
|
if (SetupDiBuildDriverInfoList(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDIT_CLASSDRIVER) &&
|
||||||
|
SetupDiEnumDriverInfo(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDIT_CLASSDRIVER,
|
||||||
|
0,
|
||||||
|
DriverInfoData))
|
||||||
|
{
|
||||||
|
Ret = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
InstallParams.FlagsEx &= ~(DI_FLAGSEX_INSTALLEDDRIVER | DI_FLAGSEX_ALLOWEXCLUDEDDRVS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 2) Open the driver registry key */
|
||||||
|
hKey = SetupDiOpenDevRegKey(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
DICS_FLAG_GLOBAL,
|
||||||
|
0,
|
||||||
|
DIREG_DRV,
|
||||||
|
KEY_QUERY_VALUE);
|
||||||
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiOpenDevRegKey() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3) Read the .inf file name */
|
||||||
|
dwLength = (sizeof(InfPath) / sizeof(InfPath[0])) - 1;
|
||||||
|
rc = RegQueryValueEx(hKey,
|
||||||
|
REGSTR_VAL_INFPATH,
|
||||||
|
0,
|
||||||
|
&dwType,
|
||||||
|
(LPBYTE)InfPath,
|
||||||
|
&dwLength);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
DPRINT1("RegQueryValueEx() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
else if (dwType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
DPRINT1("Expected registry type REG_SZ (%lu), got %lu\n", REG_SZ, dwType);
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
InfPath[(dwLength / sizeof(WCHAR)) - 1] = L'\0';
|
||||||
|
|
||||||
|
/* 4) Update install params, by setting DI_ENUMSINGLEINF and .inf file name */
|
||||||
|
InstallParams.Flags |= DI_ENUMSINGLEINF;
|
||||||
|
InstallParams.FlagsEx |= DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
|
||||||
|
wcscpy(InstallParams.DriverPath, InfPath);
|
||||||
|
if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
&InstallParams))
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 5) Build class driver list */
|
||||||
|
if (!SetupDiBuildDriverInfoList(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDIT_CLASSDRIVER))
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiBuildDriverInfoList() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6) Read inf section and from registry */
|
||||||
|
dwLength = (sizeof(InfSection) / sizeof(InfSection[0])) - 1;
|
||||||
|
rc = RegQueryValueEx(hKey,
|
||||||
|
REGSTR_VAL_INFSECTION,
|
||||||
|
0,
|
||||||
|
&dwType,
|
||||||
|
(LPBYTE)InfSection,
|
||||||
|
&dwLength);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
DPRINT1("RegQueryValueEx() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
else if (dwType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
DPRINT1("Expected registry type REG_SZ (%lu), got %lu\n", REG_SZ, dwType);
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
InfPath[(dwLength / sizeof(WCHAR)) - 1] = L'\0';
|
||||||
|
|
||||||
|
/* 7) Enumerate drivers */
|
||||||
|
DriverInfoData->cbSize = sizeof(SP_DRVINFO_DATA);
|
||||||
|
DriverInfoDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
|
||||||
|
while (SetupDiEnumDriverInfo(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDIT_CLASSDRIVER,
|
||||||
|
i,
|
||||||
|
DriverInfoData))
|
||||||
|
{
|
||||||
|
/* 8) Find the one who is in the same section as current driver */
|
||||||
|
if (!SetupDiGetDriverInfoDetail(DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
DriverInfoData,
|
||||||
|
&DriverInfoDetailData,
|
||||||
|
DriverInfoDetailData.cbSize,
|
||||||
|
NULL) &&
|
||||||
|
GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiGetDriverInfoDetail() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
if (!wcsicmp(DriverInfoDetailData.SectionName,
|
||||||
|
InfSection) != 0)
|
||||||
|
{
|
||||||
|
/* We have found the right driver */
|
||||||
|
Ret = TRUE;
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (GetLastError() != ERROR_NO_MORE_ITEMS)
|
||||||
|
{
|
||||||
|
DPRINT1("SetupDiEnumDriverInfo() failed with error 0x%lx\n", GetLastError());
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLastError(ERROR_NO_DRIVER_SELECTED);
|
||||||
|
|
||||||
|
Cleanup:
|
||||||
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
HINSTANCE
|
HINSTANCE
|
||||||
LoadAndInitComctl32(VOID)
|
LoadAndInitComctl32(VOID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -313,6 +313,11 @@ GetDeviceDescriptionString(IN HDEVINFO DeviceInfoSet,
|
||||||
OUT LPWSTR szBuffer,
|
OUT LPWSTR szBuffer,
|
||||||
IN DWORD BufferSize);
|
IN DWORD BufferSize);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
FindCurrentDriver(IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
|
OUT PSP_DRVINFO_DATA DriverInfoData);
|
||||||
|
|
||||||
#endif /* __DEVMGR_H */
|
#endif /* __DEVMGR_H */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#define IDD_DEVICEGENERAL 101
|
#define IDD_DEVICEGENERAL 101
|
||||||
#define IDD_DEVICEDRIVER 102
|
#define IDD_DEVICEDRIVER 102
|
||||||
#define IDD_DEVICERESOURCES 103
|
#define IDD_DEVICERESOURCES 103
|
||||||
|
#define IDD_DRIVERDETAILS 104
|
||||||
|
|
||||||
#define IDC_DEVICON 0x57B
|
#define IDC_DEVICON 0x57B
|
||||||
#define IDC_DEVNAME 0x57C
|
#define IDC_DEVNAME 0x57C
|
||||||
|
@ -29,6 +30,12 @@
|
||||||
#define IDC_DRVPROVIDER 0x58D
|
#define IDC_DRVPROVIDER 0x58D
|
||||||
#define IDC_DRVDATE 0x58E
|
#define IDC_DRVDATE 0x58E
|
||||||
#define IDC_DRVVERSION 0x58F
|
#define IDC_DRVVERSION 0x58F
|
||||||
|
#define IDC_DIGITALSIGNER 0x590
|
||||||
|
#define IDC_DRIVERDETAILS 0x591
|
||||||
|
#define IDC_DRIVERFILES 0x592
|
||||||
|
#define IDC_FILEPROVIDER 0x593
|
||||||
|
#define IDC_FILEVERSION 0x594
|
||||||
|
#define IDC_FILECOPYRIGHT 0x594
|
||||||
|
|
||||||
#define IDS_NAME 0x100
|
#define IDS_NAME 0x100
|
||||||
#define IDS_TYPE 0x101
|
#define IDS_TYPE 0x101
|
||||||
|
@ -50,6 +57,9 @@
|
||||||
#define IDS_UPDATEDRV 0x111
|
#define IDS_UPDATEDRV 0x111
|
||||||
#define IDS_REINSTALLDRV 0x112
|
#define IDS_REINSTALLDRV 0x112
|
||||||
#define IDS_REBOOT 0x113
|
#define IDS_REBOOT 0x113
|
||||||
|
#define IDS_NOTAVAILABLE 0x114
|
||||||
|
#define IDS_NOTDIGITALLYSIGNED 0x115
|
||||||
|
#define IDS_NODRIVERS 0x116
|
||||||
|
|
||||||
#define IDS_DEV_NO_PROBLEM 0x200
|
#define IDS_DEV_NO_PROBLEM 0x200
|
||||||
#define IDS_DEV_NOT_CONFIGURED 0x201
|
#define IDS_DEV_NOT_CONFIGURED 0x201
|
||||||
|
|
Loading…
Reference in a new issue