2012-06-24 19 views
5

Tornando a casa questo WE sono andato a un problema riguardante un videogioco a vapore: ho avuto ritardi regolari, e cercando sul web ho scoperto che questo proveniva da alcuni dispositivi di controllo, come la mia tastiera WE.Cercando di disabilitare un dispositivo nell'ambiente Windows

La soluzione consiste nel disattivare alcuni dispositivi HID nel gestore dispositivi (sezione dei dispositivi di interfaccia umana) con il tasto destro del mouse standard => disabilita l'operazione. Così ho iniziato a codificare una piccola utility per disabilitare questi dispositivi durante l'avvio del gioco e riattivarli dopo l'uscita.

Utilizzando le funzioni API SetupDI, sono riuscito a isolare i dispositivi che volevo disattivare, ma quando li disattivo applicando l'operazione DICS_DISABLE, invece di agire come se li avessi disabilitati con il metodo del pulsante destro del mouse, i dispositivi diventano " dispositivi sconosciuti "nel gestore dispositivi. Devo aggiornare i driver dei dispositivi per riportarli in Gestione dispositivi. Ho anche provato l'operazione DICS_STOP, ma con questa i dispositivi semplicemente scompaiono dal DM ...

C'è qualcosa che mi manca in questa operazione?

Ecco il mio codice prototipo: (console application, x64) => il sistema è x64, e se la mia applicazione è a 32 bit, tutte le operazioni del dispositivo semplicemente falliscono.

#include <stdio.h> 
#include <Windows.h> 
#include <setupapi.h> 
#include <devguid.h> 
#include <regstr.h> 

#pragma comment (lib, "Newdev.lib") 
#pragma comment (lib, "Setupapi.lib") 

int main(int argc, void * argv[]) 
{ 
    HDEVINFO hDevInfo; 
    SP_DEVINFO_DATA DeviceInfoData; 
    DWORD i; 
    SP_PROPCHANGE_PARAMS params; // params to set in order to enable/disable the device 

    // Create a HDEVINFO with all present devices. 
    hDevInfo = SetupDiGetClassDevs(NULL, 
     0, // Enumerator 
     0, 
     DIGCF_PRESENT | DIGCF_ALLCLASSES); 

    if (hDevInfo == INVALID_HANDLE_VALUE) 
    { 
     // Insert error handling here. 
     return 1; 
    } 

    // Enumerate through all devices in Set. 

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 
    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i, 
     &DeviceInfoData);i++) 
    { 
     DWORD DataT; 
     LPTSTR buffer = NULL; 
     LPTSTR servBuffer = NULL; 
     DWORD buffersize = 0; 
     DWORD servBufferSize = 0; 

     // 
     // Call function with null to begin with, 
     // then use the returned buffer size (doubled) 
     // to Alloc the buffer. Keep calling until 
     // success or an unknown failure. 
     // 
     // Double the returned buffersize to correct 
     // for underlying legacy CM functions that 
     // return an incorrect buffersize value on 
     // DBCS/MBCS systems. 
     // 
     while (!SetupDiGetDeviceRegistryProperty(
      hDevInfo, 
      &DeviceInfoData, 
      SPDRP_DEVICEDESC, 
      &DataT, 
      (PBYTE)buffer, 
      buffersize, 
      &buffersize)) 
     { 
      if (GetLastError() == 
       ERROR_INSUFFICIENT_BUFFER) 
      { 
       // Change the buffer size. 
       if (buffer) LocalFree(buffer); 
       // Double the size to avoid problems on 
       // W2k MBCS systems per KB 888609. 
       buffer = (LPTSTR)LocalAlloc(LPTR,buffersize * 2); 
      } 
      else 
      { 
       // Insert error handling here. 
       break; 
      } 
     } 

     while (!SetupDiGetDeviceRegistryProperty(
      hDevInfo, 
      &DeviceInfoData, 
      SPDRP_SERVICE, 
      &DataT, 
      (PBYTE)servBuffer, 
      servBufferSize, 
      &servBufferSize)) 
     { 
      if (GetLastError() == 
       ERROR_INSUFFICIENT_BUFFER) 
      { 
       // Change the buffer size. 
       if (servBuffer) LocalFree(servBuffer); 
       // Double the size to avoid problems on 
       // W2k MBCS systems per KB 888609. 
       servBuffer = (LPTSTR)LocalAlloc(LPTR,servBufferSize * 2); 
      } 
      else 
      { 
       // Insert error handling here. 
       break; 
      } 
     } 

     if (strstr((char *)buffer, "(HID)") && NULL == servBuffer) 
     { 
      printf("New device found : %s\n", buffer); 
      printf("disabling...\n"); 
      // init the structure 
      params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); 
      params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; 
      params.HwProfile = 0; 
      params.Scope = DICS_FLAG_CONFIGSPECIFIC; 
      params.StateChange = DICS_DISABLE; 
      // prepare operation 
      if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, &params.ClassInstallHeader, sizeof(params))) 
      { 
       printf("Error while preparing params !\n"); 
       break; 
      } 
      // launch op 
      if (!SetupDiCallClassInstaller(DICS_DISABLE, hDevInfo, &DeviceInfoData)) 
      { 
       printf("Error while calling OP ! Return code is %x\n", GetLastError()); 
       continue; 
      } 
      printf("done.\n\n"); 
     } 

     if (buffer) LocalFree(buffer); 
    } 


    if (GetLastError()!=NO_ERROR && 
     GetLastError()!=ERROR_NO_MORE_ITEMS) 
    { 
     // Insert error handling here. 
     return 1; 
    } 

    // Cleanup 
    SetupDiDestroyDeviceInfoList(hDevInfo); 

    return 0; 
} 
+0

sei stato richiesto il riavvio dopo l'esecuzione di questo codice perché sto implemeting questo stesso codice di stato dei dispositivi di cambiamenti nel DM per me, ma mi richiede di riavviare il sistema – bhupinder

risposta

8

avete la parametro errato, è necessario

SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData) 

con un pieno SP_PROPCHANGE_PARAMS in DeviceInfoData.

Vedere this per esempio. (è in cinese, basta leggere il codice è sufficiente)

+0

che ha risolto il problema :) grazie per il vostro aiuto . Sono anche riuscito ad abilitare il dispositivo con lo stesso codice e DICS_ENABLE nel campo params.StateChange. – axiagame

+0

ha richiesto il riavvio dopo l'esecuzione di questo codice perché sto implementando lo stesso stato di codice dei dispositivi cambia in DM per me ma richiede il riavvio del sistema – bhupinder

+0

No, non è stato. Ma penso che dipenda dal tuo sistema operativo. Personalmente l'ho eseguito solo su Windows 7. – axiagame

0

Hanno usato devcon! Prova this: DevCon disabilitare

Problemi correlati