Существование файла и переадресация System32
Возник вопрос: нужно узнать существует ли файл в папке system32.
Код:
if (GetFileAttributes(PChar('C:\Windows\System32\unrar64.dll')) <> INVALID_FILE_ATTRIBUTES) then
showmessage('64');
if (GetFileAttributes(PChar('C:\Windows\Syswow64\unrar.dll')) <> INVALID_FILE_ATTRIBUTES) then
showmessage('32'); // system32 для x86 приложений
showmessage('64');
if (GetFileAttributes(PChar('C:\Windows\Syswow64\unrar.dll')) <> INVALID_FILE_ATTRIBUTES) then
showmessage('32'); // system32 для x86 приложений
Я же хочу собрать x86 приложение, что бы можно было запускать его как на старых так и на новых компьютерах.
Проблема заключается в том что Windows врубает переадресацию в папку SysWOW64 для x86 приложений
На данный момент нашел не самый хороший способ решения проблемы через функцию wow64disablewow64fsredirection и createfile.
Может быть я не вижу слона и есть более красивое решение?
P.S. Проверяю на Win8 64
Источник
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. Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.
То есть для x86 процессов на x64 системе получить доступ можно из папки %WinDir%system32 для (x86) и %WinDir%SysNative для (x64)
А для x64 процессов на x64 системах папки SysNative не существует, так как она виртуальная и в ней папка %WinDir%system32 для (x64) , а %WinDir%SysWOW64 для (x86)
Для x86 процессов:
%WinDir%system32 - x86
%WinDir%SysNative - x64
Для x64 процессов:
%WinDir%system32 - x64
%WinDir%SysWOW64 - x86
Если мне не изменяет память, это и есть штатный способ. Вызовом функции ты же не запрещаешь перенаправление вообще, а только отключаешь его для своего приложения, давая знать системе, что в твоей 32-битной программе запуск из-под 64-битной ОС предусмотрен как отдельный случай.