Вопрос пользователя касается перевода кода на C++ в среду Delphi для проверки включенности TESTSIGNING. В процессе перевода возникла ошибка "out of memory", которую необходимо решить.
Подтвержденное решение:
Проблема заключается в том, что в исходном коде на Delphi выделяется слишком много памяти, что не требуется для выполнения задачи. Вместо этого следует выделить память только под один экземпляр структуры TSystemCodeIntegrityInformation. Кроме того, в исходном коде не инициализируется поле Length структуры перед вызовом функции NtQuerySystemInformation, что является критически важным.
Исправленный код на Delphi:
program test;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
SysUtils,
Math;
type
NTSTATUS = DWORD;
TSystemInformationClass = SYSTEM_INFORMATION_CLASS;
TNativeQuerySystemInformation = function(SystemInformationClass: TSystemInformationClass; SystemInformation: Pointer; SystemInformationLength: ULONG; ReturnLength: PULONG): NTSTATUS; stdcall;
SYSTEM_CODEINTEGRITY_INFORMATION = record
Length: ULONG;
CodeIntegrityOptions: ULONG;
end;
TSystemCodeIntegrityInformation = SYSTEM_CODEINTEGRITY_INFORMATION;
const
NTDLL_DLL = 'NTDLL.DLL';
STATUS_SUCCESS = $00000000;
var
NtQuerySystemInformation: TNativeQuerySystemInformation = nil;
NTDLLHandle: THandle = 0;
UnloadNTDLL: Boolean;
Status: DWORD;
sci: TSystemCodeIntegrityInformation;
br: ULONG;
function InitNativeAPI: Boolean;
begin
Result := False;
// ... (инициализация NtQuerySystemInformation, как в оригинальном коде)
end;
procedure FreeNativeAPI;
begin
// ... (освобождение ресурсов, как в оригинальном коде)
end;
begin
try
if not InitNativeAPI then
Exit;
try
sci.Length := SizeOf(TSystemCodeIntegrityInformation);
Status := NtQuerySystemInformation(SystemCodeIntegrityInformation, @sci, SizeOf(TSystemCodeIntegrityInformation), @br);
if Status = STATUS_SUCCESS then
WriteLn('TESTSIGNING: ', sci.CodeIntegrityOptions and $1 = 1);
else
WriteLn('0x' + IntToHex(Status, 8));
finally
FreeNativeAPI;
end;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
Шаги исправления:
Убедитесь, что перед вызовом NtQuerySystemInformation поле Length структуры TSystemCodeIntegrityInformation инициализировано размером самой структуры.
Удалите цикл, который увеличивает размер буфера, так как он не требуется для получения информации о TESTSIGNING.
Убедитесь, что после использования ресурсов они корректно освобождаются в блоке finally.
Следуя этим шагам, вы сможете исправить ошибку "out of memory" и успешно проверить статус TESTSIGNING в вашем приложении на Delphi.
Вопрос связан с переводом кода на Delphi для проверки включения TESTSIGNING, где обнаружилась ошибка 'out of memory', которую можно устранить, оптимизировав выделение памяти и инициализировав определенные поля перед вызовом функции `N
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS