mirror of
https://github.com/CloudDelphi/Virtual-File-System
synced 2025-12-19 09:53:54 +01:00
VfsPatching now uses global static memory block. NtQueryDirectoryFile patch is rollbacked during finalization
This commit is contained in:
parent
4fbc7cddd0
commit
745737abdf
@ -607,7 +607,8 @@ begin
|
|||||||
NativeNtQueryDirectoryFile := VfsPatching.SpliceWinApi
|
NativeNtQueryDirectoryFile := VfsPatching.SpliceWinApi
|
||||||
(
|
(
|
||||||
VfsApiDigger.GetRealProcAddress(NtdllHandle, 'NtQueryDirectoryFile'),
|
VfsApiDigger.GetRealProcAddress(NtdllHandle, 'NtQueryDirectoryFile'),
|
||||||
@Hook_NtQueryDirectoryFile
|
@Hook_NtQueryDirectoryFile,
|
||||||
|
@NtQueryDirectoryFilePatch
|
||||||
);
|
);
|
||||||
end; // .if
|
end; // .if
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@ unit VfsPatching;
|
|||||||
(***) interface (***)
|
(***) interface (***)
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, SysUtils, Utils, PatchForge;
|
Windows, SysUtils, Utils, PatchForge, Concur;
|
||||||
|
|
||||||
type
|
type
|
||||||
PAppliedPatch = ^TAppliedPatch;
|
PAppliedPatch = ^TAppliedPatch;
|
||||||
@ -18,6 +18,7 @@ type
|
|||||||
procedure Rollback;
|
procedure Rollback;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
(* Replaces original STDCALL function with the new one with the same prototype and one extra argument.
|
(* Replaces original STDCALL function with the new one with the same prototype and one extra argument.
|
||||||
The argument is callable pointer, used to execute original function. The pointer is passed as THE FIRST
|
The argument is callable pointer, used to execute original function. The pointer is passed as THE FIRST
|
||||||
argument before other arguments. *)
|
argument before other arguments. *)
|
||||||
@ -32,6 +33,36 @@ type
|
|||||||
TPatchMaker = PatchForge.TPatchMaker;
|
TPatchMaker = PatchForge.TPatchMaker;
|
||||||
TPatchHelper = PatchForge.TPatchHelper;
|
TPatchHelper = PatchForge.TPatchHelper;
|
||||||
|
|
||||||
|
const
|
||||||
|
PERSISTENT_MEM_CAPACITY = 100 * 1024;
|
||||||
|
|
||||||
|
var
|
||||||
|
PersistentMemCritSection: Concur.TCritSection;
|
||||||
|
PersistentMem: array [0..PERSISTENT_MEM_CAPACITY - 1] of byte;
|
||||||
|
PersistentMemPos: integer;
|
||||||
|
|
||||||
|
|
||||||
|
procedure AllocPersistentMem (var Addr; Size: integer);
|
||||||
|
begin
|
||||||
|
{!} Assert(@Addr <> nil);
|
||||||
|
{!} Assert(Size >= 0);
|
||||||
|
|
||||||
|
with PersistentMemCritSection do begin
|
||||||
|
Enter;
|
||||||
|
pointer(Addr) := nil;
|
||||||
|
|
||||||
|
try
|
||||||
|
if PersistentMemPos + Size > High(PersistentMem) then begin
|
||||||
|
raise EOutOfMemory.Create('Failed to allocate another persistent memory block of size ' + SysUtils.IntToStr(Size));
|
||||||
|
end;
|
||||||
|
|
||||||
|
pointer(Addr) := @PersistentMem[PersistentMemPos];
|
||||||
|
Inc(PersistentMemPos, Size);
|
||||||
|
finally
|
||||||
|
Leave;
|
||||||
|
end;
|
||||||
|
end; // .with
|
||||||
|
end; // .procedure AllocPersistentMem
|
||||||
|
|
||||||
(* Writes arbitrary data to any write-protected section *)
|
(* Writes arbitrary data to any write-protected section *)
|
||||||
function WriteAtCode (NumBytes: integer; {n} Src, {n} Dst: pointer): boolean;
|
function WriteAtCode (NumBytes: integer; {n} Src, {n} Dst: pointer): boolean;
|
||||||
@ -119,7 +150,7 @@ begin
|
|||||||
// === END generating SpliceBridge ===
|
// === END generating SpliceBridge ===
|
||||||
|
|
||||||
// Persist splice bridge
|
// Persist splice bridge
|
||||||
GetMem(SpliceBridge, p.Size);
|
AllocPersistentMem(SpliceBridge, p.Size);
|
||||||
WritePatchAtCode(p.PatchMaker, SpliceBridge);
|
WritePatchAtCode(p.PatchMaker, SpliceBridge);
|
||||||
|
|
||||||
// Turn result from offset to absolute address
|
// Turn result from offset to absolute address
|
||||||
@ -147,4 +178,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
PersistentMemCritSection.Init;
|
||||||
end.
|
end.
|
||||||
Loading…
Reference in New Issue
Block a user