Warum werden 64-Bit-DLLs unter 64-Bit-Windows an System32 und 32-Bit-DLLs an SysWoW64 gesendet?

227

Ich würde gerne wissen, wann wir eine Datei unter platzieren müssen

C: \ Windows \ System32 oder C: \ Windows \ SysWOW64 auf einem 64-Bit-Windows-System.

Ich hatte zwei DLLs, eine für 32-Bit, eine für 64-Bit.

Logischerweise dachte ich, ich würde die 32-Bit-DLL unter C: \ Windows \ System32 und die 64-Bit-DLL unter C: \ Windows \ SysWOW64 platzieren.

Zu meiner Überraschung ist es umgekehrt ! Die 32- Bit-DLL geht in C: \ Windows \ SysWOW 64 und die 64- Bit-DLL in C: \ Windows \ System 32 .

Sehr verwirrendes Zeug. Was ist der Grund dafür?

Ganesh verblüfft
quelle
2
Auch dies: Windows sucht im aktuellen Arbeitsverzeichnis sowie im Systempfad. Es gibt keine Möglichkeit, etwas anderes anzugeben. Oh warte, das gibt es. Sie können den Suchpfad in Ihre DLL einbetten. Es ist ein Feld, das 8 Bytes lang ist. Ja. 8 Charaktere.
Jeroen Baert
Dies scheint unter Windows 7 nicht der Fall zu sein. Ausführen einer Datei auf einer DLL in der System32-Datei C: \ Windows \ system32 \ user32.dll C: \ Windows \ system32 \ user32.dll; PE32-ausführbare Datei für MS Windows (DLL) (GUI) Intel 80386 32-Bit Für eine 64-Bit-DLL wird jedoch die ausführbare PE32 + -Datei für MS Windows (DLL) (Konsole) Mono / .Net-Assembly gedruckt. Beachten Sie, dass diese DLL kein .Net ist Versammlung. Es ist eine native DLL.
user877329
Verknüpfen ähnlicher Fragen auf Superuser .
dma_k
11
Interview mit einem Ex-Microsoftie . (Eine ernsthafte Erklärung, wie dies zustande kam, finden Sie in dieser Antwort .)
Tgr
superuser.com/a/157301/241386 "Gründe für die Abwärtskompatibilität. Viele Anwendungen gehen von Dingen aus, die sie nicht annehmen sollten, und von
Hardcode

Antworten:

225

Ich glaube, die Absicht war, System32 umzubenennen, aber so viele Anwendungen, die für diesen Pfad fest codiert sind, dass es nicht möglich war, ihn zu entfernen.

SysWoW64 war nicht für die DLLs von 64-Bit-Systemen gedacht, es ist eigentlich so etwas wie "Windows unter Windows64", dh die Bits, die Sie benötigen, um 32-Bit-Apps unter 64-Bit-Fenstern auszuführen.

Dieser Artikel erklärt ein bisschen:

"Windows x64 hat ein Verzeichnis System32, das 64-Bit-DLLs enthält (sic!). Daher finden native Prozesse mit einer Bitness von 64" ihre "DLLs dort, wo sie sie erwarten: im System32-Ordner. Ein zweites Verzeichnis, SysWOW64, enthält die 32 -bit DLLs. Der Dateisystem-Redirector macht die Magie, das echte System32-Verzeichnis für 32-Bit-Prozesse auszublenden und SysWOW64 unter dem Namen System32 anzuzeigen. "

Bearbeiten: Wenn Sie über ein Installationsprogramm sprechen, sollten Sie den Pfad zum Systemordner nicht fest codieren. Lassen Sie stattdessen Windows für Sie erledigen, je nachdem, ob Ihr Installationsprogramm auf der Emulationsebene ausgeführt wird oder nicht.

