Delphi 禁用x64位系統文件重定向功能
在X64系統裏面,一些特殊的目錄和特殊的註冊表鍵被分為2個獨立的部分。對於文件系統來說,
%systemroot%\system32 目錄被保留給64位文件使用,而32位文件會被重定向到%systemroot%\SysWOW64目錄。
換句話說,所有的32位程序一般情況下只會出現在%systemroot%\SysWOW64目錄裏面。
任何32位程序試圖訪問%systemroot%\system32 目錄的企圖都會被重定向到%systemroot%\SysWOW64目錄。
這個是一個默認的行為,除非程序的線程明確的指名需要關閉這種重定向機制。
在Win7 64位系統下,調用CopyFile函數進行函數拷貝,如果希望拷貝文件到System32目錄下,
需要考慮程序是不是也是64位的,否則,程序會被重定向到Syswow64目錄下,
為了防止出現文件被重定向,就需要調用函數Wow64DisableWow64FsRedirection取消文件的重定向,
並在完成指定功能後調用Wow64RevertWow64FsRedirection函數進行恢復。
HKEY_LOCAL_MACHINE\Software下新建一個項,然後使用64位的註冊表編輯器查看,
會發現這個項只會出現在HKEY_LOCAL_MACHINE\Software\Wow6432Node鍵下而不會出
門用於存放64位程序所使用的註冊表數據的,而HKEY_LOCAL_MACHINE\Software\Wow6432Node
鍵是專門用於存放32位程序所使用的註冊表數據的。
var OldWow64RedirectionValue: LongBool;
function DisableWowRedirection: Boolean;
type TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection: LongBool): LongBool;
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;
http://blog.csdn.net/gj333/article/details/8268379
Delphi 禁用x64位系統文件重定向功能