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.
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?
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
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.
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?
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.
Die Frage ist dann natürlich noch, wann dieser Wert ausgewertet wird.
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.
Nö, fast alle Netzwerksettings in der Registry sind erst nach einem Reboot aktiv. Gruß, Marcus
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)
Üblicherweise öffnet man dem Treiber und schickt ihm ein DeviceIOControl(...). Welches, dafür gibt es evtl. Schnüffelprogramme.
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.