2012-03-29 3 views
2

Ich weiß, wie Sie die Setup-API zum Aktivieren und Deaktivieren von Geräten verwenden. Was ich wissen muss ist, kann ich die gleiche API verwenden, um festzustellen, ob ein Gerät aktiviert/deaktiviert ist? Ich denke, die wirkliche Frage ist, wie man es so verwendet, weil Microsoft Devcon die Setup-API für die Manipulation von Hardware verwendet und das Programm Ihnen sagen wird, ob ein Gerät aktiviert oder deaktiviert ist (wie der Geräte-Manager). Wie wird das gemacht? Meine Untersuchung der Setup-API-Methoden zu diesem Punkt zeigt keine eindeutige Antwort.Kann die Setup-API verwendet werden, um festzustellen, ob ein Gerät aktiviert ist

Andy

Antwort

4

Diese API von MS hat bekam den am wenigsten verwendet werden, verstanden und schlimmsten dokumentiert. Wie ich in meinem ursprünglichen Beitrag erwähnt habe, kann die Setup-API zum Aktivieren/Deaktivieren von Hardware verwendet werden. Also dachte ich mir, ich würde mir ein paar Minuten Zeit nehmen und der Community mitteilen, wie ich schließlich herausgefunden habe, wie man den Hardware-Status überprüft.

Also, die kurze Antwort: Sie tun dies nicht von der Setup-API. Das macht natürlich Sinn. Schließlich können Sie den Gerätezustand, d. H. Aktivieren oder deaktivieren, mithilfe der Setup-API ändern. Daraus folgt natürlich, dass Sie eine völlig andere API verwenden müssen, um den aktuellen Status des Geräts zu bestimmen. Geben Sie nun die Configuration Manager 32-API ein. Um die Hardware zu aktivieren/deaktivieren, müssen Sie die Setup-API verwenden, aber um herauszufinden, in welchem ​​Zustand sich die Hardware befindet, müssen Sie die API ConfigMgr 32 (#include cfgmgr32.h) verwenden. Macht Sinn, oder?

Es kann andere Wege geben, dies zu tun, aber hier ist, was ich getan habe.

#include <Windows.h> 
#include <cstdlib> 
#include <setupapi.h> 
#include <cfgmgr32.h> 

GUID driveGuid = {0x4d36e967, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}; 

// first, get a list of hardware you're interested in using Setup API 
HDEVINFO hDevs(SetupDiGetClassDevs(&driveGuid, NULL, NULL, DIGCF_PRESENT)); 
if(INVALID_HANDLE_VALUE == hDevs) 
{ 
    throw std::runtime_error("unable to build a list of hardware"); 
} 

// this struct has the dev instance ID that the CFG MGR API wants. The struct must be 
// must be inited to the size of the struct, the cbSize member, all others should be 0 
SP_DEVINFO_DATA devInfo = {sizeof(SP_DEVINFO_DATA)}; 
DWORD index(0); 
LONG devStatus(0), devProblemCode(0); 
char devId[256]; 
memset(devId, 0, 256) 
while(SetupDiEnumDeviceInfo(hDevs, index++, &devInfo)) 
{ 
    // use Config Mgr to get a nice string to compare against 
    CM_Get_Device_ID(devInfo.DevInst, devId, 256, 0); 

    // use whatever mechanism you like to search the string to find out 
    // if it's the hardware you're after 
    if((std::string(devId)).find("MyHardware") != std::string::npos) 
    { 
     // goody, it's the hardware we're looking for 
     CM_Get_DevNode_Status(&devStatus, &devProblemCode, devInfo.DevInst, 0); 

     // if the call to getting the status code was successful, do something 
     // meaningful with the data returned. The fun part of this is that the 
     // return codes aren't really documented on MSDN. You'll have to look 
     // through the CfgMgr32.h file. Incidentally, these values are what 
     // are shown in the Device Manager when you look at the device's status. 
    } 
} 

SetupDiDestroyDeviceInfoList(hDevs); 

Sie werden die GUID für die Hardware herauszufinden, müssen Sie nach, indem Sie durch die Liste der Suche here gefunden. Einige davon sind in verschiedenen Windows-Headern vordefiniert. Zu diesem Zeitpunkt kenne ich nur sehr wenige und bin nur zufällig auf sie gestoßen.

Relevante Links zu den oben genannten Funktionen verwendet: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA

Ich hoffe, das jemand hilft.

+0

Welche Flags verwenden Sie, um "aktiviert" und "deaktiviert" zu bestimmen? Ist 'DN_STARTED' ausreichend? – AlexS

+0

Es ist schon eine Weile her, dass ich damit gearbeitet habe (2012). Eine schnelle Überprüfung der Header-Datei (cfg.h) und des Speichers zeigt an, dass DN_STARTED für "enabled" oder "disabled" ausreichen sollte. In Wirklichkeit bedeutet in diesem Zusammenhang "aktiviert" einfach, dass der Treiber für dieses Gerät gestartet wird: "deaktiviert" bedeutet, dass dies nicht der Fall ist. –

Verwandte Themen