Ram Größe aus der Registry dekodieren

Diskutiere Ram Größe aus der Registry dekodieren im Developer Network Forum im Bereich Hardware & Software Forum; Ich schreibe gerade an einem Tool das über das Netzwerk verschiedene Daten ausliest. Darunter soll auch die Ram Größe sein. WMI scheidet aus, da...
  • Ram Größe aus der Registry dekodieren Beitrag #1
T

TheManiac

Bekanntes Mitglied
Dabei seit
17.01.2000
Beiträge
343
Reaktionspunkte
0
Ich schreibe gerade an einem Tool das über das Netzwerk verschiedene Daten ausliest. Darunter soll auch die Ram Größe sein.

WMI scheidet aus, da es auch NT4 Rechner auslesen soll und auf den PCs dazu nichts nachinstalliert werden darf.

Deswegen wollte ich mir aus der Registry die Ram Größe auslesen, diese steht unter
HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\System Resources\Physical
Memory

Das Problem dabei ist nur das der Wert verschlüsselt ist. Im Netz finden sich nur VB Lösungen dafür. Da ich in VB aber nicht sonderlich gut bin verstehe ich nicht genau wie die Daten dekodiert werden.

Kann mir jemand kurz erklären wie es funktioniert oder vielleicht habt ihr noch irgendwo einen fertigen C Sourcecode liegen den ihr mir zu Verfügung stellen könntet.

Danke
Maniac
 
  • Ram Größe aus der Registry dekodieren Beitrag #2
N

NixRealFromm

Bekanntes Mitglied
Dabei seit
24.10.2001
Beiträge
424
Reaktionspunkte
0
Ort
hmpf!!! Nordpol
oder du postest ein VB Beispiel und wir machen dir daraus nen C Code ;)
 
  • Ram Größe aus der Registry dekodieren Beitrag #3
C

COGE

Bekanntes Mitglied
Dabei seit
13.01.1999
Beiträge
6.151
Reaktionspunkte
3
Ort
hinten wie von vorne
steht alles in der MSDN:

Code:
#include "stdafx.h"

#include <windows.h>

// Use to change the divisor from Kb to Mb.

#define DIV 1024
// #define DIV 1

char *divisor = "K";
// char *divisor = "";

// Handle the width of the field in which to print numbers this way to
// make changes easier. The asterisk in the print format specifier
// "%*ld" takes an int from the argument list, and uses it to pad and
// right-justify the number being formatted.
#define WIDTH 7

void main(int argc, char *argv[])
{
  MEMORYSTATUS stat;

  GlobalMemoryStatus (&stat);

  printf ("The MemoryStatus structure is %ld bytes long.\n",
          stat.dwLength);
  printf ("It should be %d.\n", sizeof (stat));
  printf ("%ld percent of memory is in use.\n",
          stat.dwMemoryLoad);
  printf ("There are %*ld total %sbytes of physical memory.\n",
          WIDTH, stat.dwTotalPhys/DIV, divisor);
/*
  printf ("There are %*ld free %sbytes of physical memory.\n",
          WIDTH, stat.dwAvailPhys/DIV, divisor);
  printf ("There are %*ld total %sbytes of paging file.\n",
          WIDTH, stat.dwTotalPageFile/DIV, divisor);
  printf ("There are %*ld free %sbytes of paging file.\n",
          WIDTH, stat.dwAvailPageFile/DIV, divisor);
  printf ("There are %*lx total %sbytes of virtual memory.\n",
          WIDTH, stat.dwTotalVirtual/DIV, divisor);
  printf ("There are %*lx free %sbytes of virtual memory.\n",
          WIDTH, stat.dwAvailVirtual/DIV, divisor);
*/

}

Fragt mich nciht, welche header ich davon wirklich brauche. Copy-paste und läuft
 
  • Ram Größe aus der Registry dekodieren Beitrag #4
T

TheManiac

Bekanntes Mitglied
Dabei seit
17.01.2000
Beiträge
343
Reaktionspunkte
0
@COGE: Das funktioniert leider nur lokal, für mein Programm ist es wichtig die Daten übers Netzwerk auszulesen.
Hintergrund der Sache ist es eine Datenbank aufzubauen in der alle Rechner stehen mit Software und Hardware. Eine Liste mit Rechnernamen gibt es über diese die einzelnen Rechner abgefragt werden können.

Ich habe jetzt mit ausprobieren rausbekommen wie die Werte dort gespeichert sind.
Man nimmt das letzte Byte und multipliziert es mit 16, dann nimmt man das vorletzte Byte und multipliziert es mit (16/255). Danach geht man 16Byte zurück und macht nochmal genau das gleiche. Danach wieder 16Byte zurück und nochmal das ganze.
Zum Schluss addiert man die 6 Werte und bekommt die Ram Größe in MB.


Soweit so gut, leider bekomme ich es nicht hin, den Schlüssel aus der Registry auszulesen. Bei DWORD oder Zeichenketten klappt das ohne Probleme, dies ist nur ein "REG_RESOURCE_LIST".

Mit folgendem Code habe ich probiert es auszulesen.

Code:
#include <windows.h>
#include <stdio.h>
#include <string.h>


int main(void)
{
	HKEY hKey;
	HKEY hKey2;
	DWORD dwType;
	DWORD dwSize=200;
	char strRamSize[200];
	RegConnectRegistry("localhost",HKEY_LOCAL_MACHINE,&hKey);
    printf("%d\n",RegOpenKeyEx(hKey,"HARDWARE\\RESOURCEMAP\\System Resources\\Physical Memory",0,KEY_READ,&hKey2));
	printf("%d\n",RegQueryValueEx(hKey2,".Translated",NULL,&dwType,strRamSize,&dwSize));
	printf ("\n%s",dwRamSize);
	
	return 0;

Was wie gesagt bei Zeichenketten ohne Probleme funktioniert und bei DWORD wenn ich das Ergebnis in ein DWORD schreibe und die Ausgabe auf DWORD caste.
 
  • Ram Größe aus der Registry dekodieren Beitrag #6
T

TheManiac

Bekanntes Mitglied
Dabei seit
17.01.2000
Beiträge
343
Reaktionspunkte
0
Bin einen kleinen Schritt weiter gekommen.
Und zwar kann ich mittlerweile die ersten 4 Byte auslesen, das Problem dabei ist ich bräuchte ca 60 Byte.

Mit folgendem Code lese ich die ersten 4 Byte aus:

Code:
#include <windows.h>
#include <stdio.h>
#include <string.h>


int main(void)
{
	HKEY hKey;
	HKEY hKey2;
	DWORD dwType;
	DWORD dwSize=100;
	DWORD strRamSize;
	RegConnectRegistry("\\\\pc1",HKEY_LOCAL_MACHINE,&hKey);
    printf("%d\n",RegOpenKeyEx(hKey,"HARDWARE\\RESOURCEMAP\\System Resources\\Physical Memory",0,KEY_READ,&hKey2));
	printf("%d\n",RegQueryValueEx(hKey2,".Translated",NULL,&dwType,(LPSTR)&strRamSize,&dwSize));
	printf ("\n%02x",strRamSize);
	
	
	
	return 0;
}
 
Thema:

Ram Größe aus der Registry dekodieren

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben