Forum: PC-Programmierung Netzwerkkarte auf 10MBit stellen


von Lupin (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist eine Konfigurationseinstellung des Netzwerkkartentreibers. Ob 
der eine programmatisch bedienbare Schnittstelle bietet, um das 
umzukonfigurieren, wird nur der Hersteller des Treibers wissen.

Wozu braucht man das?

von Mathias H. (mathew)


Lesenswert?

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

Lupin schrieb:
> In der Systemsteuerung kann ich das ohne
>
> Probleme vornehmen

vorallem dann wenns eh schon geht

von Gerry E. (micky01)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Darum ging es mir nicht; den Sinn des Abschaltens der "auto negotiation" 
kenne ich.

Warum aber will man das programmatisch anstellen, also ohne den Weg über 
den Gerätemanager?

von Xenu (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Frage ist dann natürlich noch, wann dieser Wert ausgewertet wird.

von Peter (Gast)


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.

von Marcus M. (marcus67)


Lesenswert?

Nö, fast alle Netzwerksettings in der Registry sind erst nach einem 
Reboot aktiv.

Gruß, Marcus

von Peter (Gast)


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)

von User (Gast)


Lesenswert?

Üblicherweise öffnet man dem Treiber und schickt ihm ein 
DeviceIOControl(...). Welches, dafür gibt es evtl. Schnüffelprogramme.

von Xenu (Gast)


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
}

von Xenu (Gast)


Lesenswert?

Kleiner Nachtrag:

Nicht bei allen Netzwerkkarten heißt der Registryschlüssel 
"RequestedMediaType". Bei meiner Intel-Karte heißt er "SpeedDuplex".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.