2013-03-24 12 views
10

Nie można znaleźć pliku systemowego, jeśli rzeczywiście istnieje - "c: \ windows \ system32 \ alg.exe".Nie można znaleźć pliku systemowego, jeśli faktycznie istnieje.

Przeniosłem się z Win 7 x86 do x64 ostatnio i kiedy byłem na x86 nie miałem z tym problemu, wypróbowałem Delphi 7 & XE2.

Kod używam:

if FileExists('c:\windows\system32\alg.exe') then 
    ShowMessage('fe') else ShowMessage('fne'); 

Próbował przejąć na własność pliku + mojej aplikacji z privilegies admin - sam problem.

Guys, aby sprawdzić, czy 64 ..

function IsWow64Process(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; external 'kernel32.dll'; 

function IS64 : Boolean; 
var 
xIS64 : Bool; 
begin 
if IsWow64Process(GetCurrentProcess, xIS64) then 
    Result := xIS64 else RaiseLastOSError; 
end; 
+1

Jako anegdota (i coś dla modów diamentowych do usunięcia), mogę powiedzieć, że 'alg.exe' nie jest moim ulubionym plikiem w katalogu' System32'. Powód jest raczej prosty: jestem przyzwyczajony do uruchamiania aplikacji poprzez naciśnięcie klawisza Win, wpisanie początku nazwy aplikacji i naciśnięcie klawisza Enter. Teraz jedną z najczęściej używanych aplikacji nosi nazwę "AlgoSim". Myślę, że rozumiesz o co chodzi. –

+0

Mój angielski jest bardziej ubogi niż mój portfel .. Jest w nim tylko 1 $ .. przepraszam – user2200585

+0

@ user2200585 Moja odpowiedź teraz odpowiada na pytanie zadane w twojej edycji. –

Odpowiedz

13

To dlatego, że WOW64 file system redirection, jeśli 32-bitowa aplikacja, która chce uzyskać dostęp do rodzimej katalogu system32, należy użyć funkcji Wow64DisableWow64FsRedirection lub temu Sysnative Alias.

Wow64DisableWow64FsRedirection

Spróbuj tej próbki

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows; 

Function Wow64DisableWow64FsRedirection(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall; 
    External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection'; 
Function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: LongBool): LongBool; StdCall; 
    External 'Kernel32.dll' Name 'Wow64EnableWow64FsRedirection'; 

Var 
    Wow64FsEnableRedirection: LongBool; 
begin 
try 
    if Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection) then 
    begin 
     if FileExists('c:\windows\system32\alg.exe') then 
     Writeln('fe') 
     else 
     Writeln('fne'); 

     if not Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection) then 
     RaiseLastOSError; 
    end 
    else 
    RaiseLastOSError; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 

end. 
end. 

Dodatkowo sprawdzić w dokumentacji MSDN na ten temat.

Aplikacja może kontrolować readresator systemu plików WOW64 pomocą Wow64DisableWow64FsRedirection, Wow64EnableWow64FsRedirection i funkcje Wow64RevertWow64FsRedirection. Wyłączenie przekierowania pliku systemu plików wpływa na wszystkie operacje na plikach wykonywane przez wywołujący wątek , dlatego powinno być wyłączone tylko wtedy, gdy jest to konieczne dla pojedynczego wywołania CreateFile i ponownie włączane natychmiast po przywróceniu funkcji . Wyłączenie przekierowania systemu plików na dłuższy okres czasu może uniemożliwić aplikacjom 32-bitowym ładowanie systemowych bibliotek DLL, powodując awarię aplikacji .

Sysnative aplikacje

32-bitowe mogą uzyskać dostęp do systemu poprzez natywną katalogu zastępując% windir% \ Sysnative do katalogu% windir% \ System32. WOW64 rozpoznaje Sysnative jako specjalny alias używany do wskazania, że ​​plik nie powinien przekierowywać dostępu. Mechanizm ten jest elastyczny i łatwy w użyciu, dlatego jest zalecanym mechanizmem obejścia przekierowania systemu pliku . Należy zauważyć, że aplikacje 64-bitowe nie mogą używać aliasu Sysnative , ponieważ jest to katalog wirtualny, a nie prawdziwy.

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    Windows; 

begin 
try 
    if FileExists('c:\windows\SysNative\alg.exe') then 
    Writeln('fe') 
    else 
    Writeln('fne'); 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 

end. 
+0

Cieszę się, że zredagowałeś odpowiedź, aby uwzględnić ostrzeżenia przed wyłączeniem przekierowania FS. Jednak w przykładowym kodzie brakuje ponownego włączania przekierowania, a także brakuje sprawdzania błędów. Wystarczająco fair, aby pominąć to w próbce, ze względu na łatwą lekturę, ale przynajmniej wyjaśnij, czego brakuje. –

+0

Właśnie włączyłem wywołanie funkcji 'Wow64EnableWow64FsRedirection'. – RRUZ

+0

Dzięki. Moja wskazówka byłaby użycie 'Win32Check()'. Oszczędzi wiele płyt głównych. Być może jestem paranoikiem, ale przeczytałem wynik 'FileExists' na' Boolean', a następnie ponownie włączam. I tylko wtedy reaguj na wartość w tym 'Boolean'. –

11

Masz proces 32-bitowy działa na systemie 64 bitowym. Twój proces działa wewnątrz emulatora WOW64 i podlega File System Redirector. To przekierowuje odniesienia do 64-bitowego folderu systemowego,% windir% \ System32, do 32-bitowego folderu systemowego,% windir% \ SysWOW64.

zalecany sposób, aby uzyskać dostęp do folderu system 64 bitowy, od wewnątrz procesie 32 bitowym systemem pod emulatorem jest użycie% windir% \ Sysnative alias:

32-bitowe aplikacje mogą uzyskać dostęp do macierzysty katalog systemowy przez podstawienie% windir% \ Sysnative dla% windir% \ System32. WOW64 rozpoznaje Sysnative jako specjalny alias używany do wskazania, że ​​system plików nie powinien przekierowywać dostępu. Mechanizm ten jest elastyczny i łatwy w użyciu, dlatego zaleca się obejście przekierowania systemu plików. Zauważ, że aplikacje 64-bitowe nie mogą używać aliasu Sysnative, ponieważ jest to katalog wirtualny, a nie prawdziwy.

Naturalnie ten alias istnieje tylko w systemach 64-bitowych. Najprostszym sposobem sprawdzenia tego jest przetestowanie wartości TOSVersion.Architecture.

Chociaż możliwe jest wyłączenie readresatora, nie jest to wskazane. Dokumentacja mówi:

Aplikacja może kontrolować przekierowania systemu plików WOW64 użyciem funkcji Wow64DisableWow64FsRedirection, Wow64EnableWow64FsRedirection i Wow64RevertWow64FsRedirection. Wyłączenie przekierowania systemu plików wpływa na wszystkie operacje na plikach wykonywane przez wątek wywołujący, dlatego powinno być wyłączone tylko wtedy, gdy jest to konieczne dla pojedynczego wywołania CreateFile i ponownie włączone ponownie natychmiast po powrocie funkcji. Wyłączenie przekierowania systemu plików na dłuższy czas może uniemożliwić aplikacjom 32-bitowym ładowanie systemowych bibliotek DLL, powodując awarię aplikacji.

Zdecydowanie odradzam wyłączanie readresatora systemu plików.

Powiązane problemy