Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибки "out of memory" при перевода кода на Delphi из C++: проверка TESTSIGNING

Delphi , ОС и Железо , Windows

Вопрос пользователя касается перевода кода на 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.

Шаги исправления:

  1. Убедитесь, что перед вызовом NtQuerySystemInformation поле Length структуры TSystemCodeIntegrityInformation инициализировано размером самой структуры.
  2. Удалите цикл, который увеличивает размер буфера, так как он не требуется для получения информации о TESTSIGNING.
  3. Убедитесь, что после использования ресурсов они корректно освобождаются в блоке finally.

Следуя этим шагам, вы сможете исправить ошибку "out of memory" и успешно проверить статус TESTSIGNING в вашем приложении на Delphi.

Создано по материалам из источника по ссылке.

Вопрос связан с переводом кода на Delphi для проверки включения TESTSIGNING, где обнаружилась ошибка 'out of memory', которую можно устранить, оптимизировав выделение памяти и инициализировав определенные поля перед вызовом функции `N


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 17:14:06
2025-12-27 15:36:52/0.0094480514526367/0