Ну, basead в мой последний вопрос:Native API: RtlInitUnicodeString перенастройки странные символы
How build a path to file using Native Api and open with NtOpenFile api?
как @Remy Лебо предложил RtlInitUnicodeString()
работает очень хорошо, когда SourceString имеет тип:
'\??\c:\test.txt'
.
Уже в этом случае здесь после RtlInitUnicodeString()
значения в буфера всегда:
'dfᄸɟ\Device\HarddiskVolume2\Windows\SysWOW64\gdi32.dll'
см:
со странными символами на старте. И таким образом ясно, что NtOpenFile()
не удастся.
Кто-то знает что-то, чтобы решить эту проблему, пожалуйста?
Вот моя последняя попытка:
uses
Winapi.Windows,
System.SysUtils,
System.Classes,
NtDll,
ntdll_;
var
hmod: HMODULE = 0
type
{ .: MEMORY_INFORMATION_CLASS :. }
_MEMORY_INFORMATION_CLASS = (MemoryBasicInformation, MemoryWorkingSetList,
MemoryMappedFilenameInformation, MemorySectionName,
MemoryBasicVlmInformation);
MEMORY_INFORMATION_CLASS = _MEMORY_INFORMATION_CLASS;
TMemoryInformationClass = MEMORY_INFORMATION_CLASS;
PMemoryInformationClass = ^TMemoryInformationClass;
{ .: UNICODE STRING:. }
PUnicodeString = ^TUnicodeString;
TUnicodeString = packed record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
///////////////////////////////////////////////////////////////////////////////
procedure UnhookPfn(pfn: Pointer);
const
OBJ_CASE_INSENSITIVE = $00000040;
NtCurrentProcess = THandle(-1);
var
pinth: PImageNtHeaders32;
StrUnicode : TNtUnicodeString
Name: PUnicodeString;
oa: TNtObjectAttributes;
rcb: SIZE_T;
begin
if ((RtlPcToFileHeader(pfn, @hmod)) <> (NtNotImplementedPointer)) then
begin
pinth := RtlImageNtHeader(hmod);
GetMem(Name, SizeOf(Name));
FillChar(Name^,SizeOf(Name),#0);
if (0 <= NtQueryVirtualMemory(NtCurrentProcess, Pointer(hmod),
Integer(MemoryMappedFilenameInformation), Pointer(Name), MAX_PATH * SizeOf(WCHAR),
@rcb)) then
begin
RtlInitUnicodeString(@StrUnicode, PWideChar(Name));
InitializeObjectAttributes(@oa, @StrUnicode, OBJ_CASE_INSENSITIVE, 0, nil);
end;
FreeMem(Name);
end;
{ ::: Usage ::: }
/// /////////////////////////////////////////////////////////////////////////////
var
BitBltAddr: Pointer;
begin
try
hmod := GetModuleHandle('Gdi32.dll');
BitBltAddr := GetProcAddress(hmod, 'BitBlt');
UnhookPfn(BitBltAddr);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
EDITION 1:(внушение @RbMm)
procedure UnhookPfn(pfn: Pointer);
const
OBJ_CASE_INSENSITIVE = $00000040;
NtCurrentProcess = THandle(-1);
var
pinth: PImageNtHeaders32;
Name: PUnicodeString;
rcb: SIZE_T;
iosb: TIoStatusBlock;
oa: TNtObjectAttributes;
StrPath : TNtUnicodeString;
begin
if ((RtlPcToFileHeader(pfn, @hmod)) <> (NtNotImplementedPointer)) then
begin
pinth := RtlImageNtHeader(hmod);
GetMem(Name, SizeOf(Name));
FillChar(Name^,SizeOf(Name),#0);
if (0 <= NtQueryVirtualMemory(NtCurrentProcess, Pointer(hmod),
Integer(MemoryMappedFilenameInformation), Pointer(Name), MAX_PATH * SizeOf(WCHAR), // Name buffer = '\Device\HarddiskVolume2\Windows\SysWOW64\gdi32.dll'
@rcb)) then
begin
InitializeObjectAttributes(@oa, @Name, OBJ_CASE_INSENSITIVE, 0, nil); // buffer of ObjectName = 'strange character'
end;
EDITION 2:
Окончательное решение этой проблемы, как сказал @RbMm был:
InitializeObjectAttributes(@oa, Name, OBJ_CASE_INSENSITIVE, 0, nil);
Извлечь все, что необходимо, и включить все это в вопрос. Я много раз писал эту ссылку: [mcve]. Можете ли вы подтвердить, прочитали ли вы его или нет? Также, пожалуйста, прочтите следующее: http://sscce.org/ –
И, наконец, в N-й раз, почему вы используете собственный API? –
@DavidHeffernan, [потому что был предложен этому пользователю Луис Эдуардо] (http://stackoverflow.com/questions/41928081/how-restore-inline-hook), используйте Native api для этой задачи. –