Rytmis
quelle
27
Ugh, ich bin heute gerade auf diese Verrücktheit gestoßen. Was für eine irreführende Sache, die sie getan haben.
Andy White
16
Bin auch heute darauf gestoßen ... so verwirrend - Glut 32-Bit-DLL geht in / SysWOW64, Glut 64-Bit-DLL geht in / System32. Jemand sollte das aufschreiben. Im Internet.
Jeroen Baert
8
Die gute Nachricht ist, dass dies als Beispiel für das technische Genie von Microsoft ziemlich selbstdokumentierend ist.
Spike0xff
8
Eine Sache, die ich nicht verstehe, ist, wenn das Dateisystem erkennen kann, dass es sich um eine 32-Bit-App handelt, und sie in den SysWOW64Ordner umleiten kann , warum konnten sie dann nicht stattdessen eine 64-Bit-App erkennen und zu einer umleiten System64?!
Cole Johnson
6
System32 ist die Windows 32-Bit-Version der System-DLLs. System ist die 16-Bit-Version. Dieselbe Firma, die uns Windows 8 zur Verfügung stellte, gab uns SysWow64 für 32-Bit-DLLs und System32 für die 64-Bit-DLLs, wenn sie unter einem 64-Bit-Betriebssystem ausgeführt wurden. In 64-Bit-Systemen ist der Systemordner immer noch der alte 16-Bit-Junk, nur das System32 ist nicht wie vorgeschlagen 32-Bit, und das 32-Bit-Material befindet sich im Systemverzeichnis mit 64 im Namen. Ich verstehe nicht, wie das jemandem hilft. es kompliziert die Dinge und bricht alles. Alles, um Menschen vor der Anpassung von hartcodiertem "System32" an "System64" bei der Konvertierung in 64-Bit zu bewahren. Idiotie
Armand
26

Ich sollte hinzufügen: Sie sollten Ihre DLLs sowieso nicht in \ system32 \ ablegen! Ändern Sie Ihren Code, ändern Sie Ihr Installationsprogramm ... finden Sie unter c: \ windows \ ein Zuhause für Ihre Bits, das sich NICHT irgendwo befindet

Zum Beispiel legt Ihr Installationsprogramm Ihre DLLs ab in:

\program files\<your app dir>\

or

\program files\common files\<your app name>\

( Hinweis : Die Art und Weise, wie Sie dies tatsächlich tun, besteht darin, die Umgebung var:% ProgramFiles% oder% ProgramFiles (x86)% zu verwenden, um herauszufinden, wo sich die Programmdateien befinden. Sie gehen nicht davon aus, dass es sich um c: \ Programme \ handelt. ..)

und setzt dann ein Registrierungs-Tag:

HKLM\software\<your app name>
-- dllLocation

Der Code, der Ihre DLLs verwendet, liest die Registrierung und verknüpft sie dann dynamisch mit den DLLs an diesem Speicherort.

Das Obige ist der kluge Weg.

Sie installieren niemals Ihre DLLs oder DLLs von Drittanbietern in \ system32 \ oder \ syswow64. Wenn Sie statisch laden müssen, legen Sie Ihre DLLs in Ihrem exe-Verzeichnis ab (wo sie gefunden werden). Wenn Sie das exe-Verzeichnis nicht vorhersagen können (z. B. wird eine andere exe Ihre DLL aufrufen), müssen Sie möglicherweise Ihr DLL-Verzeichnis in den Suchpfad einfügen (vermeiden Sie dies, wenn überhaupt möglich!).

system32 und syswow64 sind für Windows bereitgestellte Dateien ... nicht für andere Dateien . Der einzige Grund, warum die Leute die schlechte Angewohnheit hatten, Dinge dort abzulegen, ist, dass sie sich immer im Suchpfad befinden und viele Apps / Module statische Verknüpfungen verwenden. (Wenn Sie sich also wirklich darauf einlassen, ist die wahre Sünde die statische Verknüpfung - dies ist eine Sünde in nativem Code und verwaltetem Code - immer immer immer dynamisch verknüpfen!)

Jonesome stellt Monica wieder her
quelle
9
+1 ... aber ich möchte hinzufügen, dass Sie Variablen wie% PROGRAMFILES% not \ Programme \ verwenden sollten
Rod MacPherson
In den Tagen von XP war es für Entwickler üblich (und empfohlen), die Registrierung für solche Dinge zu verwenden. Mit Windows 7 ist dies nicht mehr wahr! Aus Gründen der Benutzerkontensteuerung, mehrerer Benutzersitzungen usw. sollte die Registrierung in Windows 7 von Entwicklern sparsam und diskret verwendet werden.
Ryyker
@RodMacPherson Meine Antwort wurde verbessert, um Ihren Vorschlag zu berücksichtigen. Sie sind richtig!
Jonesome Reinstate Monica
Nach einiger Überlegung denke ich, dass dies die Frage besser beantwortet - "Wann müssen wir eine Datei unter% SYSTEMROOT% platzieren". Noch nie. Diese Antwort befriedigt nicht die Neugier auf den Ordner syswow64, aber es ist die, die Entwickler wirklich lesen müssen.
Thomas
7

