Zugriffe auf "%windir%\System32" und Unterverzeichnisse

3. September 2017 · Programmierung · andreas · Kein Kommentar

Einer der Gründe, warum in der EDV zeitliche Voraussagen so schwer zu treffen sind, ist die Tatsache, daß man immer wieder über Dinge stolpert, mit denen man nicht gerechnet hat.

Beim Versuch, ein Aufräumskript für die Hinterlassenschaften des AMD-Treibers in Perl zu schreiben, wurde eine Datei nicht gefunden, die laut Explorer und Eingabeaufforderung aber sehr wohl vorhanden war:

C:\Windows\System32\drivers>dir ati2erec.dll
...
 Verzeichnis von C:\Windows\System32\drivers

21.11.2014  04:08            43.520 ati2erec.dll
               1 Datei(en),         43.520 Bytes

Die gleiche Aufgabenstellung als Perl-Skript

use strict;
use warnings;
if (-e 'C:\Windows\System32\drivers\ati2erec.dll') { print "found.\n"; }
else { print "not found.\n"; }

führte aber zur überraschenden Ausgabe

not found.

Wie so oft, wenn es um seltsame Dinge in Windows geht, handelt es sich hierbei aber um ein Feature und keinen Bug, wobei das Feature aber erst einmal gefunden werden muß. Im konkreten Fall hört es auf den Namen “File System Redirector” und sorgt dafür, daß

In most cases, whenever a 32-bit application attempts to access %windir%\System32, the access is redirected to %windir%\SysWOW64.

Dies erklärt das obige Phänomen, da die verwendte Perl-Version eine 32-bit Anwendung ist. Freundlicherweise liefert der MSDN-Artikel auch gleich eine Lösung

32-bit applications can access the native system directory by substituting %windir%\Sysnative for %windir%\System32. WOW64 recognizes Sysnative as a special alias used to indicate that the file system should not redirect the access. This mechanism is flexible and easy to use, therefore, it is the recommended mechanism to bypass file system redirection.

so daß der Zugriff auf ‘C:\Windows\Sysnative\drivers\ati2erec.dll’ dann tatsächlich ein

found.

als Ergebnis liefert. Das “flexible and easy to use” möchte ich aber durchaus in Frage stellen, denn

Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.

bedeutet letztendlich eine entsprechende Abfrage im Skript, damit - je nach verwendetem Interpreter - der Pfad entweder auf “System32” oder “Sysnative” gesetzt wird.