Code bringt Windows zum Absturz

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Code bringt Windows zum Absturz

Beitrag von RSBasic »

Hallo,

zufällig ist mir beim Testen was krasses aufgefallen und zwar habe ich diesen Code so angepasst, dass der Code dafür sorgt, dass sich Windows komplett aufhängt. Der Mauscursor lässt sich nicht mehr bewegen und der Task-Manager kann auch nicht mehr aufgerufen werden. Einzige Lösung ist ein Hardware-Reset.

Achtung: Den folgenden Code bitte nur in einer VM testen:

Code: Alles auswählen

EnableExplicit

Define Handle

RunProgram("notepad.exe")
Delay(100)
Handle = FindWindow_("Notepad", 0)
If Handle
  If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered, Handle)
    If ContainerGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), 0)
      SetParent_(Handle, GadgetID(1))
      
      CloseGadgetList()
    EndIf
    
    SetActiveWindow(0)
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver
  EndIf
EndIf
Achtung: Den oberen Code bitte nur in einer VM testen!

Mir ist klar, dass es sinnfrei ist, eine externe Anwendung als ParentWindow festzulegen und gleichzeitig mit SetParent_() in sein eigenes Fenster einzubinden, aber was ich nicht verstehe ist, warum man mit so einem einfachen Code schafft, Windows zum Absturz zu bringen, so dass Windows überhaupt nicht mehr reagieren kann.
Das sollte eigentlich nicht sein und sowas darf nicht passieren. Getestet unter Windows 10 und 7.
:-?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Code bringt Windows zum Absturz

Beitrag von DarkSoul »

Das ist jetzt nicht so offentsichtlich:

Du hast eine Endlosschleife gebastelt. :mrgreen:

Code: Alles auswählen

...
  If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered, Handle)
    If ContainerGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), 0)
      SetParent_(Handle, GadgetID(1))
...
Window 0 hat als Parent: Handle
Gadget 1 hat als Parent: Window 0
Handle hat als Parent: Gadget 1

Was meinst du, was passiert, wenn Windows den obersten Parent von einem der drei haben möchte (um z.B. die Events durchzureichen)?
...Richtig!...

Code: Alles auswählen

(pseudocode)
win = gadget_0; //oder einen der anderen beiden
while (win != topmostWin) {
  win = GetParent(win); //Handle -> Gadget 1 -> Window 0 -> Handle -> Gadget 1 ....
}
Da das nie endet, verheddert sich Windows in eine Endlosschleife und friert ein. :)

Du musst diesen Kreis unterbrechen.

Eine Möglichkeit wäre:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered, 0)  ;Parent auf 0 setzen, da dies die oberste Ebene in deinem Programm ist
Mit dieser Änderung läuft das Programm problemlos bei mir (abgesehen von diversen Rendering-Bugs, die mit diesem Problem nichts zutun haben).

Nimm lieber ein EditorGadget() anstatt notepad.exe in ein Window zu pfuschen. :wink:

PS: In der WinAPI-Welt (also Windows-intern, wo die PB-Libs auch nur aufsetzen) zählen die PB-Gadgets als Window. Es wird hier nicht zwischen den beiden unterschieden. Ein Window kann theoretisch auch ein Gadget als Parent haben. Es liegt am Programmierer, mit SetParent_() keine sinnfreien Konstruktionen zusammenzustapeln.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Code bringt Windows zum Absturz

Beitrag von RSBasic »

Ich weiß das ja alles. Ich wollte eigentlich auch nicht wissen, wie man das Problem behebt oder warum das passiert und warum man das so nicht schreiben darf, sondern es war nur eine Demonstration eines zufällig geschriebenen Beispielcodes, der Windows zum Absturz bzw. Einfrieren bringen kann. :)
Es ist nur komisch, dass Windows das nicht abfängt und keinen Fehler zurückgibt oder dass wenigstens nur das eigene Programm einfriert. Windows darf meiner Meinung nach bei diesem Code nicht so schnell einfrieren. Wenn Windows mit dieser Parent-Problematik nicht klar kommt, ist das meiner Meinung nach eine Lücke oder ein Fehler im Betriebssystem, der sogar von einer Schadsoftware ohne Adminrechte ausgenutzt werden kann.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Code bringt Windows zum Absturz

Beitrag von Micha122 »

Respekt! :allright: Eingefrorene Fenster usw. habe ich auch schon geschafft. Aber einen Windows komplett Absturz.........das hat was. :lurk:

Mit eingeschalteten Purifier funktioniert der Code komischerweise einwandfrei.