Bin auf dasselbe Problem gestoßen und habe dies einige Minuten lang untersucht.

Mir wurde beigebracht, Windows 3.1 und DOS zu verwenden. Erinnern Sie sich an diese Tage? Kurz nachdem ich einige Zeit ausschließlich mit Macintosh-Computern gearbeitet hatte, begann ich nach dem Kauf eines x64-Bit-Computers wieder zu Windows zurückzukehren.

Es gibt tatsächliche Gründe für diese Änderungen (einige würden sagen, historische Bedeutung), die notwendig sind, damit Programmierer ihre Arbeit fortsetzen können.

Die meisten Änderungen sind oben erwähnt:

  • Program Files vs. Program Files (x86)

    Zu Beginn wurden die 16/86-Bit-Dateien auf '86'-Intel-Prozessoren geschrieben.

  • System32bedeutet wirklich System64(unter 64-Bit-Windows)

    Als Entwickler zum ersten Mal mit Windows 7 arbeiteten, gab es verschiedene Kompatibilitätsprobleme, bei denen andere Anwendungen gespeichert wurden.

  • SysWOW64 bedeutet wirklich SysWOW32

    Im Klartext bedeutet dies im Wesentlichen "Windows unter Windows auf einem 64-Bit-Computer" . Jeder Ordner gibt an, wo sich die DLLs für Anwendungen befinden, die sie verwenden möchten.

Hier sind zwei Links mit allen grundlegenden Informationen, die Sie benötigen:

Hoffe das klärt die Dinge auf!

