Win2000 Registry im IDE-Bereich: übersetzung hex/dword erbeten. Betrifft UDMA <-> PIO bug

IVAN_C64

Vice Admiral Special
Mitglied seit
01.12.2005
Beiträge
827
Renomée
16
Standort
Hamburg
1.) Vorwort:

Es betrifft zwar alle Microsoft BSe ab Win2000 aufwärts (Vista noch unbekannt) aber für die Aufgabe erschien mir ein Programmierer (evtl. HWmäßig, Treiber-Programmierer) besser. Mods, ansonsten vma. verschieben.

Im groben geht es darum dem BS über manipulation der Registry, die Transfermodis der IDE-Kanäle manuell aufzuzwingen. Sogar gezielt für angeschlossene Geräte! Dies wurde ja allg. wegen plug&pray etc. für unmöglich gehalten.

Theoretisch gehts vllt. doch, nur muss man da Kenntnisse haben in denen ich bescheiden ausgestattet bin... ;)



2.) Problemauslöser & Hintergrundgeschichte:

Zunächst geht das in die allg. Richtung, das ein IDE-Gerät vom BS nicht richtig erkannt wird und dabei zb. sein UDMA nicht fehlerfrei entfalten kann, oder PIO plötzlich zwang ist und scheinbar kein Weg zurück zu UDMA führt oder den gesamten IDE-Bus in grütze reisst usw.

Spezieller, der zb. 6 cycle PIO bug von Microsoft... KB817472 de (Pflichtlesestoff) kurzer abriss: nach insg.(!) 6 lese/crc/sonstige Fehlern in einem unbestimmten Zeitraum (konnte nur teils gefixt werden) wird das angeschlossene Gerät von Windows schrittweise bis auf PIO runter geschaltet und bleibt es auch... uU. sogar "unsichtbar"!
Besonders verhängnisvoll bei zb. DVD Laufwerke (häufig zusammen mit Brenner) auf dem Secondery IDE Channel wo es dann nicht sofort auffallen muss, vonwegen spürbarem Performance-Verlust. Auch schön der im KB-Artikel eigentlich behandelte Standby-Auslöser.

Auslöser kann es also mehrere geben. Hier mal eine nette Site wo die Thematik gebündelt & ausführlicher beleuchtet wird -> DMA fällt zurück auf PIO. Von Bios über IDE-Kabeln usw. ist vieles dabei... :)
In Anbetracht von Murphy, HW-Inkompatibilitäten, bescheidener Chipsätze und deren Treiber etc. etc. kann man sich ja ausmalen das bei multiplen Möglichkeiten dann (teilweise höchst skurille) Symptome diesem Auslöser noch zusätzlich folgen können.

Mal ein eher harmloses Beispiel an dem ich aktuell beim Kollegen knabbere: Das nur noch 4x brennen geht, nein, dafür muss eben nicht die verdächtige Rohling-Inkompatibiltät verantwortlich sein, oder der blöde Asia-Noname-Brenner... sondern kann durchaus daran liegen das im Gerätemanager zwar "DMA, wenn verfügbar" und "aktueller Übertragungsmodus=UDMA" angezeigt wird, er aber tatsächlich nur den langsamsten UDMA-0 oder sogar einen PIO aktiv hat. Versucht man schneller zu brennen, zeigt Nero im besten Fall nur einen Powercalibration-Error (und andere Menschen wechseln dafür sogar ihr Netzteil oder kaufen PCI-IDE-Karten, neuen Brenner, Win reinstall... :D) oder evtl. gleich einen BSOD.

Schon die (aus eigener Erfahrung öfter als mir lieb war verifizierte) Tatsache das der Gerätemanager oder externe Tools durchaus anzeigen können wie sie lustig sind... 100%ig verlässlich aber wohl nur die Auswertung der live Registry-Werte aus obigen KB-Artikel sind, hat mich schwer ins grübbeln und googeln gebracht. Dabei habe ich etwas entdeckt, daß das manuelle erzwingen der Modi möglich erscheinen lässt. Die Registry-Struktur und weitere ergoogelten Infos bereite ich jetzt mal für euch auf.



3.) Umgebung & Definitionen:

Wir befinden uns jetzt gerade auf einer Pentium3-Kiste, VIA Apollo VT82C693A und VT82C596B mit 4in1443v, Windows 2000 prof. SP4 + RollupV2 im regedit.exe.
Auf dem Sekundären IDE Kanal ist ein DVD-Brenner (UDMA-66) als Master und ein DVD-LW (UDMA-33) als Slave angeschlossen.

