2012-09-13 18 views
7

Ho un problema con una semplice funzione nel mio programma, quella funzione (elencata sotto) dovrebbe trovare il dispositivo con ID hardware id e quindi spegnerlo/accenderlo. Lo trova ma poi ottengo l'errore e GetLastError() restituisce il valore fuori descritto in msdn. Ho contrassegnato l'errore nel codice con un commento. Se qualcuno vede questo è familiare con SetupDiCallClassInstaller() per favore aiuto. Non so dove cercare quell'errore e se è un errore di codice o di sistema. Sto usando Windows 7 a 64 bit ed eseguo questo programma come amministratore.Disabilitato dispositivo

bool DisableInterface(bool bStatus) { 
IN LPTSTR HardwareId;  
HardwareId = L"DAUDIO\\FUNC_01&VEN_10DE&DEV_0018&SUBSYS_10DE0101"; 

DWORD NewState ; 

if(bStatus) { 
    NewState = DICS_DISABLE; 
} 
else { 
    NewState = DICS_ENABLE; 
} 


DWORD i, err; 
bool found = false; 

HDEVINFO hDevInfo; 
SP_DEVINFO_DATA spDevInfoData ; 

hDevInfo=SetupDiGetClassDevs(NULL, 0, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); 
if(hDevInfo == INVALID_HANDLE_VALUE) 
{ 
    printf("blad1"); 
    return false; 
} 

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

    // get all devices info 
    while(!SetupDiGetDeviceRegistryProperty(hDevInfo, 
              &spDevInfoData, 
              SPDRP_HARDWAREID, 
              &DataT, 
              (PBYTE)buffer, 
              buffersize, 
              &buffersize)) 
    { 
     if(GetLastError() == ERROR_INVALID_DATA) {  
      break ; 
     } 
     else if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {  
      if(buffer) 
       LocalFree(buffer); 
      buffer = (wchar_t*)LocalAlloc(LPTR,buffersize); 
     } 
     else { 
      goto cleanup_DeviceInfo; 
     } 
    } 

    if(GetLastError() == ERROR_INVALID_DATA) 
     continue; 

    //find device with HardwerId 
    for(p = buffer; *p && (p<&buffer[buffersize]) ; p += lstrlen(p) + sizeof(TCHAR)) { 
     if(!_tcscmp(HardwareId, p)) { 
      found = true; 
      break; 
     } 
    } 

    if(buffer) 
     LocalFree(buffer); 

    // if device found change it's state 
    if(found) 
    { 
     SP_PROPCHANGE_PARAMS params; 

     params.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER); 
     params.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE ; 
     params.Scope=DICS_FLAG_GLOBAL ; 
     params.StateChange = NewState ; 

     // setup proper parameters    
     if(!SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, &params.ClassInstallHeader, sizeof(params))) { 
      DWORD errorcode = GetLastError(); 
     } 

     // use parameters 
     if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData)) { 
      DWORD errorcode = GetLastError(); // error here 
     } 

     switch(NewState) { 
      case DICS_DISABLE : 
       printf("off"); 
       break; 
      case DICS_ENABLE : 
       printf("on"); 
       break; 
     } 

     break; 
    } 

} 

cleanup_DeviceInfo : 
err = GetLastError(); 
SetupDiDestroyDeviceInfoList(hDevInfo); 
SetLastError(err); 

return true; 
} 

Grazie per l'aiuto.

+0

Quindi qual è il codice di errore? (Doh!) – atzz

+0

E qual è il messaggio da 'FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ...)'? – MSalters

+0

Se l'ho usato correttamente, restituisce: "(null) off" e il codice di errore è 3758096949, sry per mancante che ..; D – user1668674

risposta

13

La versione HEX del tuo errore è 0xE0000235. Guardando in SetupAPI.h possiamo vedere che questo mappa per ERROR_IN_WOW64.

Se si guarda su this MSDN thread è possibile vedere altre persone con questo problema. Circa 1/3 del modo in basso nella pagina Maarten van de Bospoort MSFT risponde con questo:

The error is because you’re calling SetupDiCallClassInstaller from a x86 process on a x64 machines. 

Sembra che questo è la causa del problema, siete su una versione a 64 bit di Windows, ma chiamandolo da un processo a 32 bit. Prova a compilare per 64-bit.

+0

Questo ha aiutato. L'ho compilato come 64 bit (con piccole modifiche nel codice per il casting dei tipi) e ha funzionato. Molte grazie! – user1668674

+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

Problemi correlati