Brauche Hilfe mit WMI ( Temperature ) + Frage zu I2C-Protokoll und DMTF...



  • Tag'chen,
    also ich habe jetzt die WMI vollständig initialisiert und bin auch connected. Nun aber weiß ich nicht wirklich weiter wie ich jetzt an meine CPU- und Grakatemperatur rankomme?
    In der MSDN ist ja auch nen Beispiel dem ich auch gefolgt bin, halt bis zum Aufruf eines WMI Objektes. ( http://msdn.microsoft.com/en-us/library/aa390418(VS.85).aspx )
    Ich verstehe diesen Quering und enumerating Abschnitt nicht, muss man das irgendwie immer machen bevor man Daten von einem Objekt auslesen kann?

    Wär sehr dankbar über eure Hilfe.

    Gruß Tobi.



  • Also ich denke ich habs jetzt erst mal soweit zum laufen gebracht, allerding liefert der Aufruf
    hRes = wEnumerator->Next( WBEM_INFINITE, 1, &wCObj, &uReturn );
    immer nur WBEM_S_FALSE ( The number of objects returned was less than the number requested. WBEM_S_FALSE is also returned when this method is called with a value of 0 for the uCount parameter. ) zurück. Hm heißt das etwa meine Hardware unterstützt WMI nicht? bzw. für Win32_Process funktioniert das alles auch fuer meinen Prozessor funktioniert das. HMmm...
    Kann mir da wer weiter helfen?

    Gruß Tobi.



  • Nein, WBEM_S_FALSE heißt eigentlich nur, daß keine weitere Einträge mehr vorhanden sind als die bereits in Variable &uReturn übermittelte Anzahl.

    D.h. Du mußt zusätzlich den Inhalt uReturn auf >= 1 checken.
    Und wenn als Rückgabewert WBEM_S_FALSE kommt, sollst Du die Methode Next() nicht mehr nochmal aufrufen.

    Hier mal ein exemplarisches Beispiel:

    #define NUI32_ANZAHL_ENUM 8
    uint32 idx;
    HRESULT hresult;
    IEnumWbemClassObject* pIEnumWbemClassObject;
    IWbemServices* pIWbemServices;
    IWbemClassObject* pIWbemClassObject[NUI32_ANZAHL_ENUM];
    
    pIEnumWbemClassObject = NULL;
    hresult = pIWbemServices->CreateInstanceEnum( _bstr_t( "Win32_SerialPort" ),
                                                  WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &pIEnumWbemClassObject );
    if ( SUCCEEDED( hresult ) )
    {
      //Enumerate all serial ports.
      do
      {
        for ( idx = 0; idx < NUI32_ANZAHL_ENUM; idx++ )
        {
          pIWbemClassObject[idx] = NULL;
        }
        hresult = pIEnumWbemClassObject->Next( WBEM_INFINITE, NUI32_ANZAHL_ENUM,
                                               (IWbemClassObject**)(pIWbemClassObject), &ul_result );
        if ( SUCCEEDED( hresult ) )
        {
          for ( idx = 0; idx < ul_result; i++ )
          {
            //Hier Auswertung der enumerierten Objekte in pIWbemClassObject[idx].
            //Achtung! Inhalt von hresult darf hier nicht verändert werden, stattdessen eigene lokale Variable verwenden!
          }
        }
        for ( idx = 0; idx < NUI32_ANZAHL_ENUM; idx++ )
        {
          if ( pIWbemClassObject[idx] != NULL )
          {
            pIWbemClassObject[idx]->Release();      //Speicher freigeben.
          }
        }
      } while ( hresult == WBEM_S_NO_ERROR );
    }
    if ( pIEnumWbemClassObject != NULL )
    {
      pIEnumWbemClassObject->Release();          //Speicher freigeben.
    }
    

    In meinem Beispiel habe ich pro Next()-Aufruf 8 Objekte auf einmal angefordert.

    Übrigens, verwende für COM-Rückgabewerte (und dazu zählen auch WMI-Funktionen) am besten die Makros SUCCEEDED() und FAILED().

    HTH,
    Martin



  • Beachte, dass die wenigsten Hauptplatinienhersteller die WMI-Schnittstelle für die TemperaturProbe implementieren...

    Um mal schnell die WMI-Dinge anzuschauen siehe:
    http://blog.kalmbachnet.de/?postid=29



  • Hm @Jochen, das würde ja heißen ich komm also nicht via' WMI an die Temperatur meiner Graka und der CPU? Sondern nur wenn ich mir irgendwie einen Treiber basteln würde( was ich aber nicht machen werde ) ?

    Aber Everest, liest ja auch irgendwie die Temperatur aus. Gehts also noch irgendwie anders?

    Gruß Tobi.



  • Aber Everest, liest ja auch irgendwie die Temperatur aus.

    Everest nutzt einen eigenen Treiber



  • Hmmm,
    also habe ich keine Möglichkeit auf meine CPU- und Grakasensoren zu zugreifen?



  • Die meisten Programme verwenden dafür das "proprietäre" I2C Protokoll... und haben eben für *jeden* Chipsatz den passenden Befehlssatz implementiert... ist also ziemlich Aufwendig...



  • Die verwenden was?
    Haste evtl. nen paar gute links für mich? Was soll ich unter aufwendig verstehen?





  • Ok, werds mir erstmal ansehen, danke.

    Gruß Tobi.



  • Also eine Frage drängt sich mir hier doch gleich noch auf, die unten stehenden Links, auf der Seite von deinem ersaten Link, soll doch ne Doku sein oder? Dort werden doch irgendwie Methoden und Structuren beschrieben, das is aber irgendwie kein C++ sondern eher Asm oder?



  • Also ich habe mir das jetzt mal durchgelesen und ein wenig gegoogelt und muss festellen das die Informationen teilweise ziemlich mager sind. Aber, wenn ich das jetzt richtig verstanden habe, sind DMFT, DMI und CIM irgendwie sowas wie Schnittstellen? oder sowas um Hardware informationen auszulesen. Dazu muss man irgendwie den Einstigspunkt einer Structur finden und sie dann Bitweise durch gehen?! Versteh das ganze nicht richtig, heißt das also, das man sich bei den Hardware Konzernen geeinigt hat irgendwie bzw. irgendwo eine Schnittstelle zu schaffen die dann entweder DMFT, DMI oder CIM spezifisch ist? Und deswegen sollte man ins Handbuch schauen, ob sich evtl. ein Verweis dazu findet?
    Ich glaub nicht das ich das richtig erfasst habe, es wäre also nett, wenn es mir evtl. jemand erklären könnte.

    Gruß Tobi.



  • Hi Tobi,

    es ist wichtig zu wissen, von welchen Schnittstellen hier die Rede ist.
    Wenn in einem Windows- oder einem C++-Forum von einer Schnittstelle geredet wird, dann handelt es sich meistens um eine Software-Schnittstelle (den sog. "Interfaces"). Als Beispiele nenne ich COM, ActiveX, DirectX und eben auch WMI.

    Es gibt aber auch Hardware-Schnittstellen wie z.B. I2C- oder SMB-Bus, es gibt natürlich unzählige weitere wie z.B. Microwire. Das sind solche, bei denen die Bedeutungen der elektrischen Signale sowie ihrer Dateninhalte (also i.d.R. ein Protokollformat) definiert sind.

    Ich bin beruflich schwerpunktmäßig in der embedded-Welt (Microcontroller) zuhause, deshalb habe ich zwangsläufig (fast täglich) mit I2C- und Microwire-Bussen zu tun.
    Diese beiden Busse sind innerhalb der Hardware-Welt weitverbreitete "Standards", jedoch aus der Sicht eines Windows-Programmierers sind sie "proprietäre Exoten".
    Ist ja auch einleuchtend, da ein "normaler" Windows-Programmierer normalerweise nicht so tief in die untersten PC-Hardware Schichten herabsteigt. Ganz zu schweigen, es fehlen Windows einfach die offiziell dokumentierten API-Funktionen dazu (unabhängig davon, das wären eher BIOS-Funktionen als Windows-Funktionen).

    Genug gelabert, nun zu Deiner eigentlichen Frage:
    I2C (oder IIC, manchmal auch als TWI zu lesen) steht für "Inter-IC-Communication" und ist eine Zweidraht-Verbindung vornehmlich zwischen mehreren ICs, z.B. EEPROMs, RTC, Watchdogs und eben auch Temperatursensoren. Der Halbleiterhersteller Philips (jetzt heißt sie NXP) hatte dieses Protokoll erfunden.

    Eckdaten: Multi-Master fähig, arbeitet mit 5V (oder auch 3,3V), hat eine Taktfrequenz von 100kHz, 400kHz oder 1MHz (je nach Spezifikation, die Standardfrequenz 100kHz müssen alle I2C-ICs können). Die beiden Leitungen heißen SCL (serial clock) und SDA (serial data).

    Falls es Dich interessiert, wie ein Temperatursensor (es gibt viele verschiedene auf dem Markt) per I2C angesprochen wird, hier ein Datenblatt zu LM75 von National Semiconductor: http://www.national.com/ds.cgi/LM/LM75.pdf
    Allerdings wird das Datenblatt für einen gewöhnlichen Windows-Programmierer höchstwahrscheinlich ein "Buch mit 7 Siegeln" sein, da ihm i.d.R. die Hardware- und Schaltungstechnik-Grundlagen und natürlich auch die Erfahrung fehlen.

    Martin



  • Ok, also habe ich doch irgendwie richtig gelegen, das die meiste Hardware dieses I2C-Protokoll nutzt und ich es theoretisch via' SMB anzapfen kann?
    Naja ich werd mal sehen ob ich von deinem Link was verstehe und danke erst mal.

    [EDIT]
    Alles klar *Bahnhof*.

    [EDIT2]
    Ich lese gerade noch mal die SMB Spezifikation 2.3.1., da steht, dass SMB einen "entry-point" irgendwo im physischen Speicher( 0x000F0000h - 0x000FFFFFh ) hat. Wie sucht man im physischen Speicher? Mir ist jetzt nur die Suche im Virtuellen Speicher bekannt.

    Gruß Tobi.



  • T0bi schrieb:

    Ich lese gerade noch mal die SMB Spezifikation 2.3.1., da steht, dass SMB einen "entry-point" irgendwo im physischen Speicher( 0x000F0000h - 0x000FFFFFh ) hat. Wie sucht man im physischen Speicher? Mir ist jetzt nur die Suche im Virtuellen Speicher bekannt.

    Mein Bauch sagt mir grad, Du liest vermutlich die Spezifikation von SMB für LAN/Ethernet.

    Was Du an Informationen brauchst ist SMB = System Management Bus (von Intel), welches auf I2C-Bus aufbaut.

    Habe ich richtig geraten? 🕶
    Martin

    [Nachtrag:] Siehe auch http://de.wikipedia.org/wiki/System_Management_Bus



  • Hi Martin,
    weiß nicht, aber ich dachte das hier http://www.dmtf.org/standards/documents/SMBIOS/DSP0119.pdf sei das richtige?



  • Das ist schon auf dem richtigen Gebiet.

    SMBIOS ist ein Standard-Interface (also Software-Schnittstelle 😉 ) zum System Management Bus (also Hardware-Schnittstelle 😋 ) auf dem Mainboard.

    Mit SMBIOS selbst habe ich noch nie was zu tun gehabt.
    Du kannst es ja mal mit den WMI-Klassen "Win32_SMBIOSMemory" und "MSSMBios_RawSMBiosTables" versuchen.

    SMBIOS Support in Windows: http://download.microsoft.com/download/5/D/6/5D6EAF2B-7DDF-476B-93DC-7CF0072878E6/SMBIOS.doc
    SMBIOS Peek: http://www.codeproject.com/KB/system/SMBIOS_Peek.aspx
    SMBIOS Demystified: http://www.codeguru.com/cpp/misc/samples/systeminformation/article.php/c12347/

    Martin



  • Also gibt es bei SMBIOS nicht einfach Methoden die ich in C++ nutzen kann wie bei WMI?

    [EDIT]
    Win32_SMBIOSMemory geht nicht. Zeigt nichts an.



  • T0bi schrieb:

    Win32_SMBIOSMemory geht nicht. Zeigt nichts an.

    Evtl. brauchst Du Admin-Rechte?
    Bei Vista brauchst Du evtl. zusätzlich elevated Admin Account?
    Andererseits kann es schlicht und einfach daran liegen, daß der Mainboardhersteller gar keine WMI-Schnittstelle bereitgestellt hat?

    Als Faustregel sagt meine Erfahrung: Enumerierung von WMI-Objekte im Hardwarebereich (und dazu zählt für mich auch SMBIOS) ist Glücksspiel!
    D.h. bei manchen Herstellern funktionierts, bei anderen gehts nicht!

    Beispiel: Die USB-to-serial Konverter von FTDIchip und Prolific lassen sich überhaupt nicht über die WMI-Klasse "Win32_SerialPort" identifizieren, sondern nur über SetupAPI-Funktionen 😡 .

    Martin


Log in to reply