(sorry, ich weis nicht wie man Tabulatoren hier richtig anwenden kann...meine Vorschau sieht gut aus, Fullscreen über 1024x empfohlen :) )

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\0002

In der Regel sind die Unterverzeichnisse
0000 = Der IDE-Controller selbst
0001 = Der Primäre IDE-Kanal
0002 = Der Sekundäre IDE-Kanal

Ich beschränke mich folgend nur auf den Sekundären IDE Kanal, also jetzt der Inhalt aus ...bla\0002

(Standard)............................................REG_SZ...........(Wert nicht gesetzt)
DriverDate............................................REG_SZ...........6-19-2003
DriverDateData.....................................REG_BINARY...00 00 fb b9 f5 35 c3 01
DriverDesc...........................................REG_SZ...........Sekundärer IDE-Kanal
DriverVersion.......................................REG_SZ............5.0.2195.6717
EnumPropPages32..............................REG_SZ...........storprop.dll,IdePropPageProvider
InfPath................................................REG_SZ............mshdc.inf
InfSection............................................REG_SZ............atapi_Inst_secondary
MasterDeviceTimingMode.................REG_DWORD....0x00004010 (16400)
MasterDeviceTimingModeAllowed....REG_DWORD....0xffffffff (4294967295)
MasterDeviceType................................REG_DWORD....0x00000002 (2)
MasterIdDataCheckSum.......................REG_DWORD....0x0000fcfb (64763)
MatchingDeviceId.................................REG_SZ.............secondery_ide_channel
ProviderName......................................REG_SZ.............Microsoft
SlaveDeviceTimingMode...................REG_DWORD.....0x00001010 (4112)
SlaveDeviceTimingModeAllowed......REG_DWORD.....0xffffffff (4294967295)
SlaveDeviceType..................................REG_DWORD.....0x00000002 (2)
SlaveIdDataCheckSum.........................REG_DWORD.....0x00008f11 (36625)
UserMasterDeviceTimingModeAllowed...REG_DWORD.....0xffffffff (4294967295)
UserSlaveDeviceTimingModeAllowed.....REG_DWORD.....0xffffffff (4294967295)

Die fett hinterlegten Werte sind ausschlaggebend (und dazu brauch ich auch nen Dolmetscher... ;) ). Als nächstes die Funktion der Positionen, soweit sie trotz intensiv Google überhaupt auffindbar waren.

MasterDeviceTimingMode =
Für/vom BS. Das ist der live Wert, welcher Modi aktuell tatsächlich am (Master-)Gerät anliegt. Hier manuelle Veränderungen sollen ohne reboot wirken! Weiter unten eine kleine Auflistung bekannter Werte für UDMA-Modis.

Konkreter zum obigen Beispiel: 0x00004010 steht für UDMA-3... also mit 44,4 MB/sec. Der angeschlossene Brenner aber sollte UDMA-4 mit 66,6 MB/sec beherrschen können. Also müsste dort eigentlich 0x00008010 stehen... hier hat Windoof ergo schon einmal aus irgendeinem Grund eine Stufe zurück geschaltet. Da ich nie 16fach brenne und auch sonst diesen Anschluß nie strapaziere, ist es mir bisher bloss nicht aufgefallen.

Mit dem Präfix SlaveDeviceTimingMode ist das Gegenstück/Gerät am Slave-Anschluß gemeint. Ich bin gerade selber baff, das an dieser Kiste das DVD-LW offensichtlich mit dem viel zu niedrigen Wert 0x00001010 wohl in einem PIO-Mode einschläft. Gerätemanager&Co. melden aber full UDMA, angeblich alles grün... :D Ich entsinne mich auch das DVD-LW schon ewig nicht mehr benutzt zu haben. Gut egal jetzt, hab mir eh vorgenommen alle meine Kisten bei Zeiten auf diesen Weg zu überprüfen.

MasterDeviceTimingModeAllowed =
Hier wird für/vom BS der Feature-Umfang bestimmt, welche Modi zur Anwendung kommen dürfen. Im quasi übergeordneten MasterDeviceTimingMode. Also quasi welche Modi das BS sich selber überhaupt zur Verfügung stellt/erlaubt.

