-
В реестре (например) вижу, что ссылка ссылается на файл %SystemRoot%\system32\aelupsvc.dll. Открываю проводник, захожу в c:\windows\system32, ищу aelupsvc.dll. Есть. Открываю Far, ищу тамже, файл есть. Захожу в дельфи, новый проект, на форме кнопка, в кнопке пишу:
if fileexixsts('c:\windows\system32\aelupsvc.dll') then showmessage('Yes') else showmessage('No'); Выполняю, пишет No.
пробовал через findfirst искать и через прямое открытие файла, оба файл в упор не видят. прогу запускал от имени админа, прова на файл проверял, владельца менял. файл для примера, там таких куча, вот еще из папки system32: alg.exe appidsvc.dll appinfo.dll audiosrv.dll bfe.dll certprop.dll defragsvc.dll ...
Есть хитрый момент: если их загружать через h:=loadlibraryex(Pchar(<имя>),0,$20); то h<>0.
Вопрос: Нет ли какого другого способа определить наличие такого файла на диске?
Проверьте, у кого вин7 (на 2008r2 тоже пробовал), на одном из файлов которые перечислил, все ли так?
Мысли есть?
Win7x64sp1, Rad2010
-
т.е. это получается, что (например создать список файлов в листвиев)
findfirst('c:\windows\system32\*.*',faanyfile,sr); repeat it:=ListView1.Items.Add; it.Caption:=sr.Name; until findnext(sr)<>0; findclose(sr);
их не показывает, хотя проводник, Far и Total - эти файлы видят. что за бяка такая?
-
а, вру, Total тоже не видит, он вроде как раз на дельфях написан. что ето за ущемление такое? :)
-
вместо faanyfile попробуй что то типа $000000FF; не получится, добавь еще F справа и т.д. (что то смутно помню в винде добавляли какой то атрибут файлам ... в старом дельфи его естественно нет. не помню какой, ну и искать неохота)
-
> sniknik (21.03.2011 08:02:03) [3]
Пробовать над FFFFFFFF
-
У меня семерка, правда 32 битная, все файлы видятся нормально.
-
у тебя другой SystemRoot
-
Наверно, ведь та же их аж три
-
Возможно, флаг индексации? См. выделение жирным: FILE_ATTRIBUTE_DEVICE = $00000040;
FILE_ATTRIBUTE_SPARSE_FILE = $00000200;
FILE_ATTRIBUTE_REPARSE_POINT = $00000400;
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = $00002000;
FILE_ATTRIBUTE_ENCRYPTED = $00004000;
faNormal = FILE_ATTRIBUTE_NORMAL;
faTemporary = FILE_ATTRIBUTE_TEMPORARY;
faCompressed = FILE_ATTRIBUTE_COMPRESSED;
faOffline = FILE_ATTRIBUTE_OFFLINE;
faDevice = FILE_ATTRIBUTE_DEVICE platform; faSparse = FILE_ATTRIBUTE_SPARSE_FILE;
faReparsePoint = FILE_ATTRIBUTE_REPARSE_POINT;
faNotIndexed = FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
faEncrypted = FILE_ATTRIBUTE_ENCRYPTED;
-
> Возможно, флаг индексации? в семерке анифайл = $0000003F; т.что все, что любой одиночный флаг значением больше этого не увидит (?).
-
> Мысли есть? > > Win7x64sp1, Rad2010 > >
Есть, работает перенаправление файлового ввода-вывода.
-
-
2 DVM спасибо.
Все равно непонятно пока ничего.
Папку с system64 получаю так:
Function GetSystemWow64Directory(lpBuffer:LPTSTR;uSize:Uint):uint; stdcall; external 'Kernel32.dll' name 'GetSystemWow64DirectoryW';
Function GetSys64Dir:string; var Buffer:Array[0..max_path] of Char; begin Result:='';If GetSystemWow64Directory(Buffer,max_path)=0 Then Exit;Result:=IncludeTrailingBackslash(string(Buffer)); end;
на там этих файлов тоже нет. полазил поискал, оказывается они распиханы по куче папок вида:
C:\Windows\winsxs\amd64_microsoft-windows-<разные ID>\
Вопросики тогда: 1. как дельфям сказать, чтобы они внимания не обращали на этот редирект и файлы эти искали там где винда говорит что они есть? 2. или получать реальные места файла, зная их имя и путь, на который винда ссылается?
т.е. еще раз: винда говорит, что есть файл c:\windows\system32\alg.exe, и в проводнике его видно по этому пути, дельфи его не находит, т.к. он реально лежит в C:\Windows\winsxs\amd64_microsoft-windows-alg_31bf3856ad364e35_6.1.7600.16385_none_04de43c774cf8fe3\alg.exe - вот как получить этот путь?
и не могли бы пояснить, поможет ли функция Wow64DisableWow64FsRedirection и к чему ведет ее применение?
-
да и игры с атрибутами ничего не дают (там где выше предложения про индексацию) и рут верный, SHGetSpecialFolderPath (The Windows directory or SYSROOT. This corresponds to the %windir% or %SYSTEMROOT% environment variables. A typical path is C:\Windows.) рут возвращает как c:\windows, также как getwindowsdir
-
еее, заработало.
Function Wow64DisableWow64FsRedirection(x:Pointer):bool; stdcall; external 'Kernel32.dll' name 'Wow64DisableWow64FsRedirection'; Function Wow64RevertWow64FsRedirection(x:boolean):boolean; stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection';
... var p:pointer; begin Wow64DisableWow64FsRedirection(p); if fileexists('c:\windows\system32\alg.exe') then showmessage('Yes'); Wow64RevertWow64FsRedirection(true);
в findfirst тоже работаит... правда реальный путь все еще не знаю как получить, зная только редиректорный. 2 DVM может знаете выход?
-
упс, не то вставил, вместо
Function Wow64EnableWow64FsRedirection(x:boolean):boolean; stdcall; external 'Kernel32.dll' name 'Wow64EnableWow64FsRedirection';
надо
Function Wow64RevertWow64FsRedirection(x:boolean):boolean; stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection';
и вместо Wow64RevertWow64FsRedirection(true); соответственно Wow64EnableWow64FsRedirection(true);
а для реверта правильно будет: Function Wow64RevertWow64FsRedirection(x:Pointer):bool; stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection';
-
> Function Wow64RevertWow64FsRedirection(x:boolean):boolean; > stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection'
[6] таки верно
-
> Gu (21.03.11 22:04) [14] > еее, заработало. > > Function Wow64DisableWow64FsRedirection(x:Pointer):bool; > stdcall; external 'Kernel32.dll' name 'Wow64DisableWow64FsRedirection'; > > Function Wow64RevertWow64FsRedirection(x:boolean):boolean; > stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection'; > >
Использование этих функций очень опасно. Их можно использовать только в том случае, если ты можешь мамой поклясться, что никакой шайтан явно или неявно не решит загрузить какую либо dll из системного каталога между вызовами этих функций. Никто гарантий не даст.
-
> Игорь Шевченко © (21.03.11 22:25) [16]
Имхо не совсем. %SystemRoot% всегда один и тот же, это папка типа C:\Windows\ , а вот system32 меняется. Хотя не понятно, что имелось в виду под SystemRoot - без % написано.
-
|