Sind HWND immer unique?
-
Hier ist die CreateWindow-Funktion
https://github.com/killbug2004/NT_4.0_SourceCode/blob/master/nt4/private/ntos/w32/ntuser/kernel/createw.cDas HWND ist intern ein PWND.
Die Zeile 165 sieht so aus:pwnd = HMAllocObject(ptiCurrent, pdesk, TYPE_WINDOW, sizeof(WND) + pcls->cbwndExtra);
Das "Handle" zeigt also direkt auf einen Speicherblock.
Mit der Bezeichnung "Handle" wird bloß verschleiert, dass es ein Pointer ist.
HMAllocObject ist hier: http://read.pudn.com/downloads3/sourcecode/windows/248345/win2k/private/ntos/w32/ntuser/kernel/handtabl.c__.htmPVOID HMAllocObject( PTHREADINFO ptiOwner, PDESKTOP pdeskSrc, BYTE bType, DWORD size)
-
Alter Schwede, du bist schon sehr von dir selbst überzeugt, hm?
Winfreak again ... schrieb:
Hier ist die CreateWindow-Funktion
https://github.com/killbug2004/NT_4.0_SourceCode/blob/master/nt4/private/ntos/w32/ntuser/kernel/createw.cDas HWND ist intern ein PWND.
Nein!
Ein PWND ist ein PWND und eben kein HWND. Da gibt es Funktionen die HWND <-> PWND mappen. Und die machen nicht einfach bloss einen Cast.Winfreak again ... schrieb:
Mit der Bezeichnung "Handle" wird bloß verschleiert, dass es ein Pointer ist.
HMAllocObject ist hier: http://read.pudn.com/downloads3/sourcecode/windows/248345/win2k/private/ntos/w32/ntuser/kernel/handtabl.c__.htmFalsch.
Vielleicht solltest du dir mal die Makros _HW, _HWCXX, _HWq etc. - die in dem von dir verlinkten File überall verwendet werden - ansehen.
-
hustbaer schrieb:
Ein PWND ist ein PWND und eben kein HWND. Da gibt es Funktionen die HWND <-> PWND mappen. Und die machen nicht einfach bloss einen Cast.
Ich habs gefunden. Während PWND noch ein echter Pointer auf eine WND Struct ist, ist ein Handle irgend ein DWORD, in dem nur ein Teil (HMINDEXBITS) ein Index zu sein scheint (in ein Array von HANDLEENTRYs).
Hätte nicht gedacht, dass die solche Verrenkungen machen.
Was wohl der Grund sein mag? Ich vermute, das Zeug ist historische gewachsen und es wurde immer mehr dazugebastelt. Dann kommt sowas wohl raus.
-
Winfreak noch immer ... schrieb:
Ich habs gefunden. Während PWND noch ein echter Pointer auf eine WND Struct ist, ist ein Handle irgend ein DWORD, in dem nur ein Teil (HMINDEXBITS) ein Index zu sein scheint (in ein Array von HANDLEENTRYs).
Also das was ich dir bereits geschrieben habe.
Winfreak noch immer ... schrieb:
Hätte nicht gedacht, dass die solche Verrenkungen machen.
Was wohl der Grund sein mag? Ich vermute, das Zeug ist historische gewachsen und es wurde immer mehr dazugebastelt. Dann kommt sowas wohl raus.Nö, das macht voll viel Sinn.
Handles sind prozessübergreifend und du musst sicherstellen können dass der eine Prozess nicht einen anderen Prozess crashen kann indem er irgendwo Mist baut.
Vielleicht solltest du die Selbsteinschätzung deiner Kompetenz neu evaluieren. Du hast offenbar nicht viel Plan davon wie diese Dinge funktionieren, kommst aber trotzdem mit wilden (und völlig falschen) Vermutungen/Behauptungen daher...
-
hustbaer schrieb:
Also das was ich dir bereits geschrieben habe.
In der Tat. Deshalb habe ich die Sache auch weiter verfolgt.
Winfreak noch immer ... schrieb:
Nö, das macht voll viel Sinn.
Handles sind prozessübergreifendGlaubst du denn, dass in dem HWND auch die Process-ID steckt? Das könnte man doch mal nachforschen.
Winfreak noch immer ... schrieb:
Nö, das macht voll viel Sinn.
Glaube ich nicht. Ein Pointer, der in einem anderen Prozess gültig ist, sollte im hiesigen Prozess wie ein "wild pointer" behandelt werden. Dass das Window-Management Aufgaben des Kernels übernimmt, ist ein Designfehler.
Windows ist schon eine tolle Sache. Man sollte seine Entwickler aber nicht für Götter halten.
Winfreak noch immer ... schrieb:
Vielleicht solltest du die Selbsteinschätzung deiner Kompetenz neu evaluieren. Du hast offenbar nicht viel Plan davon wie diese Dinge funktionieren, kommst aber trotzdem mit wilden (und völlig falschen) Vermutungen/Behauptungen daher...
Ist kein Problem. Dazulernen geht immer.
-
WinFreak online schrieb:
Glaubst du denn, dass in dem HWND auch die Process-ID steckt? Das könnte man doch mal nachforschen.
Handles sind prozessübergreifend. Du kannst dir aus Prozess A ein Handle von einem Fenster in Prozess B holen. Da kann keine PID drinstecken.
-
Mechanics schrieb:
Handles sind prozessübergreifend. Du kannst dir aus Prozess A ein Handle von einem Fenster in Prozess B holen. Da kann keine PID drinstecken.
Die APIs, die mit dem HWND arbeiten, müssen letztlich mit anderen Prozessen kommunizieren können. Rohe Pointer sind dafür recht ungeeignet. Wenn ein Fenster eine WM_xxx an ein anderes Fenster schickt, läuft unter Umständen im Hintergrund eine Interprozess-Kommunikation ab.
Windows nutzt für sein Fenstersystem ein Konzept aus "Windowstations" und "Desktops". Das gab es zur Zeit der ersten Windows-Versionen auch noch nicht, wie auch Multiprocessing für Windows unbekannt war.
Windows ist historisch gewachsen, wurde immer weiter aufgerüstet. Perfektes Systemdesign war nie das Ziel, sondern Geld machen mit einem Produkt, das den Kunden gerade so zufrieden stellt.
-
WinFreak not Winfried schrieb:
Perfektes Systemdesign war nie das Ziel [...]
Google mal nach "Dave Cutler"...
-
dot schrieb:
WinFreak not Winfried schrieb:
Perfektes Systemdesign war nie das Ziel [...]
Google mal nach "Dave Cutler"...
Ich kenne das Buch "Showstopper".
Würde ich jedem Windows-Fan empfehlen:
https://www.amazon.com/Showstopper-Breakneck-Windows-Generation-Microsoft/dp/0759285780
-
WinFreak not Winfried schrieb:
... sondern Geld machen mit einem Produkt, das den Kunden gerade so zufrieden stellt.
Gerade so zufrieden ... na ja. Ein Marktanteil von über 90 Prozent bei Desk- und Laptops spricht nicht für "gerade so zufrieden". Der Plan, Geld zu machen, ist also ziemlich gut aufgegangen, würde ich sagen.
Und 9999 von 10000 Kunden kommen mit sowas wie HWND niemals in Berührung, es kann ihnen also völlig latte sein, wie die Dinger zusammengemixt werden.
Dass andere Betriebssysteme viel viel toller sind als Windows, versteht sich von selber. Aber die waren eben, als der Internet-Hype losging, nur für Nerds benutzbar. Computer kaufen und lossurfen ging damit nicht, mit Windows schon. Oder sie waren damals schon teuer und elitär.
-
Printe schrieb:
WinFreak not Winfried schrieb:
... sondern Geld machen mit einem Produkt, das den Kunden gerade so zufrieden stellt.
Gerade so zufrieden ... na ja. Ein Marktanteil von über 90 Prozent bei Desk- und Laptops spricht nicht für "gerade so zufrieden". Der Plan, Geld zu machen, ist also ziemlich gut aufgegangen, würde ich sagen.
Und 9999 von 10000 Kunden kommen mit sowas wie HWND niemals in Berührung, es kann ihnen also völlig latte sein, wie die Dinger zusammengemixt werden.
Dass andere Betriebssysteme viel viel toller sind als Windows, versteht sich von selber. Aber die waren eben, als der Internet-Hype losging, nur für Nerds benutzbar. Computer kaufen und lossurfen ging damit nicht, mit Windows schon. Oder sie waren damals schon teuer und elitär.
Microsoft machte Knebelverträge mit Computerhändlern. Den Kunden wurde Windows einfach untergejubelt. Sogar heute noch ist Windows auf neuen PCs gleich mit drauf. Wenn du einen PC ohne Windows haben willst, guckt der Händler erstmal doof. Viele bieten das nicht einmal an.
Aus dem Grund habe ich mir auch geschworen, für MS-Software niemals Geld auszugeben. Außer Windows benutze ich eh nichts davon.
Internet konnte Windows erst sehr spät. Unter Win3.1 musste man noch das benutzen: ftp://ftp.fh-niederrhein.de/pub/oldstuff/win31/winsock/trumpet/twsk20b.zip
Technologisch gesehen war Microsoft schon immer der Nachzügler. Grafische Benutzeroberfläche ist von Apple abgekupfert, Internet von Unix, C# von Java, usw.
-
Auweia...was für ein Gesülze. Der böse Microsoft-Konzern...blabla. Der Threadstarter hatte nur wissen wollen wie "einzigartig" HWND's sind.
Da ist es völlig egal ob Handle Zeiger auf Typen (struct) sind oder void oder...oder nicht. Die Programmierschnittstelle mit dem Betriebssystem (Windows) ist funktionsorientiert (user32.dll, gdi32.dll, kernel32.dll, opengl32.dll,...).
Ressourcen werden über Funktionen manipuliert, damit Windows weiß welche Ressource (Windows-Objekt) gemeint ist, existieren Handles (Identifikatoren). GDI-Objekte und deren Handle sind z.B. privat für den Prozess. Kernel-Objekte sind spezifisch für den Prozess. User-Objekte unterstützen nur ein Handle per Objekt. Und es ist dabei völlig egal, wie das Handle in C++ umgesetzt ist. Ergo...ja, User-Objekte sind immer "unique". Kernel-Objekte (Prozessrelaitv) können unterschiedlich sein, obwohl die auf die gleiche Ressource verweisen (z. B. Datei).
-
FrankTheFox schrieb:
Kernel-Objekte sind spezifisch für den Prozess.
Falsch.
FrankTheFox schrieb:
Und es ist dabei völlig egal, wie das Handle in C++ umgesetzt ist.
Dir vielleicht.
FrankTheFox schrieb:
Kernel-Objekte (Prozessrelaitv) können unterschiedlich sein, obwohl die auf die gleiche Ressource verweisen (z. B. Datei).
Was soll "prozessrelaitv" heissen? Und wieso schreibst du dauernd Kernel-Objekte wenn du die Handles meinst? Denn die Objekte sind sicher nicht unterschiedliche, das Objekt ist das Objekt und das ist immer das selbe.
Dafür wie du dich hier als "Aufklärer" aufspielst schreibst du überraschend* viel Unfug. Im Endeffekt bist du genau so ein "ich bin wichtig" Quatschlaberant wie WinFreak.
*: Ja, OK, ist gelogen. Überraschend ist es leider überhaupt nicht.
-
hustbaer schrieb:
*: Ja, OK, ist gelogen. Überraschend ist es leider überhaupt nicht.
Na, Butter bei die Fische, wieso ist das nicht überraschend?
-
. o O ( jetzt geht er auch noch auf die Fische los ) blubb
-
WinFreak tha real fREAK! schrieb:
Internet konnte Windows erst sehr spät. Unter Win3.1 musste man noch das benutzen:
Ja, und Linux brachte das schon immer von Haus aus mit, weiß ich. Dafür war ne Linux-Inbetriebnahme bis in die Nuller Jahre hinein was für Experten, das änderte sich erst mit Ubuntu. Und ein paar Tücken hat es bis heute.
Technologisch gesehen war Microsoft schon immer der Nachzügler. Grafische Benutzeroberfläche ist von Apple abgekupfert, Internet von Unix, ...
Bei Benutzeroberflächen haben quasi alle von Apple abgekupfert, weil die die ersten waren. Mit Internet und Unix dasselbe - das Internet ist auf Unix-Systemen entstanden.
Dafür waren Windows-Oberflächen wenigstens einheitlich. Wenn ich mir da alte X-GUIs angucke - grausig, jeder kochte sein eigenes Süppchen.Und Microsoft hats geschafft, dass jeder, der einen PC einschalten konnte, auch damit ins Internet kam. Ob das für die Sicherheit immer so toll war, steht auf nem anderen Blatt. Aber weltweite Kommunikation ist auch ein Wert an sich, und dass das für wirklich jeden zugänglich wurde (und nicht nur für die, die Zugang zu einem Großrechner hatten oder mit Linux umgehen konnten), das ist ein Verdienst von Microsoft.
-
FrankTheFox schrieb:
hustbaer schrieb:
*: Ja, OK, ist gelogen. Überraschend ist es leider überhaupt nicht.
Na, Butter bei die Fische, wieso ist das nicht überraschend?
Weil die Quatsch-Quote in Beiträgen die mit "ich klär euch jetzt mal auf" (sinngemäss) anfangen leider auch relativ hoch ist. Daher nicht überraschend wenn man wieder mal einen solchen liest.
An dieser Stelle muss man auch fast den Dunning-Kruger Effekt erwähnen.
-
Och ne...Dunning-Kruger Effekt...
Ok, das mit den Kernel-Objekten stimmte so nicht. Nicht die Objekte sind Prozess-spezifisch sondern eher die Handle.
Um auch weiterhin korrekt zu bleiben...
Kernel Objekte
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724485(v=vs.85).aspxUser Objekte
https://msdn.microsoft.com/en-us/library/windows/desktop/ms725486(v=vs.85).aspx
**
GDI Objekte**
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspxUnd überall liest man wie böse und untalentiert Microsoft ist. Das mag ja auch so sein, aber ändert nix an nix
-
FrankTheFox schrieb:
Och ne...Dunning-Kruger Effekt...
Ja, genau der. Was ist daran lustig?
Mag jetzt sein dass das nicht auf dich zutrifft und du einfach nur schlampig bei der Formulierung warst. Allegmein ist das aber sehr wahr und auch sehr schön in Foren beobachtbar.FrankTheFox schrieb:
Ok, das mit den Kernel-Objekten stimmte so nicht. Nicht die Objekte sind Prozess-spezifisch sondern eher die Handle.
Um auch weiterhin korrekt zu bleiben...
Kernel Objekte
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724485(v=vs.85).aspxJa. Jain
Man kann Handles vererben. Wobei dann der Kind-Prozess natürlich seine eigene "Kopie" des Handles hat (das Handle im Parent-Prozess wird z.B. nicht ungültig nur weil der Kind-Prozess es schliesst), allerdings ist der Wert der beiden Handles identisch (und sie verweisen natürlich auch auf das selbe Objekt)FrankTheFox schrieb:
Und überall liest man wie böse und untalentiert Microsoft ist. Das mag ja auch so sein, aber ändert nix an nix
Ich würde sagen es kommt drauf an wo und was man liest.
-
hustbaer schrieb:
Allegmein ist das aber sehr wahr und auch sehr schön in Foren beobachtbar.
[offtopic]Ich kann das auch sehr schön an unseren Managern beobachten. [/offtopic]