Hier 0xffffffff bedeutet das max. mögliche (vom Gerät) soll auch vom BS umgesetzt werden dürfen. Dieser Wert ist so in der Regel default und geht auch in Ordnung. 0xfffcffff würde zb. bedeuten das PIO-0 bis einschließlich UDMA-4 erlaubt sind, aber UDMA-5 und UDMA-6 nicht verwendet werden dürfen, selbst wenn es das Gerät unterstützen würde. Später mehr dazu (4.) Punkt) an diesem Schlüssel hängen die meisten Hoffnungen und Arbeit ;)
Das selbe mit Präfix Slave ist dann wieder fürs Slave-Gerät gedacht.

UserMasterDeviceTimingModeAllowed =
Der Präfix User deutet es schon an, das sind die benutzerdefinierten Einstellungen und nicht vom BS. Rest siehe oben.
Vermutlich ist dies konkret die Auwahlmöglichkeit im Gerätemanager, Eigenschaften IDE-Kanal. Im normalen Windows-Treiber bzw. in der Regel gibt es dort eh nur 2 mickrige Wahlmöglichkeiten "Nur PIO" und "DMA, wenn verfügbar". Für letzteres wäre 0xffffffff dann wieder default und auch wünschenswert. Es soll aber Chipsätze und Treiber geben, die hier wesentlich mehr Wahlmöglichkeiten bieten. Entsprechend würden dann vermutlich die Werte auch anders aussehen.
Das selbe mit Präfix Slave ist dann wieder fürs Slave-Gerät gedacht.

MasterIdDataCheckSum =
Für/vom BS. Allgemein bekannt ist nur, das dieser Schlüssel&Wert voll abhängig vom Plug&Play ist und von Windows generiert wird bei der Erkennung&Installation eines neuen Gerätes. Löscht man diesen Schlüssel, zwingt man Windows dazu beim nächsten reboot das Gerät neu zu installieren/initialisieren (und dabei alle relevanten Schlüssel quasi neu auszuwürfeln). Dabei wird vermutlich so eine kurze Testübertragung angeworfen und die Auswertung des Ergebnisses dieses Tests, bestimmen dann diesen Schlüssel&Wert. Dieser wiederum wie die oben beschriebenen xDeviceTimingMode und xDeviceTimingModeAllowed sich dann zusammen setzen.
Vermutlich ist das der Wert an dem sich Windoof hoch zieht und weitere Entscheidungen eigenwillig fällt. Also bei einer Erst- bzw. Neuinitialisierung ist gemeint... später können zu jeder Zeit die TimingModes vom BS wieder eigenwillig angepasst werden. Dazu brauchts uU. nur einen verbrannten oder zerkrazten Rohling.
Dieser Wert ist für mich unmöglich zu entziffern und halte ich auch nicht für weiter beeinflußbar.
Das selbe mit Präfix Slave ist dann wieder fürs Slave-Gerät gedacht.

Nun eine kleine Auflistung der Werte in den xDeviceTimingModes , die inzwischen allg. bekannt sind:

0x00020010 steht für UDMA-6 (verifiziert)
0x00010010 steht für UDMA-5 (verifiziert)
0x00008010 steht für UDMA-4 (verifiziert)
0x00004010 steht für UDMA-3 (verifiziert)
0x00002010 steht für UDMA-2 (verifiziert)
0x00001010 steht für UDMA-1 (nicht verifiziert, da aber ...02010 UDMA-2 ist, sollte das gefühlt richtig sein ??? )

0x00000410 steht für MultiWord DMA mode 2 (Google, nicht verifiziert. Entspricht 16,6 MB/sec wie PIO-4)

0x00000010 steht für PIO-? (Google, vermutlich PIO-0 da der kleinstmögliche Wert ??? ) Erscheint angeblich im XP wenn man bewusst "Nur PIO" im Gerätemanager wählt. Dabei ist dann xDeviceTimingModeAllowed 0x0000001f... könnte später nochmal wichtig werden.
Aber ..010 und ...01f klingen für mich ahnungslosen nicht gerade koscher. Es ist auch nicht verifiziert oder ersichtlich, ob Windows überhaupt Einzelwerte für jeweils PIO-0bis4 kennt.

Mehr war einfach nicht aufzutreiben bzw. weitere Tests sind an der Kiste wo ich gerade sitze nicht möglich.



4.) Theorien & Fragen:

