// Hardware.cpp: Implementation of Chardware #include "stdafx.h" #include "netca_hardware.h" #include "hardware.h" #define unknownDevice text ("
/ // CHARDWARE
/ *************************************************************************************************************** **
Parameter Description: driverid [in] - The unique identifier of the device in the registry PVAL [OUT, RETVAL] - Return value, success is 0, failed to create: 2002-6-21
*********************************************************** ******** / STDMETHODIMP Chardware :: Disable (BSTR Driverid, long * pval) {bool showhidden = 0; hdevinfo hdevinfo = 0; long list = -1; len = wcstombs NULL, DRIVERID, WCSLEN (DRIVERID)); len = len 1; drvid = (char *) malloc (len); MEMSET (DRVID, 0, LEN 1); WCSTombs (DriverId, WCSLEN (DRIVERID);
IF (Invalid_Handle_Value == (HDEVINFO = SetupdiGetClassdevs (NULL, NULL, NULL, DIGCF_PRESENT | Digcf_allClasses))) {
* pval = -1; return s_ok;} // Get the index of drv in the set enumadddevices (showhidden, hdevinfo);
// disable the DRV // IF ((IsDisableable (TINDEX, HDEVINFO) && (! (TINDEX == - 1))) IF (isDisabled (TINDEX, HDEVINFO) IF (Isdisableable (Tindex, HDevinfo)) IF ( STATECHANGE (DICS_DISABLE, TINDEX, HDEVINFO) * pVAL = 0; ELSE * pVAL = -1; Else * pval = 1; ELSE * pVAL = 0;
IF (HDEVINFO) setupdideDeDeviceInfolist (hdevinfo); returnif;
Bool Chardware :: ENUMADDDEVICES (Bool Showhidden, Hdevinfo Hdevinfo) {DWORD I, STATUS, PROBLEM
LPTSTR IONAME = NULL; DWORD LEN = 0; sp_devinfo_data deviceinfodata = {sizeof (sp_devinfo_data)};
// // enumerate though all the devices. // for (i = 0; SetupdienumDeviceInfo (HDevinfo, I, & DeviceInfodata); i ) {////////10 OR MOVE ONTO THE NEXT One. // IF (! CR_SUCCESS = CM_Get_DevNode_Status (& Status, & Problem, DeviceInfoData.DevInst, 0)) {continue;} if ((ShowHidden || ((Status & DN_NO_SHOW_IN_DM) || IsClassHidden (& DeviceInfoData.ClassGuid)))!!) continue;
// // Get a friendly name for the device. // ConstructDeviceName (Hdevinfo, & DeviceInFodata, & Ioname, (Pulong) & len; if (Strcmp (Ioname, DRVID) == 0) {TINDEX = I; Return True;}} Return True;} BOOL CHARDWARE :: ISCLASSHIDEN (GUID * ClassGuid) {bool bhidden = false; hkey hkeyclass;
// // If the devices class has the NoDisplayClass value then // do not display this device. // if (hKeyClass = SetupDiOpenClassRegKey (ClassGuid, KEY_READ)) {bHidden = (RegQueryValueEx (hKeyClass, REGSTR_VAL_NODISPLAYCLASS, NULL, NULL, NULL NULL) == Error_Success; regclosekey (HKEYCLASS);
Return bhidden;
BOOL CHardware :: ConstructDeviceName (HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID Buffer, PULONG Length) {if (! GetRegistryProperty (DeviceInfoSet, DeviceInfoData, SPDRP_DRIVER, Buffer, Length)) {if (! GetRegistryProperty (DeviceInfoSet, DeviceInfoData, SPDRP_DEVICEDESC, Buffer, Length )) {if (! GetRegistryProperty (DeviceInfoSet, DeviceInfoData, SPDRP_CLASS, Buffer, Length)) {if (! GetRegistryProperty (DeviceInfoSet, DeviceInfoData, SPDRP_CLASSGUID, Buffer, Length)) {* Length = (_tcslen (UnknownDevice) 1) * sizeof (Tchar); buffer = (char *) malloc (* length); _TCSCPY (* (lptstr *) Buffer, unknowndevice); }}}
Return True;}
BOOL CHardware :: GetRegistryProperty (HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, ULONG Property, PVOID Buffer, PULONG Length) {while (! SetupDiGetDeviceRegistryProperty (DeviceInfoSet, DeviceInfoData, Property, NULL, (BYTE *) * (TCHAR **) Buffer, * Length, Length)) {
IF (getLastError () == Error_INSUFFICIENT_Buffer {/// We need to change the buffer size. // if (* (lptstr *) buffer LocalFree (* (lptstr *) buffer; * (lptstr *) buffer = (PCHAR) LocalAlloc (LPTR, * Length);} else {// // Unknown Failure // return FALSE;.}} return (* (LPTSTR *) Buffer) [0];
}
BOOL CHardware :: StateChange (DWORD NewState, DWORD SelectedItem, HDEVINFO hDevInfo) {SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof (SP_CLASSINSTALL_HEADER)}; SP_DEVINFO_DATA DeviceInfoData = {sizeof (SP_DEVINFO_DATA)}; // // Get a handle to the Selected Item //. IF (! SetupdienumDeviceInfo (HDevinfo, SELECTEDITEM, & DeviceInfodata) {
Return false;}
// // Set the PropChangeParams structure // PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;. PropChangeParams.Scope = DICS_FLAG_GLOBAL; PropChangeParams.StateChange = NewState;
IF (! SETUPDisetClassInstallparams (HDEvinfo, & DeviceInFodata, (sp_classinstall_header *) & propchangeParams, SIZEOF (PropChangeParams))) {
Return false;}
/// Call the classinstaller and perform the change. //Iff (! Setupdicallclassinstaller (Dif_PropertyChange, HDevinfo, & deviceInfodata) {
Return True;}
Return True;}
Bool Chardware :: Isdisabled (DWORD SELECTEM, HDEVINFO HDEVINFO) {sp_devinfo_data deviceinfodata = {sizeof (sp_devinfo_data)}; DWORD status, proBLEM;
// // Get a Handle to the selected item. // if (! SetUpdienumDeviceInfo (HDEVINFO, SELECTEDITEM, & DeviceInfodata) {Return False;}
IF (cr_success! = cm_get_devnode_status (& status, & quhip, deviceinfodata.devinst, 0)) {
Return false;}
RETURN (STATUS & DN_HAS_PROBLEM) && (cm_prob_disabled == qu);}
Bool Chardware :: Isdisableable (DWORD SELECTEDITEM, HDEVINFO HDEVINFO) {sp_devinfo_data deficinfodata = {sizeof (sp_devinfo_data)}; DWORD Status, Problem;
// // Get a Handle to the selected item. // if (! SetUpdienumDeviceInfo (HDEVINFO, SELECTEDITEM, & DeviceInfodata) {
Return false;}
IF (cr_success! = cm_get_devnode_status (& status, & quhip, deviceinfodata.devinst, 0)) {
Return false;}
RETURN ((Status & DN_DISABLEABLE && (cm_prob_hardware_disabled! = qu));
STDMETHODIMP CHardware :: Enable (BSTR DriverID, long * pVal) {BOOL ShowHidden = 0; HDEVINFO hDevInfo = 0; long len; // init the value TIndex = -1; len = wcstombs (NULL, DriverID, wcslen (DriverID)) Leen = len 1; drvid = (char *) Malloc (len); MEMSET (DRVID, 0, LEN 1); WCSTombs (DriverId, WCSLEN (DRIVERID);
IF (Invalid_Handle_Value == (HDEVINFO = SetupdiGetClassdevs (NULL, NULL, NULL, DIGCF_PRESENT | Digcf_allClasses))) {
* pval = -1; return s_ok;} // Get the index of drv in the set enumadddevices (showhidden, hdevinfo);