Knusprig
quelle
4
Wenn Sie ernst genommen werden möchten, sollten Sie wahrscheinlich den Slang abschwächen und die Grammatik verbessern. Vielleicht möchten Sie Ihre Antwort auch etwas strukturierter gestalten und Absätze verwenden.
Klas Mellbourn
2
@Crispy hat die Antwort aufgeräumt. In Zukunft sollten Sie überlegen, was Klas vorschlägt, und Ihre Antwort formatieren, um die Wahrscheinlichkeit von Upvotes zu erhöhen. :)
RekindledPhoenix
Das OP muss komplett neu geschrieben oder sogar entfernt werden. Es ist irreführend und nicht wirklich nützlich.
Jonesome Reinstate Monica
5
SysWOW64 steht eigentlich für: [Sys] tem [W] indows 32-Bit [o] n [W] indows [64] -Bit, also die abgekürzte Form SysWoW64 (was wirklich keinen Sinn macht und Microsoft gerade System32 für 32-Bit-Sachen verlassen hat und ein System64 erstellt, würde es wirklich keine Kompatibilitätsprobleme geben. Was Microsoft in der WoW-Sandbox tut, ist eine Speicherumleitung vom 32-Bit-Zugriff auf System32 als Anforderung an SysWoW64 zu erstellen ... wie ist dies nicht komplizierter als nur das Offenlegen Das Dateisystem im Raw ohne es magisch für die verschiedenen Plattformen neu zuordnen zu müssen? Wie in einem vorherigen Kommentar erwähnt - Idiocy.
Armand
1
Die Antwort bringt mehr Missverständnisse als Klarheit in die Frage. Armands Kommentar ist eine gute Erklärung.
Nahab
5

In System32 hat Windows in der Vergangenheit alle 32-Bit-DLLs platziert, und System war für die 16-Bit-DLLs vorgesehen. Als Microsoft das 64-Bit-Betriebssystem erstellte, erwartete jeder, den ich kenne, dass sich die Dateien unter System64 befinden würden, aber Microsoft entschied, dass es sinnvoller war, 64-Bit-Dateien unter System32 abzulegen. Der einzige Grund, den ich finden konnte, ist, dass sie wollten, dass alles, was 32-Bit war, in einem 64-Bit-Windows funktioniert, ohne dass irgendetwas in den Programmen geändert werden muss - einfach neu kompilieren und fertig. Die Art und Weise, wie sie dies lösten, damit 32-Bit-Anwendungen weiterhin ausgeführt werden konnten, bestand darin, ein 32-Bit-Windows-Subsystem namens Windows32 unter Windows64 zu erstellen. Daher wurde das Akronym SysWOW64 für das Systemverzeichnis des 32-Bit-Subsystems erstellt. Das Sys steht für System und WOW64 für Windows32OnWindows64.
Da Windows 16 bereits von Windows 32 getrennt ist, war keine Windows 16-Äquivalenz unter Windows 64 erforderlich. Wenn ein Programm innerhalb des 32-Bit-Subsystems Dateien aus dem System32-Verzeichnis verwendet, erhält es die Dateien tatsächlich aus dem SysWOW64-Verzeichnis. Aber der Prozess ist fehlerhaft.

Es ist ein schreckliches Design. Und meiner Erfahrung nach musste ich viel mehr Änderungen vornehmen, um 64-Bit-Anwendungen zu schreiben. Das einfache Ändern des System32-Verzeichnisses zum Lesen von System64 wäre eine sehr kleine Änderung gewesen, die von Pre-Compiler-Anweisungen verarbeitet werden soll.

Armand
quelle
2

Andere Leute haben dieses lächerliche Rätsel bereits gut erklärt ... und ich denke, Chris Hoffman hat hier noch bessere Arbeit geleistet: https://www.howtogeek.com/326509/whats-the-difference-between-the- system32-and-syswow64-Ordner-in-Windows /

Meine zwei Gedanken:

  1. Wir alle machen dumme kurzsichtige Fehler im Leben. Als Microsoft sein (zu der Zeit) Win32-DLL-Verzeichnis "System32" nannte, war es zu der Zeit sinnvoll ... sie haben einfach nicht berücksichtigt, was passieren würde, wenn / wenn eine 64-Bit- (oder 128-Bit-) Version von ihrem Betriebssystem wurde später entwickelt - und das massive Abwärtskompatibilitätsproblem, das ein solcher Verzeichnisname verursachen würde. Rückblick ist immer 20-20, also kann ich sie nicht wirklich (zu viel) für einen solchen Fehler verantwortlich machen. ... JEDOCH ... Als Microsoft später sein 64-Bit-Betriebssystem entwickelte, auch im Nachhinein, warum sollten sie nicht nur genau den gleichen kurzsichtigen Fehler WIEDER machen, sondern ihn durch gezieltes Geben noch schlimmer machen ist es so ein irreführender Name?!? Schande über sie!!! Warum nicht MINDESTENS das Verzeichnis "SysWin32OnWin64" nennen, um Verwirrung zu vermeiden?! ? Und was passiert, wenn sie irgendwann ein 128-Bit-Betriebssystem produzieren ... wo werden sie dann ihre 32-Bit-, 64-Bit- und 128-Bit-DLLs ablegen?!?

  2. All diese Logik scheint mir immer noch völlig fehlerhaft zu sein. In 32-Bit-Versionen von Windows enthält System32 32-Bit-DLLs. Unter 64-Bit-Versionen von Windows enthält System32 64-Bit-DLLs ... damit Entwickler keine Codeänderungen vornehmen müssen, richtig? Das Problem mit dieser Logik ist, dass diese Entwickler jetzt entweder 64-Bit-Apps erstellen, die 64-Bit-DLLs benötigen, oder 32-Bit-Apps, die 32-Bit-DLLs benötigen ... Wie auch immer, sind sie nicht immer noch durcheinander? Ich meine, wenn sie noch eine 32-Bit-App erstellen, damit sie jetzt unter 64-Bit-Windows ausgeführt werden kann, müssen sie jetzt eine Codeänderung vornehmen, um dieselbe alte 32-Bit-DLL zu finden / zu referenzieren zuvor verwendet (jetzt in SysWOW64). Oder wenn sie an einer 64-Bit-App arbeiten, müssen sie ihre alte App für das neue Betriebssystem trotzdem neu schreiben ... also wäre sowieso eine Neukompilierung / Neuerstellung erforderlich !!

Microsoft tut mir nur manchmal weh.

Rich Bayless
quelle