Mit den bisherigen Kenntnisstand darf man davon ausgehen, falls einem das BS sowohl im xDeviceTimingMode als auch xDeviceTimingModeAllowed unerwünschte Modi-Werte reinschreibt... hat man als User die wohl größtmögliche Arschkarte gezogen :D

Weitere Google-Orgien spuckten etwas sehr interessantes aus. Eddy ist ein blogger der sich mal 2005 über sein "pesky ATA/66 disk caddie" aufgeregt hat :)
Dabei ist er auf den Trichter gekommen, das es sich um die Werte im xDeviceTimingModeAllowed eher um eine Bit-Maske handelt wo man mit setzen/entfernen einzelner Bits dem BS vorgeben kann, welche Modi dem überhaupt zur Verfügung stehen. Er führt das mit einem Beispiel 0xfffcffff auf was bedeutet: erlaubt sind für das BS nur PIO-0 bis einschließlich UDMA-4, keine höheren. Pflichtlesestoff -> Eddy's occasional random thoughts.

Das ist genial! Ich hoffe sehr, das sich die Bits so lange umsetzen lassen bis auch ausschließlich nur zb. UDMA-4 erlaubt wäre. Geht das überhaupt? Und könnte das bitte einer von euch aufbrösseln?

Ansonsten wäre eine weitere Übersetzung nach Eddys Methode mit allen (PIO-0 bis) UDMA-0bis6 auch schon sehr hilfreich. Zumindest die noch gängisten UDMA-2,5,6.
Ach ja, ob das ganze jeweils bis PIO-0 runter geht, bleibt unbekannt. Aber bei 32 bit... könnte ich mir durchaus vorstellen das sogar die beachtung der Single Word DMAs usw. hier Platz gefunden haben.

Für jemanden der desöfteren scheiss PIO<->UDMA Problemen begegnet und das über diese Registry-Methode weiter eingrenzen/austesten/etc. muss... wären beide Varianten (bis & ausschließlich) vollständig übersetzt ein wahrer Segen. Auch das erzwingen eines meinetwegen ausschließlich PIO-2 könnte uU. zu Testzwecken sinnvoll sein.
Also ich habe nicht wirklich eine Vorstellung davon wie arbeitsaufwendig das für einen gestandenen Programmierer tatsächlich ist, aber bitte bitte bitte :-*

Hier noch ein zweiter, deutscher Link Winhelpline der mir für euch nützlich erschien. Da gibts Beispiele mit konkreten 1000010010101.... Bitfolgen. Für mich ist das ja alles eher Bahnhof.
Dort erzählt ein gewisser Lemmi auch, das Bitmuster nur für gewisse Modi und nur für Win2K möglich sind... nun denn, ich hoffe das eher Eddy statt Lemmi Recht behält... :D

So, ich hab jetzt alles aufgeschrieben was ich zu dem Thema weis/gefunden/verifiziert habe... ich hoffe das Ihr die Lücken jetzt auffüllen könnt. Evtl. lässt sich da rein rechnerisch schon vieles ermitteln. Welche manipulierten Schlüssel (besonders Allowed) nach dem nächsten reboot dann von Windows auch unangetastet bleiben... ebenso wie der User-Präfix hier noch einwirken könnte.... kann man auch nur mit den richtigen Werten ausprobieren. Damit kommen wir zu...



5.) Aufgabenstellung: (hahaha)

Natürlich neben der allg. Prüfung aller bisherigen Angaben des Autoren und evtl. korrektur falscher Schlußfolgerungen von ihm....

Ersetzen Sie in folgender Tabelle die ?? mit den korrekt ermittelten Werten... :D


Modi/Protokoll...................................Industrie Specs..........Übertragungsrate.........TimingMode..........Allowed bis/inkl........Allowed ausschließlich
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PIO-0...................................................ATA (ATA-1)...............3,33 MB/sec...........0x00000010 -> ??....??..........................0x0000001F -> ??

DMA-0 oa. MultiWord DMA Mode 0........ATA...........................4,16 MB/sec...........??...........................??..............................??

PIO-1...................................................ATA...........................5,22 MB/sec...........??...........................??..............................??

PIO-2...................................................ATA...........................8,33 MB/sec...........??...........................??..............................??

PIO-3...................................................ATA-2........................11,1 MB/sec...........??...........................??..............................??

DMA-1 oa. MultiWord DMA Mode 1........ATA-2........................13,3 MB/sec...........??...........................??..............................??

