關掉64位系統中32位程序的目錄重定向
在64位Windows系統中運行的32位程序會被系統欺騙.
例如windows\system32的目錄實際是windows\syswow64目錄的映射.
program files實際是program files(x86)的映射.
注冊表的hkey_local_machine\software實際是hkey_local_machine\software\wow6432node子鍵的映射.
那么如何訪問到真正的64位程序的目錄和注冊表呢?關掉目錄重定向即可.
關閉文件的重定向:
var
OldWow64RedirectionValue: LongBool;
function DisableWowRedirection: Boolean;
type
TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection
: LongBool): LongBool; StdCall;
var
hHandle: THandle;
Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
begin
Result := true;
try
hHandle := GetModuleHandle('kernel32.dll');
@Wow64DisableWow64FsRedirection := GetProcAddress(hHandle,
'Wow64DisableWow64FsRedirection');
if ((hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then
Wow64DisableWow64FsRedirection(OldWow64RedirectionValue);
except
Result := False;
end;
end;
function RevertWowRedirection: Boolean;
type
TWow64RevertWow64FsRedirection = function(var Wow64RevertWow64FsRedirection
: LongBool): LongBool; StdCall;
var
hHandle: THandle;
Wow64RevertWow64FsRedirection: TWow64RevertWow64FsRedirection;
begin
Result := true;
try
hHandle := GetModuleHandle('kernel32.dll');
@Wow64RevertWow64FsRedirection := GetProcAddress(hHandle,
'Wow64RevertWow64FsRedirection');
if ((hHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then
Wow64RevertWow64FsRedirection(OldWow64RedirectionValue);
except
Result := False;
end;
end;
注冊表就很簡單了:
var
r: TRegistry;
begin
r := TRegistry.Create;
r.RootKey := HKEY_LOCAL_MACHINE;
r.Access := r.Access or KEY_WOW64_64KEY; //注意這一行.
if r.OpenKey('SOFTWARE\abc', true) then
begin
r.WriteString('test', 'test');
end;
r.Free;
end;
參考:http://www.raysoftware.cn/?p=131
