Need to convert \Device\HarddiskVolume1\WINDOWS\system32\calc.exe
to C:\windows\system32\calc.exe
I'm hooking createsection btw
Thanks!
Procedure MapSymbolicLinks(const LV: TListView);
const mem_sz = 16000;
var
p: PChar;
sz, i: cardinal;
buf: array [0..MAX_PATH] of char;
sl: TStringList;
begin
sl := TStringList.Create();
try
GetMem(p, mem_sz);
ZeroMemory(@buf, sizeof(buf));
sz := QueryDosDevice(nil, @p^, mem_sz);
for i := 1 to sz do
if p[i] = #0 then
p[i] := #10;
sl.CommaText := p;
lv.Items.BeginUpdate();
for i := 0 to sl.count-1 do
begin
with
Lv.Items.Add() do
begin
Caption := sl[i];
QueryDosDevice(@PChar(sl[i])^, @buf, sizeof(buf));
with Subitems do
Add(buf);
end;
end;
finally
FreeMem(p);
sl.Free;
Lv.Items.EndUpdate();
end;
end;function LogicFromSymbolic(const SymLink: string): string;
const mem_sz = 16000;
var
p: PChar;
sz, i: cardinal;
buf: array [0..MAX_PATH] of char;
sl, sl2: TStringList;
begin
if SymLink = '' then
Exit;
Sl := TStringList.Create();
Sl2 := TStringList.Create();
try
GetMem(p, mem_sz);
ZeroMemory(@buf, sizeof(buf));
sz := QueryDosDevice(nil, @p^, mem_sz);
for i := 1 to sz do
if (p[i] = #0) then
p[i] := #10;
Sl.CommaText := p;
for i := 0 to Sl.Count-1 do
begin
QueryDosDevice(@PChar(Sl[i])^, @buf, sizeof(buf));
Sl2.values[buf]:= Sl[i];
end;
if (SymLink[1] <> '\') then
result := Sl2.Values['\' + SymLink]
else
result := Sl2.Values[SymLink]
finally
FreeMem(p);
Sl.Free;
Sl2.Free;
end;
end;
function LogicFromSymbolic(const SymLink: string): string;
const mem_sz = 16000;
var
p: PChar;
sz, i: cardinal;
buf: array [0..MAX_PATH] of char;
sl, sl2: TStringList;
begin
result := '';
if SymLink = '' then
Exit;
Sl := TStringList.Create();
Sl2 := TStringList.Create();
try
GetMem(p, mem_sz);
ZeroMemory(@buf, sizeof(buf));
sz := QueryDosDevice(nil, @p^, mem_sz);
for i := 1 to sz do
if (p[i] = #0) then
p[i] := #10;
Sl.CommaText := p;
for i := 0 to Sl.Count-1 do
begin
QueryDosDevice(@PChar(Sl[i])^, @buf, sizeof(buf));
Sl2.values[buf]:= Sl[i];
end;
if (SymLink[1] <> '\') then
result := Sl2.Values['\' + SymLink]
else
result := Sl2.Values[SymLink]
finally
FreeMem(p);
Sl.Free;
Sl2.Free;
end;
end;
function LogicFromSymbolic(const SymLink: string): string;
const mem_sz = 16000;
var
p: PChar;
sz, i: cardinal;
buf: array [0..MAX_PATH] of char;
sl: TStringList;
begin
result := '';
if SymLink = '' then
Exit;
Sl := TStringList.Create();
try
GetMem(p, mem_sz);
ZeroMemory(@buf, sizeof(buf));
sz := QueryDosDevice(nil, @p^, mem_sz);
for i := 1 to sz do
if (p[i] = #0) then
p[i] := #10;
Sl.CommaText := p;
for i := 0 to Sl.Count-1 do
begin
QueryDosDevice(@PChar(Sl[i])^, @buf, sizeof(buf));
if (lstrcmpi(@PChar(SymLink)^, @buf) = 0) then
begin
result := Sl[i];
Break;
end;
end;
finally
FreeMem(p);
Sl.Free();
end;
end;
function LogicFromSymbolic(const SymLink: string): string;
function GetMemNeeded: Integer;
var
dwSize: DWord;
pTargetString: PChar;
begin
dwSize := 1;
repeat
pTargetString := StrAlloc(dwSize);
Result := QueryDosDevice(nil,pTargetString,dwSize);
StrDispose(pTargetString);
dwSize := dwSize+dwSize;
until Result <> 0;
end;
var
pTargetString: PChar;
buf: PChar;
dwMemNeeded: Integer;
dwFrom: Integer;
pDevice: PChar;
I: Integer;
begin
Result := '';
dwMemNeeded := GetMemNeeded;
pTargetString := StrAlloc(dwMemNeeded);
buf := StrAlloc(MAX_PATH);
dwMemNeeded := QueryDosDevice(nil, pTargetString, dwMemNeeded);
for i := 0 to dwMemNeeded-1 do
begin
if pTargetString[i] = '#' then
pTargetString[i] := #0;
end;
dwFrom := 0;
while (dwFrom < dwMemNeeded) do
begin
pDevice := PChar(@pTargetString[dwFrom]);
QueryDosDevice(pDevice, buf, MAX_PATH);
if (buf = SymLink) then
Result := pDevice;
dwFrom := dwFrom+Length(pDevice)+1;
end;
StrDispose(buf);
StrDispose(pTargetString);
end;
function FileNameFromFileHandle(const hF: HFILE): string; stdcall;
type
UNICODE_STRING = packed record
len: Word;
maxlen: Word;
buf: PWideChar;
end;
OBJECT_NAME_INFORMATION = record
name: UNICODE_STRING;
end;
const
ONI = 1;
UNICODE_MAX_PATH = MAX_PATH *sizeof(WCHAR);
var
ret: Integer;
status: Integer;
pONI: ^OBJECT_NAME_INFORMATION;
ZwQueryObject: TZwQueryObject;
begin
result := '';
@ZwQueryObject := GetProcAddress(GetModuleHandleW('ntdll.dll'), 'ZwQueryObject');
if @ZwQueryObject = nil then
Exit;
GetMem(pONI, UNICODE_MAX_PATH);
ZeroMemory(pOni, sizeof(OBJECT_NAME_INFORMATION));
status := ZwQueryObject(hF, ONI, @pONI^, UNICODE_MAX_PATH, ret);
if NT_SUCCESS(status) then
result := WideToAnsiEx(@pONI^.name.buf^);
FreeMem(pONI);
end;
function LogicFromSymbolic(const SymLink: string): string;
const
mem_sz = 16000;
var
p: PChar;
sz, i: cardinal;
buf: array [0..MAX_PATH] of char;
sl: TStringList;
begin
result := '';
if SymLink = '' then Exit;
Sl := TStringList.Create();
try
GetMem(p, mem_sz);
ZeroMemory(@buf, sizeof(buf));
sz := QueryDosDevice(nil, @p^, mem_sz);
for i := 1 to sz do
if (p[i] = #0) then
p[i] := #10;
Sl.CommaText := p;
MsgOk(IntToStr(SL.Count));
for i := 0 to Sl.Count-1 do
begin
QueryDosDevice(@PChar(Sl[i])^, @buf, sizeof(buf));
if (lstrcmpi(@PChar(SymLink)^, @buf) = 0) then
begin
result := Sl[i];
Break;
end;
end;
finally
FreeMem(p);
Sl.Free();
end;
end;
Users browsing this forum: No registered users and 0 guests