PIO-4...................................................ATA-2........................16,6 MB/sec...........??...........................??..............................??

DMA-2 oa. MultiWord DMA Mode 2........ATA-2........................16,6 MB/sec...........0x00000410.............??..............................??

UDMA-0...............................................ATA/ATAPI-4..............16,7 MB/sec...........??...........................??..............................??

UDMA-1...............................................ATA/ATAPI-4..............25,0 MB/sec...........0x00001010.............??..............................??

UDMA-2 oa. UDMA-33 oa. ATA-33.........ATA/ATAPI-4..............33,3 MB/sec...........0x00002010.............??..............................??

UDMA-3...............................................ATA/ATAPI-5..............44,4 MB/sec...........0x00004010.............??..............................??

UDMA-4 oa. UDMA-66 oa. ATA-66.........ATA/ATAPI-5...............66,6 MB/sec..........0x00008010.............0xFFFCFFFF..............??

UDMA-5 oa. UDMA-100 oa. ATA-100......ATA/ATAPI-6..............100 MB/sec............0x00010010.............??..............................??

UDMA-6 oa. UDMA-133 oa. ATA-133......ATA/ATAPI-7..............133 MB/sec............0x00020010.............??..............................??
 
Zuletzt bearbeitet:
Es gibt mehrere Punkte, die dein Vorhaben sinnlos oder zumindest überflüssig machen:

  1. Die Registryschlüssel werden nicht immer benutzt! Konkret: hat man z.B. nVidia IDE-Treiber installiert (bei mir der Fall), interessieren die o.g. Registry-Pfade nicht; es werden andere benutzt.
    Bei meinem alten A7V266-E mit Via IDE-Controller wurden die Pfade benutzt, obwohl Via IDE-Treiber installiert waren. Muss man also immer berücksichtigen.

  2. Es gibt immer einen Grund, warum das System die Geräte im Transfermodus nach unten schaltet. Ich habe es bisher bei keinem Rechner erlebt, dass das "grundlos" war. Meist passierte es aufgrund eines defekten Kabels.

  3. Als ich damals noch einen LG DVD-RAM-Brenner drin hatte, der langsam aber sicher nicht mehr in der Lage war, DVD-RAMs zu brennen (CDs/DVDs gingen problemlos!), hatte ich das Problem mit dem Transfermodus auch. Irgendwann ging's mir auf'n Keks und ich habe ein Tool in AutoIt geschrieben, das die Transfermodi ausliest und warnt, wenn sie mit einem bestimmten Vorgabewert nicht übereinstimmen: Download Neuer Downloadlink.
    In dem Archiv ist eine EXE, der Quellcode als .au3 und eine Beispiel-INI, die das Programm steuert. Die EXE ist dekompilierbar (mit Exe2Aut aus dem AutoIt-Paket), so dass jeder nachprüfen kann, dass die EXE wirklich nur das macht, was im Quellcode steht.

    Zur INI: im Abschnitt [ToCheck] werden mit Nummern die Abschnitte angegeben, die geprüft werden sollen. Im Beispiel-Abschnitt [Secondary_Master] sieht man, dass der Registrypfad (path), der zu prüfende Wert (value) (z.B. SlaveDeviceTimingMode) und der erwartete Wert (expected) eingetragen werden muss.
    Welcher Transfermodus bei expected eingetragen werden muss, hängt vom Gerät und dessen Übertragungsmodus ab. Ich hab das damals folgendermaßen rausbekommen:
    SlaveIdDataCheckSum aus der Registry gelöscht, UserSlaveDeviceTimingModeAllowed und SlaveDeviceTimingModeAllowed auf Maximalwert von 0xffffffff gestellt und neu gestartet. Dann benutzt Windows den maximalen Modus für dieses Gerät. Den Wert kann man sich dann aus der Registry holen.

    Stimmen die Werte bei der Prüfung überein, beendet sich das Programm kommentarlos, bei Abweichungen erscheint eine Warnung. Es kann aber jeder, der Lust hat, Änderungen am Programm vornehmen. Es steht hiermit unter Public Domain oder GPL oder was auch immer ;). Es kann jeder damit machen, was er will.

So viel Zeug wollte ich eigentlich gar nicht schreiben *buck*, naja.

MfG Dalai
 
Zuletzt bearbeitet:
Zurück
Oben Unten