Die OnError- Bibliothek erkennt den Fehler allerdings nicht.
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Code bringt Windows zum Absturz

Beitrag von DarkSoul »

Ich hab mal n Bluescreen geschafft :roll: . Aber nur mit der fertigen Binary. In der IDE lief alles bestens.

Habe es irgendwie fertig gebracht, mit einem Nullpointer einen Speicherbereich zu beschreiben. So habe ich die allerersten paar KB im RAM (oder was weiß ich) überschrieben, was der arme PC nicht mochte.

Hat Windoof auch nicht gemerkt und ich habe mir nen Ast abgesucht, wo der verdammte Fehler liegt.

Hatte schlichtweg vergessen, dem Zeiger die Startadresse von AllocateMemory() zuzuweisen (und der IF, ob es 0 ist, hat gefehlt), bevor ich ihn als Laufzeiger für ne Poke()-Aktion benutzt habe. :mrgreen:

Dadurch dass das son Zwischenspeicher war, hat das betreffende Modul im Debugger einwandfrei funktioniert (Jedoch an der falschen Adresse im RAM, was nicht aufgefallen ist, weil der fehlerhafte Zeiger entsprechend an die lesende Komponente mit übergeben wurde.)

Irgendwie ist das halt durchgegangen.

Ist schon Jahre her. War XP oder 7.

Heute fängt das (glaube ich) der Debugger bereits ab. Falls nicht, crasht die Anwendung und gut ist.

Unter iOS habe ich mal sowas ähnliches geschafft. App im Debugmodus = lief perfekt. App compiliert = Screen schwarz und I-Pad reagiert eine Minute nicht mehr, bis sie endlich abstürzt (mitsamt System, der weiße Apfel leuchtete auf und das I-Pad rebootete). War sogar eine ganz bestimmte Version vom Betriebssystem. das war nervig zu finden. War so ne Multithread-Geschichte. Ohne Debugger wird Code etwas schneller ausgeführt als mit, so dass es zu zeitlichen Überschneidungen kam.

Hat was von 1000er-Weihnachtslichterkette, wo eine unbekannte Anzahl Birnen kaputt ist, ohne Multimeter zum Laufen zu bringen...

Bei sowas hilft immer nur eins: Alles klauen und Zeile für Zeile wieder einbauen, bis der Fehler aufritt.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Code bringt Windows zum Absturz

Beitrag von Micha122 »

Muss hier leider meine Aussage von gestern korrigieren. Der Code funktioniert auch mit Purifier nicht.
Zitat:
Mit eingeschalteten Purifier funktioniert der Code komischerweise einwandfrei.

Die OnError- Bibliothek erkennt den Fehler allerdings nicht.
Purifier verlangsamt die Ausführung von Notepad.exe um ein vielfaches.
Die Wartezeit von 100 Millisekunden reichte also nicht mehr aus bis das Notepad Window geöffnet war.
Somit gab Handle = FindWindow_("Notepad", 0) also gar keinen Handle zurück und es wurde auch nicht das PB-Window geöffnet.

Kurz gesagt, es wurde nur Notepad.exe gestartet. :oops:
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Code bringt Windows zum Absturz

Beitrag von DarkSoul »

Was passiert eigentlich mit Notepad, wenn das PB-Progamm zuerst beendet wird?

Das Window von Notepad geht ja mit dem PB-Window unter. :roll:

Lebt Notepad im "Hintergrund" weiter? Wird das Notepad-Fenster von der PB-Anwendung irrtümlich dealloziiert?

Ist sowieso extrem buggy bei mir. Das Notepad-Window erhält den alten Vista-Style, obwohl ich Win 8.1 habe.
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Code bringt Windows zum Absturz

Beitrag von uweb »

Ich denke es wird gekilled - also nicht beendet.
Es gibt also auch kein "Möchten Sie speichern?".

Im Taskmanager verschwindet es wenn das PB-Progamm zuerst beendet wird.
Es sollte also auch nicht mehr leben.
Wenn Du allerdings das PB-Progamm killst lebt Notepad wohl weiter.
Du kannst Notepad ja durch einen beep_()-Dummy ersetzen und das ganze mit http://purebasic.fr/german/viewtopic.ph ... 70#p338552 testen.

Damit, dass es ein wenig buggy ist hast Du recht. Ich denke für Fenster gibt es unter Windows 1000 Möglichkeiten aber auch 10000 Dinge die anders laufen können als man es gerne hätte.
PB-Libraries sind leichter zu nutzen aber eben auch übersichtlicher als die Win-API.

__________________________________________________
Domain angepasst
02.11.2016
RSBasic
Antworten