2012-09-13 24 views
7

私のプログラムでは、以下の関数がHardwareId idというデバイスを見つけて、それをオフ/オンにするという単純な関数に問題があります。それが見つかりましたが、エラーが発生しました。GetLastError()は、msdnの範囲外の値を返します。私はコメントでコードに誤りをマークしました。これを見ている人なら誰でもに詳しいです。SetupDiCallClassInstaller()助けてください。私は、そのエラーを検索する場所と、それがコードフォールトかシステムenvかどうかわからない。私はWindows 7 64ビットを使用していて、このプログラムを管理者として実行しています。デバイスを無効にする

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; 
} 

ありがとうございました。

+0

エラーコードは何ですか? (Doh!) – atzz

+0

そして 'FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM、...)'のメッセージは何ですか? – MSalters

+0

正しく使用した場合、「(null)off」が返され、エラーコード番号は3758096949であり、それを見つけられませんでした.D – user1668674

答えて

13

エラーのHEXバージョンは0xE0000235です。 SetupAPI.hを見ると、これはERROR_IN_WOW64にマップされていることがわかります。

this MSDN threadを見ると、この問題の他の人が見えます。 1/3ページマールテン・デ・バンBospoort MSFT応答ダウンの方法のこのと:

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

これが問題の原因であるように、あなたがWindowsの64ビット版にしているようです、 32ビットプロセスから呼び出しています。 64ビットコンパイルを試してください。

+0

これは役に立ちました。私は64ビット(それは型キャストのコードにほとんど変更はありません)としてコンパイルし、うまくいきました。どうもありがとう! – user1668674

+0

このコードを実行した後に再起動が必要でしたか?私はDMのデバイスの変更と同じコードステータスを実装していますが、システムを再起動する必要があります – bhupinder

関連する問題