Geräte Manager - Treiberdetails



  • Hallo Leute,

    ich möchte ein Programm schreiben das wie beim "Geräte Manager" -> "Treiberdetails" alle dazugehörigen Treiber zu einem Gerät anzeigt und zusammenfasst. Habs schon mit "EnumDeviceDrivers", "GetDeviceDriverBaseName" und "GetDeviceDriverFileName" aber mit geringem Erfolg. Welche Möglichkeiten gibts sonst noch?

    Vielen Dank im Voraus

    mfg. bttn



  • Die Antwort auf deine Frage ist die SetupAPI, insbesondere wirst du hier fündig:
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff541247.aspx
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff553515.aspx

    Da ich gerade unlängst was damit gemacht hab, hier ein Stückchen Code, das Name, Hersteller und Treiberversion aller Grafikkarten und CPUs im System logged:

    #include <memory>
    
    #define INITGUID
    
    #include <win32/handle.h>
    
    #include "Log.h"
    
    #include <SetupAPI.h>
    #include <devguid.h>
    #include <ntddvdeo.h>
    #include <devpkey.h>
    
    namespace
    {
      inline void destroyDeviceInfoList(HDEVINFO info_set)
      {
        SetupDiDestroyDeviceInfoList(info_set);
      }
    
      typedef Win32::handle<HDEVINFO, INVALID_HANDLE_VALUE, destroyDeviceInfoList> device_info_set;
    
      device_info_set openDeviceSetupClass(const GUID* class_guid)
      {
        return device_info_set(SetupDiGetClassDevsW(class_guid, nullptr, 0, DIGCF_PRESENT));
      }
    
      device_info_set openDeviceInterfaceClass(const GUID* class_guid)
      {
        return device_info_set(SetupDiGetClassDevsW(class_guid, nullptr, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT));
      }
    
      template <typename T>
      T getDeviceProperty(HDEVINFO info_set, PSP_DEVINFO_DATA dev_info, const DEVPROPKEY* property);
    
      template <>
      inline std::wstring getDeviceProperty<std::wstring>(HDEVINFO info_set, PSP_DEVINFO_DATA dev_info, const DEVPROPKEY* property)
      {
        DEVPROPTYPE prop_type;
        DWORD buffer_size;
        SetupDiGetDevicePropertyW(info_set, dev_info, property, &prop_type, nullptr, 0, &buffer_size, 0);
        if (prop_type != DEVPROP_TYPE_STRING)
          throw std::runtime_error("incompatible device property type");
        std::unique_ptr<BYTE[]> buffer(new BYTE[buffer_size]);
        SetupDiGetDevicePropertyW(info_set, dev_info, property, &prop_type, &buffer[0], buffer_size, nullptr, 0);
        return reinterpret_cast<wchar_t*>(&buffer[0]);
      }
    
      void logDevices(HDEVINFO info_set, Log& log)
      {
        int i = 0;
        SP_DEVINFO_DATA dev_info;
        dev_info.cbSize = sizeof(dev_info);
    
        while (SetupDiEnumDeviceInfo(info_set, i, &dev_info) != FALSE)
        {
          auto name = getDeviceProperty<std::wstring>(info_set, &dev_info, &DEVPKEY_NAME);
          auto manufacturer = getDeviceProperty<std::wstring>(info_set, &dev_info, &DEVPKEY_Device_Manufacturer);
          auto driver_version = getDeviceProperty<std::wstring>(info_set, &dev_info, &DEVPKEY_Device_DriverVersion);
          ++i;
        }
      }
    }
    
    void logSystemInformation(Log& log)
    {
      auto cpu_info_set = openDeviceSetupClass(&GUID_DEVCLASS_PROCESSOR);
      logDevices(cpu_info_set, log);
    
      auto gpu_info_set = openDeviceInterfaceClass(&GUID_DEVINTERFACE_DISPLAY_ADAPTER);
      logDevices(gpu_info_set, log);
    }
    


  • Danke für die schnelle Hilfe,

    hätte da nur noch eine Frage. Wie kann ich den Dateinamen des Treiber herausfinden? Hab schon die ganzen "#define"*s in "devpkey.h" ausprobiert - leider ohne Erfolg.

    vielen Dank im Voraus

    mfg. bttn



  • Du kannst zumindest über DEVPKEY_Device_Driver den Driver Key in der Registry ausfindig machen (HKLM\SYSTEM\CurrentControlSet\Control\Class\Wert von DEVPKEY_Device_Driver) und dort drin dann nachschauen.



  • Hallo Leute,

    mit der Funktion SetupDiGetDeviceProperty kann ich den Geträtenamen auslesen und mit der Funktion GetDeviceDriverFileName den Dateinamen. Ist es möglich die Funktionen zu kombinieren.

    Nach dem Aufruf von SetupDiGetDeviceProperty mit DEVPKEY_Device_PDOName erhalte ich "\Device\00000079". Was kann ich mit dieser Nummer anfangen. Die Nummer stimmt nämlich nicht mit dem Ergebnis von GetDeviceDriverFileName überein.

    vielen Dank im Voraus.

    mfg. bttn



  • Hai, schau hier rein, vieleicht findest was hilfreiches:
    http://www.codeproject.com/Articles/14469/Simple-Device-Manager


Anmelden zum Antworten