* UPDATE HISTORY:
* 04-04-2004 Created
*/
-#include <precomp.h>
+#include "precomp.h"
#define NDEBUG
#include <debug.h>
-/* setupapi */
-DWORD WINAPI pSetupGuidFromString(PCWSTR pString, LPGUID lpGUID);
-
typedef INT_PTR (WINAPI *PPROPERTYSHEETW)(LPCPROPSHEETHEADERW);
typedef HPROPSHEETPAGE (WINAPI *PCREATEPROPERTYSHEETPAGEW)(LPCPROPSHEETPAGEW);
typedef BOOL (WINAPI *PDESTROYPROPERTYSHEETPAGE)(HPROPSHEETPAGE);
UINT Flags;
struct
{
+ UINT Extended : 1;
UINT FreeDevPropSheets : 1;
UINT CanDisable : 1;
UINT DeviceStarted : 1;
(ULONG_PTR)dap);
break;
}
+ case IDC_UPDATEDRIVER:
+ {
+ if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
+ {
+ BOOL NeedReboot;
+ if (DiShowUpdateDevice(hwndDlg, dap->CurrentDeviceInfoSet, &dap->CurrentDeviceInfoData, 0, &NeedReboot))
+ {
+ if (NeedReboot)
+ {
+ //FIXME: load text from resource file
+ if(MessageBoxW(hwndDlg, L"Reboot now?", L"Reboot required", MB_YESNO | MB_ICONQUESTION) == IDYES)
+ {
+ HANDLE hToken;
+ TOKEN_PRIVILEGES Privileges;
+
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
+ {
+ DPRINT("OpenProcessToken failed\n");
+ break;
+ }
+
+ /* Get the LUID for the Shutdown privilege */
+ if (!LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, &Privileges.Privileges[0].Luid))
+ {
+ DPRINT("LookupPrivilegeValue failed\n");
+ break;
+ }
+
+ /* Assign the Shutdown privilege to our process */
+ Privileges.PrivilegeCount = 1;
+ Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+ if (!AdjustTokenPrivileges(hToken, FALSE, &Privileges, 0, NULL, NULL))
+ {
+ DPRINT("AdjustTokenPrivileges failed\n");
+ break;
+ }
+
+ /* Finally shut down the system */
+ if(!ExitWindowsEx(EWX_POWEROFF, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED))
+ {
+ DPRINT("ExitWindowsEx failed\n");
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
}
break;
}
PSP_DEVINFO_DATA DeviceInfoData;
DWORD dwType;
DWORD dwSize;
+ DWORD dwValue;
LPBYTE lpBuffer;
LPWSTR lpStr;
INT len;
}
else if (dwType == REG_DWORD)
{
+ dwValue = *(DWORD *) lpBuffer;
+
switch (dwProperty)
{
case SPDRP_CAPABILITIES:
index = 0;
- if (*lpBuffer & CM_DEVCAP_LOCKSUPPORTED)
+ if (dwValue & CM_DEVCAP_LOCKSUPPORTED)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_LOCKSUPPORTED");
- if (*lpBuffer & CM_DEVCAP_EJECTSUPPORTED)
+ if (dwValue & CM_DEVCAP_EJECTSUPPORTED)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_EJECTSUPPORTED");
- if (*lpBuffer & CM_DEVCAP_REMOVABLE)
+ if (dwValue & CM_DEVCAP_REMOVABLE)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_REMOVABLE");
- if (*lpBuffer & CM_DEVCAP_DOCKDEVICE)
+ if (dwValue & CM_DEVCAP_DOCKDEVICE)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_DOCKDEVICE");
- if (*lpBuffer & CM_DEVCAP_UNIQUEID)
+ if (dwValue & CM_DEVCAP_UNIQUEID)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_UNIQUEID");
- if (*lpBuffer & CM_DEVCAP_SILENTINSTALL)
+ if (dwValue & CM_DEVCAP_SILENTINSTALL)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_SILENTINSTALL");
- if (*lpBuffer & CM_DEVCAP_RAWDEVICEOK)
+ if (dwValue & CM_DEVCAP_RAWDEVICEOK)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_RAWDEVICEOK");
- if (*lpBuffer & CM_DEVCAP_SURPRISEREMOVALOK)
+ if (dwValue & CM_DEVCAP_SURPRISEREMOVALOK)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_SURPRISEREMOVALOK");
- if (*lpBuffer & CM_DEVCAP_HARDWAREDISABLED)
+ if (dwValue & CM_DEVCAP_HARDWAREDISABLED)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_HARDWAREDISABLED");
- if (*lpBuffer & CM_DEVCAP_NONDYNAMIC)
+ if (dwValue & CM_DEVCAP_NONDYNAMIC)
SetListViewText(hwndListView, index++, L"CM_DEVCAP_NONDYNAMIC");
break;
case SPDRP_CONFIGFLAGS:
index = 0;
- if (*lpBuffer & CONFIGFLAG_DISABLED)
+ if (dwValue & CONFIGFLAG_DISABLED)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_DISABLED");
- if (*lpBuffer & CONFIGFLAG_REMOVED)
+ if (dwValue & CONFIGFLAG_REMOVED)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_REMOVED");
- if (*lpBuffer & CONFIGFLAG_MANUAL_INSTALL)
+ if (dwValue & CONFIGFLAG_MANUAL_INSTALL)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_MANUAL_INSTALL");
- if (*lpBuffer & CONFIGFLAG_IGNORE_BOOT_LC)
+ if (dwValue & CONFIGFLAG_IGNORE_BOOT_LC)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_IGNORE_BOOT_LC");
- if (*lpBuffer & CONFIGFLAG_NET_BOOT)
+ if (dwValue & CONFIGFLAG_NET_BOOT)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_NET_BOOT");
- if (*lpBuffer & CONFIGFLAG_REINSTALL)
+ if (dwValue & CONFIGFLAG_REINSTALL)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_REINSTALL");
- if (*lpBuffer & CONFIGFLAG_FAILEDINSTALL)
+ if (dwValue & CONFIGFLAG_FAILEDINSTALL)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_FAILEDINSTALL");
- if (*lpBuffer & CONFIGFLAG_CANTSTOPACHILD)
+ if (dwValue & CONFIGFLAG_CANTSTOPACHILD)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_CANTSTOPACHILD");
- if (*lpBuffer & CONFIGFLAG_OKREMOVEROM)
+ if (dwValue & CONFIGFLAG_OKREMOVEROM)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_OKREMOVEROM");
- if (*lpBuffer & CONFIGFLAG_NOREMOVEEXIT)
+ if (dwValue & CONFIGFLAG_NOREMOVEEXIT)
SetListViewText(hwndListView, index++, L"CONFIGFLAG_NOREMOVEEXIT");
break;
default:
- swprintf(dap->szTemp, L"0x%08x", *lpBuffer);
+ swprintf(dap->szTemp, L"0x%08lx", dwValue);
SetListViewText(hwndListView, 0, dap->szTemp);
break;
}
DisplayDevNodeEnumerator(IN PDEVADVPROP_INFO dap,
IN HWND hwndListView)
{
- HDEVINFO DeviceInfoSet;
PSP_DEVINFO_DATA DeviceInfoData;
DWORD dwType = 0;
if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
{
- DeviceInfoSet = dap->CurrentDeviceInfoSet;
DeviceInfoData = &dap->CurrentDeviceInfoData;
}
else
{
- DeviceInfoSet = dap->DeviceInfoSet;
DeviceInfoData = &dap->DeviceInfoData;
}
dap->nDevPropSheets++;
/* include the details page */
- dap->nDevPropSheets++;
+ if (dap->Extended)
+ dap->nDevPropSheets++;
/* add the device property sheets */
if (dap->nDevPropSheets != 0)
}
}
- if (1)
+ if (dap->Extended)
{
+ /* Add the details page */
PROPSHEETPAGE pspDetails = {0};
pspDetails.dwSize = sizeof(PROPSHEETPAGE);
pspDetails.dwFlags = PSP_DEFAULT;
dap->DevPropSheets[iPage] = NULL;
}
}
- }
- /* FIXME: Add the resources page */
+ /* FIXME: Add the resources page */
+ }
/* FIXME: Add the power page */
}
DevAdvPropInfo->IsAdmin = IsUserAdmin();
DevAdvPropInfo->DoDefaultDevAction = ((dwFlags & DPF_DEVICE_STATUS_ACTION) != 0);
+ DevAdvPropInfo->Extended = ((dwFlags & DPF_EXTENDED) != 0);
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPTITLE | PSH_NOAPPLYNOW;