Standort: Alexander Foken > Projekte > Windows > Fehler in Windows 95
Diese Informationen stammen aus der c't Ausgabe 9/1997, Seite 272, Artikel "Bombenstimmung" von Arne Schäpers.
Der Fehler tritt unter Windows 95 und allen Versionen von Windows NT auf, sobald die Funtion PeekMessage32 mit gesetztem Direction-Flag (Assembler-Befehl std) aufgerufen wird und die Warteschlange Botschaften enthält. Dies kann in jedem Programm vorkommen, da nahezu jedes Programm mit String-Befehlen arbeitet (STOS, MOVS, LODS), z.B. beim Kopieren von Variablen über 16 bzw. 32 Bit Größe.
Je nach Windows-Version und Programmtyp reagiert das System unterschiedlich:
(GPF ist die Abkürzung für General Protection Fault = allgemeine Schutzverletzung, hier immer im Modul USER.EXE)
(ab hier zitiere ich aus der o.g. Ausgabe der c't)
- Windows 95, 16-Bit-Programm:
- GPF, weil PeekMessage intern an PeekMessage32weitergegeben wird; danach Fortsetzung des Programms.
- Windows 95, 32-Bit-Programm:
- GPF in PeekMessage32. Vom Explorer gestartete Programme werden nach entsprechender Rückmeldung ('Diese Anwendung wird aufgrund eines ungültigen Vorgangs geschlossen') abgebrochen, wobei das System stabil bleibt. Bei der Ausführung über einen Debugger (beispielsweise Delphi 2.0 oder 3.0) bricht das System nach Ausgabe der Meldung komplett zusammen.
- Windows NT 4.0, 16-Bit-Programm:
- problemfrei, weil dort kein Thunking zu PeekMessage32 stattfindet (eigenes Subsystem).
- Windows NT 4.0, 32-Bit-Programm:
- Vom Explorer aus gestartete Programme verschwinden beim Auftreten dieses Fehlers im Nichts - sie werden ohne jede Rückmeldung aus dem Speicher katapultiert. Ob Microsoft Kernel-GPFs wohl per Dekret abgeschafft hat ?
Der wohl bis auf weiteres fällige Workaround besteht darin, vor PeekMessage einen CLD-Befehl einzusetzten - am besten gleich in den Bibliotheken des jeweiligen Entwicklungssystems (soweit verfügbar).
(Ende des Zitats)
Datei WINPROCS.PAS im Unterverzeichnis \RTL\WIN, implementation-Abschnitt
function PeekMessage; external 'User' index 109;
function BuggyPeekMessage (var Msg : TMsg; Wnd : HWnd; MsgFilterMin, MsgFilterMax : word; RemoveMsg : word) : Bool; far; external 'USER' index 109; function PeekMessage (var Msg: TMsg; Wnd: HWnd; MsgFilterMin,MsgFilterMax: Word; RemoveMsg: Word): Bool; begin asm cld end; PeekMessage:=BuggyPeekMessage (Msg,Wnd,MsgFilterMin,MsgFilterMax,RemoveMsg); end;
Vor dem Compilieren muß mittels TPUMOVER die ungepatchte WinProcs-Unit sowie alle anderen Units bis auf SYSTEM aus der Windows-Library TURBO.TPW entfernt werden. Danach müssen alle Windows-Units incl. OWL und WIN31 neu compiliert werden (siehe Beschreibung zu den Quelltexten der Runtime Library), sowie alle bis zu diesem Patch erstellten Units und Programme, am besten mit der Build-Option statt eines einfachen Makes.
(NEUE VERSION: Reste vom Debugging machten in der bisherigen Version Probleme - sorry !)
Ich habe nach einigen Überlegen einen kleinen Bugfix geschrieben:
userfix.zip
In dieser Datei ist mein mittlerweile nicht mehr bestehender AOL-Account angegeben, bitte die dort angegebenen Adressen nicht mehr benutzen.
Copyright © Alexander Foken | 2002-11-10 21:29 |