Почему проверка файла `myexe.exe` в папках `C:\Program Files` и `C:\Program Files (x86)` даёт разные результаты и роль функции `Wow64DisableWow64FsRedirection`
Почему проверка файла myexe.exe в папках C:\Program Files и C:\Program Files (x86) даёт разные результаты и роль функции Wow64DisableWow64FsRedirection
Вопрос о различиях в результатах проверки существования файла в разных папках C:\Program Files и C:\Program Files (x86) на 64-битных системах Windows является довольно специфическим и связан с особенностями работы файловой системы в таких системах. Давайте разберемся в этом вопросе, используя примеры кода на Object Pascal (Delphi).
Описание проблемы
На 64-битных системах Windows, если вы запускаете 32-битное приложение, то папка C:\Program Files будет отображаться как 32-битная, а C:\Program Files (x86) как 64-битная. Это связано с технологией WOW64 (Windows 32-bit on Windows 64-bit), которая позволяет запускать 32-битные приложения на 64-битных системах.
Роль функции Wow64DisableWow64FsRedirection
Функция Wow64DisableWow64FsRedirection предназначена для отключения механизма перенаправления файловой системы, который используется WOW64. Это может быть полезно, когда вам нужно обращаться к файлам непосредственно, без перенаправления, вызванного WOW64.
Подтвержденный ответ
Файловая система Windows в 64-битных системах работает таким образом, что некоторые пути, например %windir%\system32, перенаправляются. Однако папки C:\Program Files и C:\Program Files (x86) не подвержены перенаправлению, и различие в результатах проверки существования файла обусловлено их разным назначением в контексте 32-битного и 64-битного приложений.
Вот пример кода на Delphi, который проверяет существование файла в папке, соответствующей 64-битной версии Program Files:
function GetEnvironmentString(aString: string): string;
var
dest: string;
retSize: integer;
begin
SetLength(dest, MAX_PATH);
retSize := ExpandEnvironmentStrings(pchar(aString), pchar(dest), MAX_PATH);
if retSize > 0 then
SetLength(dest, retSize - 1);
Result := dest;
end;
var
ProgramW6432: string;
begin
ProgramW6432 := GetEnvironmentString('%ProgramW6432%');
if FileExists(ProgramW6432 + '\my app\myexe.exe') then
// Файл существует в папке 64-битного Program Files
else
// Файл не существует в папке 64-битного Program Files
end;
Обратите внимание, что переменная окружения %ProgramW6432% доступна только в 32-битных приложениях, запущенных на Windows 7 и более поздних версиях.
Альтернативный ответ
Для определения разрядности текущей системы можно использовать функцию IsWow64Process. Вот пример кода на Delphi, который проверяет, является ли текущий процесс 64-битным:
function IsWow64: Boolean;
type
TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
var
IsWow64Result: BOOL;
IsWow64Process: TIsWow64Process;
begin
// Пробуем загрузить необходимую функцию из kernel32
IsWow64Process := GetProcAddress(GetModuleHandle('kernel32.dll'), 'IsWow64Process');
if Assigned(IsWow64Process) then
begin
// Функция реализована: вызываем её
if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
raise Exception.Create('IsWow64: bad process handle');
// Возвращаем результат функции
Result := IsWow64Result = TRUE;
end
else
// Функция не реализована: не может быть запущено под WOW64
Result := False;
end;
Используя эти функции, можно корректно обращаться к файлам в 64-битных системах, учитывая особенности работы WOW64 и перенаправления файловой системы.
Заключение
Таким образом, различие в результатах проверки файла в папках C:\Program Files и C:\Program Files (x86) обусловлено их назначением для 32-битных и 64-битных приложений соответственно. Функция Wow64DisableWow64FsRedirection может быть использована для отключения механизма перенаправления, если это необходимо для работы вашего приложения.
Вопрос касается различий в доступе к файлам в папках `C:\Program Files` и `C:\Program Files (x86)` на 64-битных системах Windows, обусловленных технологией WOW64, и роли функции `Wow64DisableWow64FsRedirection` в управлении этим доступом.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.