From 49ba1e8fe42d00a7172259900f739a5578033893 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Dec 2005 20:23:23 +0000 Subject: [PATCH] implemented enabling/disabling of devices svn path=/trunk/; revision=19916 --- reactos/lib/devmgr/advprop.c | 101 ++++++++++++++++++++--------------- reactos/lib/devmgr/misc.c | 65 ++++++++++++++++++++++ reactos/lib/devmgr/precomp.h | 7 +++ 3 files changed, 130 insertions(+), 43 deletions(-) diff --git a/reactos/lib/devmgr/advprop.c b/reactos/lib/devmgr/advprop.c index e1de40f1574..fa5dbe039bf 100644 --- a/reactos/lib/devmgr/advprop.c +++ b/reactos/lib/devmgr/advprop.c @@ -34,13 +34,6 @@ typedef INT_PTR (WINAPI *PPROPERTYSHEETW)(LPCPROPSHEETHEADERW); typedef HPROPSHEETPAGE (WINAPI *PCREATEPROPERTYSHEETPAGEW)(LPCPROPSHEETPAGEW); typedef BOOL (WINAPI *PDESTROYPROPERTYSHEETPAGE)(HPROPSHEETPAGE); -typedef enum -{ - DEA_DISABLE = 0, - DEA_ENABLE, - DEA_UNKNOWN -} DEVENABLEACTION; - typedef struct _DEVADVPROP_INFO { HWND hWndGeneralPage; @@ -83,14 +76,10 @@ InitDevUsageActions(IN HWND hwndDlg, { INT Index; UINT i; - struct + UINT Actions[] = { - UINT szId; - DEVENABLEACTION Action; - } Actions[] = - { - {IDS_ENABLEDEVICE, DEA_ENABLE}, - {IDS_DISABLEDEVICE, DEA_DISABLE}, + IDS_ENABLEDEVICE, + IDS_DISABLEDEVICE, }; for (i = 0; @@ -99,7 +88,7 @@ InitDevUsageActions(IN HWND hwndDlg, { /* fill in the device usage combo box */ if (LoadString(hDllInstance, - Actions[i].szId, + Actions[i], dap->szTemp, sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) { @@ -112,11 +101,11 @@ InitDevUsageActions(IN HWND hwndDlg, SendMessage(hComboBox, CB_SETITEMDATA, (WPARAM)Index, - (LPARAM)Actions[i].Action); + (LPARAM)Actions[i]); - switch (Actions[i].Action) + switch (Actions[i]) { - case DEA_ENABLE: + case IDS_ENABLEDEVICE: if (dap->DeviceEnabled) { SendMessage(hComboBox, @@ -126,7 +115,7 @@ InitDevUsageActions(IN HWND hwndDlg, } break; - case DEA_DISABLE: + case IDS_DISABLEDEVICE: if (!dap->DeviceEnabled) { SendMessage(hComboBox, @@ -145,11 +134,11 @@ InitDevUsageActions(IN HWND hwndDlg, } -static DEVENABLEACTION +static UINT GetSelectedUsageAction(IN HWND hComboBox) { INT Index; - DEVENABLEACTION Ret = DEA_UNKNOWN; + UINT Ret = 0; Index = (INT)SendMessage(hComboBox, CB_GETCURSEL, @@ -161,9 +150,9 @@ GetSelectedUsageAction(IN HWND hComboBox) CB_GETITEMDATA, (WPARAM)Index, 0); - if (iRet != CB_ERR && iRet < (INT)DEA_UNKNOWN) + if (iRet != CB_ERR) { - Ret = (DEVENABLEACTION)iRet; + Ret = (UINT)iRet; } } @@ -171,44 +160,70 @@ GetSelectedUsageAction(IN HWND hComboBox) } -static VOID +static BOOL ApplyGeneralSettings(IN HWND hwndDlg, IN PDEVADVPROP_INFO dap) { + BOOL Ret = FALSE; + if (dap->DeviceUsageChanged && dap->IsAdmin) { - DEVENABLEACTION SelectedUsageAction; + UINT SelectedUsageAction; + BOOL NeedReboot = FALSE; SelectedUsageAction = GetSelectedUsageAction(GetDlgItem(hwndDlg, IDC_DEVUSAGE)); - if (SelectedUsageAction != DEA_UNKNOWN) + switch (SelectedUsageAction) { - switch (SelectedUsageAction) + case IDS_ENABLEDEVICE: + if (!dap->DeviceEnabled) + { + Ret = EnableDevice(dap->DeviceInfoSet, + &dap->DeviceInfoData, + TRUE, + 0, + &NeedReboot); + } + break; + + case IDS_DISABLEDEVICE: + if (dap->DeviceEnabled) + { + Ret = EnableDevice(dap->DeviceInfoSet, + &dap->DeviceInfoData, + FALSE, + 0, + &NeedReboot); + } + break; + + default: + break; + } + + if (Ret) + { + if (NeedReboot) { - case DEA_ENABLE: - if (!dap->DeviceEnabled) - { - /* FIXME - enable device */ - } - break; - - case DEA_DISABLE: - if (dap->DeviceEnabled) - { - /* FIXME - disable device */ - } - break; - - default: - break; + /* make PropertySheet() return PSM_REBOOTSYSTEM */ + PropSheet_RebootSystem(hwndDlg); } } + else + { + /* FIXME - display an error message */ + DPRINT1("Failed to enable/disable device! LastError: %d\n", + GetLastError()); + } } + else + Ret = !dap->DeviceUsageChanged; /* disable the apply button */ PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg); dap->DeviceUsageChanged = FALSE; + return Ret; } diff --git a/reactos/lib/devmgr/misc.c b/reactos/lib/devmgr/misc.c index b3ad3b828a5..274e8f766b7 100644 --- a/reactos/lib/devmgr/misc.c +++ b/reactos/lib/devmgr/misc.c @@ -612,6 +612,71 @@ IsDeviceEnabled(IN DEVINST DevInst, } +BOOL +EnableDevice(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, + IN BOOL bEnable, + IN DWORD HardwareProfile OPTIONAL, + OUT BOOL *bNeedReboot OPTIONAL) +{ + SP_PROPCHANGE_PARAMS pcp; + SP_DEVINSTALL_PARAMS dp; + DWORD LastErr; + BOOL Ret = FALSE; + + pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); + pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; + pcp.HwProfile = HardwareProfile; + + if (bEnable) + { + /* try to enable/disable the device on the global profile */ + pcp.StateChange = DICS_ENABLE; + pcp.Scope = DICS_FLAG_GLOBAL; + + /* ignore errors */ + LastErr = GetLastError(); + if (SetupDiSetClassInstallParams(DeviceInfoSet, + DevInfoData, + &pcp.ClassInstallHeader, + sizeof(SP_PROPCHANGE_PARAMS))) + { + SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, + DeviceInfoSet, + DevInfoData); + } + SetLastError(LastErr); + } + + /* try config-specific */ + pcp.StateChange = (bEnable ? DICS_ENABLE : DICS_DISABLE); + pcp.Scope = DICS_FLAG_CONFIGSPECIFIC; + + if (SetupDiSetClassInstallParams(DeviceInfoSet, + DevInfoData, + &pcp.ClassInstallHeader, + sizeof(SP_PROPCHANGE_PARAMS)) && + SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, + DeviceInfoSet, + DevInfoData)) + { + dp.cbSize = sizeof(SP_DEVINSTALL_PARAMS); + if (SetupDiGetDeviceInstallParams(DeviceInfoSet, + DevInfoData, + &dp)) + { + if (bNeedReboot != NULL) + { + *bNeedReboot = ((dp.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) != 0); + } + + Ret = TRUE; + } + } + return Ret; +} + + BOOL GetDeviceTypeString(IN PSP_DEVINFO_DATA DeviceInfoData, OUT LPWSTR szBuffer, diff --git a/reactos/lib/devmgr/precomp.h b/reactos/lib/devmgr/precomp.h index 92d3d21bd0c..94209a51658 100644 --- a/reactos/lib/devmgr/precomp.h +++ b/reactos/lib/devmgr/precomp.h @@ -266,6 +266,13 @@ IsDeviceEnabled(IN DEVINST DevInst, IN HMACHINE hMachine, OUT BOOL *IsEnabled); +BOOL +EnableDevice(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, + IN BOOL bEnable, + IN DWORD HardwareProfile OPTIONAL, + OUT BOOL *bNeedReboot OPTIONAL); + BOOL GetDeviceTypeString(IN PSP_DEVINFO_DATA DeviceInfoData, OUT LPWSTR szBuffer,