Netzwerkkarte auf 10MBit stellen

Gast #1626470
Lesenswert?

Ich möchte die Netzwerkkarte im PC per software zwischen 10 und 100 MBit 
umstellen können (Windows XP). In der Systemsteuerung kann ich das ohne 
Probleme vornehmen (Eigenschaften der Netzwerkkarte und dann 
Erweitert...).

Aber ist sowas auch software-technisch möglich? Ist schon eine etwas 
speziellere Frage, zu der ich auch per googel noch nichts gefunden habe.
#1626537
Lesenswert?

Rufus t. Firefly schrieb:
...
>
> Wozu braucht man das?

Das ist ganz einfach:

Wenn man eh schon weiß, dass die Leitung nur 10MBit/s hergibt, so kann 
man dadurch den "Intelligenzbolzen" unter den Netzteilnehmern 
untersagen, dass sie andauernd versuchen untereinander eine schnellere 
Verbindung auszuhandeln. Das kostet nämlich mehr Zeit als durch die 
feste Datenrate verloren geht. Eventuell kommt sogar überhaupt keine 
Verbindung zustande.
Gast #1626742
Lesenswert?

Selbstverständlich kann man das machen. Wo stehen denn solche Daten?
In der Registry natürlich! Und die kann man ja per WIN-API verändern.

Du machst folgendes:

Geh in den Gerätemanager auf Deine Netzwerkkarteneigenschaften und dann 
unter "Details" auf "Passende Geräteerkennung". Da steht eine ID in der 
Forum "PCI\ven......".

Jetzt suchst Du per regedit in der Registry im Schlüssel 
"HKLM\SYSTEM\CurrentControlSet\Control\Class" nach dieser ID.

Im selben Schlüssel, wo diese ID auftaucht, müsste auch ein Wert mit dem 
Namen "RequestedMediaType" stehen. Dieser gibt die Geschwindigkeit an.
Welcher Zahlenwert für RequestedMediaType welche Geschwindigkeit 
bedeutet, kannst Du herausfinden, indem Du im Gerätemanager die 
Geschwindigkeit einstellst und dann in der Registry nachschaust.

Jetzt kennst Du den Schlüssel und den Wert. Voila.
Gast #1626786
Lesenswert?

Rufus t. Firefly schrieb:
> Die Frage ist dann natürlich noch, wann dieser Wert ausgewertet wird.

ich denke nach menueller änderung in der Reg muss man ein Event 
rumschicken das sich die Konfig geändert hat.
Gast #1632898
Lesenswert?

Marcus Müller schrieb:
> Nö, fast alle Netzwerksettings in der Registry sind erst nach einem
> Reboot aktiv.

da man auch die Geschwindigkeit im Gerätemanager einstellen kann geht es 
scheinbar auch im Betrieb. Für sotwas gibt es ja extra Events damit die 
Software die geänderten werte ausesen kann. (weiss jetzt aber nicht ob 
es in diesem Fall geht)
Gast #1637142
Lesenswert?

So, ich hab jetzt auch nochmal ein wenig rumprobiert.

Siehe C-Code unten. Damit kann man die Registrysettings neu einlesen 
lassen. Oder ein Gerät aktivieren oder deaktivieren (so wie im 
Gerätemanager).

Die Zeichenkette für die Geräteinstanz (device_instance_id) bekommt man 
im Gerätemanager unter Details -> Geräteinstanzerkennung.

Um das Gerät zu aktivieren/deaktivieren, muss man 
PropChangeParam.StateChange auf DICS_ENABLE bzw. DICS_DISABLE 
setzen.

Auf die Überprüfung von Rückgabewerten habe ich jetzt mal verzichtet, 
und es fehlt auch das Setzen der eigentlichen Registrywerte. Das bleibt 
dem Leser als Übung überlassen.

1
#include <windows.h>
2
#include <setupapi.h>
3
#include <cfgmgr32.h>
4

5
int main(int argc, char* argv[])
6
{
7
  // Zeichenkette aus Gerätemananger (Details\Geräteinstanzerkennung)
8
  char device_instance_id[] = "BLABLABLABLA";
9
  
10
  DWORD device_instance;
11

12
  // device_instance holen
13
  CM_Locate_DevNode(&device_instance,device_instance_id,CM_LOCATE_DEVNODE_NORMAL);  
14
   
15
  HDEVINFO HDevInfo = SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES);
16

17
  SP_DEVINFO_DATA DeviceInfoData;
18
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
19

20
  // über alle Geräte iterieren und nach Gerät suchen
21
  for(size_t n=0; SetupDiEnumDeviceInfo(HDevInfo,n,&DeviceInfoData); n++)
22
  {      
23
    if(DeviceInfoData.DevInst == device_instance) break;     
24
  }
25

26
  SP_PROPCHANGE_PARAMS PropChangeParam;
27

28
  PropChangeParam.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
29
  PropChangeParam.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
30
  PropChangeParam.StateChange = DICS_PROPCHANGE;
31
  PropChangeParam.Scope = DICS_FLAG_GLOBAL;
32
  PropChangeParam.HwProfile = 0;
33

34
  // Installationsparameter setzen und Installer aufrufen
35
  SetupDiSetClassInstallParams(HDevInfo,&DeviceInfoData,(SP_CLASSINSTALL_HEADER*)&PropChangeParam,sizeof(PropChangeParam));
36
  SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,HDevInfo,&DeviceInfoData);
37

38
  return 0;
39
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren