Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


В качестве примера. Под Вашу ответственность!
Отключение перенаправления
Код: Выделить весь код
//========================================================================================
// Отключение перенаправления при работе 32-битного приложения в 64-битной ОС ////////////
//========================================================================================

// результат, определение разрядности ОС 
function IsWow64: Boolean;
type
  TIsWow64Process = function(Handle: Windows.THandle; var Res: Windows.BOOL)
    : Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL;
  IsWow64Process: TIsWow64Process;
begin
  IsWow64Process := Windows.GetProcAddress
    (Windows.GetModuleHandle('kernel32.dll'), 'IsWow64Process');
  if Assigned(IsWow64Process) then
  begin
    if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then
      raise SysUtils.Exception.Create('IsWow64: bad process handle');
    Result := IsWow64Result;
  end
  else
    Result := False;
end;

// результат, отключение/включение перенаправления
function ChangeFSRedirection(bDisable: boolean): boolean;
type
  TWow64DisableWow64FsRedirection = function(Var Wow64FsEnableRedirection
    : LongBool): LongBool; stdcall;
  TWow64EnableWow64FsRedirection = function(var Wow64FsEnableRedirection
    : LongBool): LongBool; stdcall;
var
  hHandle: THandle;
  Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
  Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
  Wow64FsEnableRedirection: LongBool;

begin
  Result := True;

  if not IsWow64 then
    exit;

  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64EnableWow64FsRedirection := GetProcAddress(hHandle,
      'Wow64EnableWow64FsRedirection');
    @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle,
      'Wow64DisableWow64FsRedirection');

    if bDisable then
    begin
      If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and
        (@Wow64DisableWow64FsRedirection <> nil)) Then
        Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
    end;

    if not bDisable then
      If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and
        (@Wow64DisableWow64FsRedirection <> nil)) Then
        Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);

  Except
    Result := False;
  end;
end;

{применение}

// отключаем перенаправление
ChangeFSRedirection(true);

// что-то делаем с файлами или реестром
...
// например, открываем файл в \system32, а не в \SysWOW64 
OpenFile('C:\Windows\system32\einedatei.txt');
...
// включаем перенаправление
ChangeFSRedirection(false);

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:56, 28-02-2016 | #33