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.Personality>Delphi.Personality</Borland.Personality>
|
||||||
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
|
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
|
||||||
<BorlandProject>
|
<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>
|
<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;
|
function RunVfs (DirListingOrder: VfsBase.TDirListingSortType): LONGBOOL; stdcall;
|
||||||
var
|
var
|
||||||
CurrDir: WideString;
|
CurrDir: WideString;
|
||||||
|
SysDir: WideString;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
with VfsBase.VfsCritSection do begin
|
with VfsBase.VfsCritSection do begin
|
||||||
@ -47,11 +48,16 @@ begin
|
|||||||
if result then begin
|
if result then begin
|
||||||
VfsHooks.InstallHooks;
|
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;
|
CurrDir := WinUtils.GetCurrentDirW;
|
||||||
|
SysDir := WinUtils.GetSysDirW;
|
||||||
|
|
||||||
if CurrDir <> '' then begin
|
if (CurrDir <> '') and (SysDir <> '') then begin
|
||||||
WinUtils.SetCurrentDirW(CurrDir);
|
WinUtils.SetCurrentDirW(SysDir);
|
||||||
|
{!} Assert(WinUtils.SetCurrentDirW(CurrDir), 'Failed to restore current directory from system directory during VFS initialization');
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ unit VfsHooks;
|
|||||||
uses
|
uses
|
||||||
Windows, SysUtils, Math,
|
Windows, SysUtils, Math,
|
||||||
Utils, WinNative, Concur,
|
Utils, WinNative, Concur,
|
||||||
StrLib, Alg,
|
StrLib, Alg, WinUtils,
|
||||||
VfsBase, VfsUtils, VfsPatching,
|
VfsBase, VfsUtils, VfsPatching,
|
||||||
VfsDebug, VfsApiDigger, VfsOpenFiles;
|
VfsDebug, VfsApiDigger, VfsOpenFiles;
|
||||||
|
|
||||||
@ -48,6 +48,10 @@ var
|
|||||||
function GetFilePathByHandle (hFile: THandle): WideString;
|
function GetFilePathByHandle (hFile: THandle): WideString;
|
||||||
begin
|
begin
|
||||||
result := VfsOpenFiles.GetOpenedFilePath(hFile);
|
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;
|
end;
|
||||||
|
|
||||||
(* Returns single absolute path, not dependant on RootDirectory member. '\??\' prefix is always removed, \\.\ and \\?\ paths remain not touched. *)
|
(* 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