From 9cc7905c9d616b1851aabb965950934da7933ee0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 27 Dec 2005 17:15:51 +0000 Subject: [PATCH] Display the driver provider, date and version. Based on a patch by Herve. svn path=/trunk/; revision=20373 --- reactos/lib/devmgr/advprop.c | 80 ++++++++++++--- reactos/lib/devmgr/misc.c | 194 ++++++++++++++++++++++++++++++++++- reactos/lib/devmgr/precomp.h | 19 ++++ 3 files changed, 277 insertions(+), 16 deletions(-) diff --git a/reactos/lib/devmgr/advprop.c b/reactos/lib/devmgr/advprop.c index a4f05d66c44..43b52127881 100644 --- a/reactos/lib/devmgr/advprop.c +++ b/reactos/lib/devmgr/advprop.c @@ -79,6 +79,71 @@ typedef struct _DEVADVPROP_INFO #define PM_INITIALIZE (WM_APP + 0x101) +static VOID +UpdateDriverDlg(IN HWND hwndDlg, + IN PDEVADVPROP_INFO dap) +{ + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; + + 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); + + /* query the driver provider */ + if (GetDriverProviderString(DeviceInfoSet, + DeviceInfoData, + dap->szTemp, + sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) + { + SetDlgItemText(hwndDlg, + IDC_DRVPROVIDER, + dap->szTemp); + } + + /* query the driver date */ + if (GetDriverDateString(DeviceInfoSet, + DeviceInfoData, + dap->szTemp, + sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) + { + SetDlgItemText(hwndDlg, + IDC_DRVDATE, + dap->szTemp); + } + + /* query the driver version */ + if (GetDriverVersionString(DeviceInfoSet, + DeviceInfoData, + dap->szTemp, + sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) + { + SetDlgItemText(hwndDlg, + IDC_DRVVERSION, + dap->szTemp); + } +} + + static INT_PTR CALLBACK AdvProcDriverDlgProc(IN HWND hwndDlg, @@ -116,17 +181,8 @@ AdvProcDriverDlgProc(IN HWND hwndDlg, DWL_USER, (DWORD_PTR)dap); - /* 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); + UpdateDriverDlg(hwndDlg, + dap); } Ret = TRUE; break; @@ -391,7 +447,7 @@ UpdateDevInfo(IN HWND hwndDlg, } else { - GetParentNode: +GetParentNode: /* get the parent node from the initial devinst */ CM_Get_Parent_Ex(&dap->ParentDevInst, dap->DeviceInfoData.DevInst, diff --git a/reactos/lib/devmgr/misc.c b/reactos/lib/devmgr/misc.c index dbe5792b5ed..0bab6c898e3 100644 --- a/reactos/lib/devmgr/misc.c +++ b/reactos/lib/devmgr/misc.c @@ -449,16 +449,202 @@ GetDeviceStatusString(IN DEVINST DevInst, else { GeneralMessage: - Ret = LoadString(hDllInstance, - MessageId, - szBuffer, - (int)BufferSize); + if (LoadString(hDllInstance, + MessageId, + szBuffer, + (int)BufferSize)) + { + Ret = TRUE; + } } return Ret; } +BOOL +GetDriverProviderString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize) +{ + HKEY hKey; + DWORD dwSize, dwType; + BOOL Ret = FALSE; + + szBuffer[0] = L'\0'; + + /* get driver provider, date and version */ + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) + { + /* query the driver provider */ + dwSize = BufferSize; + if (RegQueryValueEx(hKey, + REGSTR_VAL_PROVIDER_NAME, + NULL, + &dwType, + (LPBYTE)szBuffer, + &dwSize) == ERROR_SUCCESS && + dwType == REG_SZ && + szBuffer[0] != L'\0') + { + Ret = TRUE; + } + else + { + szBuffer[0] = L'\0'; + } + + RegCloseKey(hKey); + } + + if (szBuffer[0] == L'\0') + { + /* unable to query the information */ + if (LoadString(hDllInstance, + IDS_UNKNOWN, + szBuffer, + BufferSize)) + { + Ret = TRUE; + } + } + + return Ret; +} + + +BOOL +GetDriverVersionString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize) +{ + HKEY hKey; + DWORD dwSize, dwType; + BOOL Ret = FALSE; + + szBuffer[0] = L'\0'; + + /* get driver provider, date and version */ + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) + { + /* query the driver provider */ + dwSize = BufferSize; + if (RegQueryValueEx(hKey, + L"DriverVersion", + NULL, + &dwType, + (LPBYTE)szBuffer, + &dwSize) == ERROR_SUCCESS && + dwType == REG_SZ && + szBuffer[0] != L'\0') + { + Ret = TRUE; + } + else + { + szBuffer[0] = L'\0'; + } + + RegCloseKey(hKey); + } + + if (szBuffer[0] == L'\0') + { + /* unable to query the information */ + if (LoadString(hDllInstance, + IDS_UNKNOWN, + szBuffer, + BufferSize)) + { + Ret = TRUE; + } + } + + return Ret; +} + +BOOL +GetDriverDateString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize) +{ + HKEY hKey; + FILETIME DriverDate; + SYSTEMTIME SystemTime, LocalTime; + DWORD dwSize, dwType; + BOOL Ret = FALSE; + + szBuffer[0] = L'\0'; + + /* get driver provider, date and version */ + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) + { + /* query the driver provider */ + dwSize = sizeof(FILETIME); + if (RegQueryValueEx(hKey, + L"DriverDateData", + NULL, + &dwType, + (LPBYTE)&DriverDate, + &dwSize) == ERROR_SUCCESS && + dwType == REG_BINARY && + dwSize == sizeof(FILETIME) && + FileTimeToSystemTime(&DriverDate, + &SystemTime) && + SystemTimeToTzSpecificLocalTime(NULL, + &SystemTime, + &LocalTime) && + GetDateFormat(LOCALE_USER_DEFAULT, + DATE_SHORTDATE, + &LocalTime, + NULL, + szBuffer, + BufferSize) != 0) + { + Ret = TRUE; + } + + RegCloseKey(hKey); + } + + if (!Ret) + { + /* unable to query the information */ + if (LoadString(hDllInstance, + IDS_UNKNOWN, + szBuffer, + BufferSize)) + { + Ret = TRUE; + } + } + + return Ret; +} + + + BOOL IsDeviceHidden(IN DEVINST DevInst, IN HMACHINE hMachine, diff --git a/reactos/lib/devmgr/precomp.h b/reactos/lib/devmgr/precomp.h index 9f34aeeeb8c..9ae7f660fbd 100644 --- a/reactos/lib/devmgr/precomp.h +++ b/reactos/lib/devmgr/precomp.h @@ -2,6 +2,7 @@ #define __DEVMGR_H #include +#include #include #include #include @@ -256,6 +257,24 @@ GetDeviceStatusString(IN DEVINST DevInst, OUT LPWSTR szBuffer, IN DWORD BufferSize); +BOOL +GetDriverProviderString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize); + +BOOL +GetDriverVersionString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize); + +BOOL +GetDriverDateString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT LPWSTR szBuffer, + IN DWORD BufferSize); + BOOL IsDeviceHidden(IN DEVINST DevInst, IN HMACHINE hMachine,