mirror of
https://github.com/CloudDelphi/Virtual-File-System
synced 2025-12-19 09:53:54 +01:00
Improved current directory handle detection using hack of double SetCurrentDirectoryW for different paths
This commit is contained in:
parent
fd913906a2
commit
2c4004dc5a
18
Vfs.dproj
18
Vfs.dproj
@ -30,23 +30,7 @@
|
||||
<Borland.Personality>Delphi.Personality</Borland.Personality>
|
||||
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
|
||||
<BorlandProject>
|
||||
<BorlandProject><Delphi.Personality><Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><VersionInfo><VersionInfo Name="IncludeVerInfo">True</VersionInfo><VersionInfo Name="AutoIncBuild">True</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1049</VersionInfo><VersionInfo Name="CodePage">1251</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName">Alexander Shostak (aka EtherniDee)</VersionInfoKeys><VersionInfoKeys Name="FileDescription">Virtual File System</VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Source><Source Name="MainSource">Vfs.dpr</Source></Source><Excluded_Packages>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<BorlandProject><Delphi.Personality><Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><VersionInfo><VersionInfo Name="IncludeVerInfo">True</VersionInfo><VersionInfo Name="AutoIncBuild">True</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">1</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1049</VersionInfo><VersionInfo Name="CodePage">1251</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName">Alexander Shostak (aka EtherniDee)</VersionInfoKeys><VersionInfoKeys Name="FileDescription">Virtual File System</VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.1.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Source><Source Name="MainSource">Vfs.dpr</Source></Source><Excluded_Packages>
|
||||
|
||||
|
||||
<Excluded_Packages Name="$(BDS)\bin\dcloffice2k100.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
|
||||
@ -37,6 +37,7 @@ type
|
||||
function RunVfs (DirListingOrder: VfsBase.TDirListingSortType): LONGBOOL; stdcall;
|
||||
var
|
||||
CurrDir: WideString;
|
||||
SysDir: WideString;
|
||||
|
||||
begin
|
||||
with VfsBase.VfsCritSection do begin
|
||||
@ -47,11 +48,16 @@ begin
|
||||
if result then begin
|
||||
VfsHooks.InstallHooks;
|
||||
|
||||
// Try to ensure, that current directory handle is tracked by VfsOpenFiles
|
||||
// Hask: Try to ensure, that current directory handle is tracked by VfsOpenFiles
|
||||
// Windows SetCurrentDirectoryW is does not reopen directory for the same path, thus
|
||||
// not triggering NtCreateFile
|
||||
// Not thread safe
|
||||
CurrDir := WinUtils.GetCurrentDirW;
|
||||
SysDir := WinUtils.GetSysDirW;
|
||||
|
||||
if CurrDir <> '' then begin
|
||||
WinUtils.SetCurrentDirW(CurrDir);
|
||||
if (CurrDir <> '') and (SysDir <> '') then begin
|
||||
WinUtils.SetCurrentDirW(SysDir);
|
||||
{!} Assert(WinUtils.SetCurrentDirW(CurrDir), 'Failed to restore current directory from system directory during VFS initialization');
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ unit VfsHooks;
|
||||
uses
|
||||
Windows, SysUtils, Math,
|
||||
Utils, WinNative, Concur,
|
||||
StrLib, Alg,
|
||||
StrLib, Alg, WinUtils,
|
||||
VfsBase, VfsUtils, VfsPatching,
|
||||
VfsDebug, VfsApiDigger, VfsOpenFiles;
|
||||
|
||||
@ -48,6 +48,10 @@ var
|
||||
function GetFilePathByHandle (hFile: THandle): WideString;
|
||||
begin
|
||||
result := VfsOpenFiles.GetOpenedFilePath(hFile);
|
||||
|
||||
if (result = '') and VfsDebug.LoggingEnabled then begin
|
||||
WriteLog('GetFilePathByHandle', Format('Failed to get path for handle %x. Current directory is: %s', [integer(hFile), WinUtils.GetCurrentDirW]));
|
||||
end;
|
||||
end;
|
||||
|
||||
(* Returns single absolute path, not dependant on RootDirectory member. '\??\' prefix is always removed, \\.\ and \\?\ paths remain not touched. *)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user