Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

NtQuerySystemInformation и другие Nt функции

257
10 июля 2006 года
kosfiz
1.6K / / 18.09.2005
Мне нужно использовать в своей программе функцию NtQuerySystemInformation и другие ей подобные. Есть ли какой-нибудь, например, nt.pas, чтобы можно было спокойно пользоваться функциями без предварительного вызова их с помощью LoadLibrary и GetProcAddress?
5
10 июля 2006 года
hardcase
4.5K / / 09.08.2005
А разве так трудно паписать собственный порт из ntdll.dll?
вот тебе пример:
Код:
unit Winternl;

interface

uses
  Windows;

const
  NTDLL = 'ntdll.dll'

type
  NTSTATUS = type LongInt;

  SYSTEM_INFORMATION_CLASS = (
      SystemBasicInformation = 0,
      SystemPerformanceInformation = 2,
      SystemTimeOfDayInformation = 3,
      SystemProcessInformation = 5,
      SystemProcessorPerformanceInformation = 8,
      SystemInterruptInformation = 23,
      SystemExceptionInformation = 33,
      SystemRegistryQuotaInformation = 37,
      SystemLookasideInformation = 45
  );

  SYSTEM_BASIC_INFORMATION = packed record
      Reserved1: array[0..23] of Byte;
      Reserved2: array[0..3] of Pointer;
      NumberOfProcessors: byte;
  end;


function NtQuerySystemInformation(
    SystemInformationClass: SYSTEM_INFORMATION_CLASS;
    SystemInformation: Pointer;
    SystemInformationLength: cardinal;
    var ReturnLength: cardinal
  ): NTSTATUS; stdcall;

function NtClose(
    Handle: THandle
  ): HTSTATUS; stdcall;

implementation

function NtQuerySystemInformation; external NTDLL;
function NtClose; external NTDLL;

end.


Эти функции объявлены в winternl.h - он небольшой, главное грамотно написать порт.
257
10 июля 2006 года
kosfiz
1.6K / / 18.09.2005
Да, лень что-то было. Попробую написать. Спасибо за пример. Насчет грамотности я что-то сомневаюсь, так что, если возникнут вопросы, надеюсь на помощь(например, проверить скорее всего надо будет).
5
11 июля 2006 года
hardcase
4.5K / / 09.08.2005
Кстати сейчас вспомнил, в ntdll функции часто меняются и статическая линковка функций может привести к краху при попытке запустить приложение.
Для динамического связывания можно поступить следующим образом:
Код:
...
interface
...
var NtQuerySystemInformation: function(
    SystemInformationClass: SYSTEM_INFORMATION_CLASS;
    SystemInformation: Pointer;
    SystemInformationLength: cardinal;
    var ReturnLength: cardinal
  ): NTSTATUS; stdcall;

implementation

var
  NtDllLib: cardinal;

initialization
  NtDllLib:=LoadLibrary(NTDLL);
  if NtDllLib <> 0 then begin
     NtQuerySystemInformation:=GetProcAddress(NtDllLib, 'NtQuerySystemInformation');
  end;
finalization
  FreeLibrary(NtDllLib);
end.

Этот способ удобен тем, что при запуске приложения мы можем сразу проверить нужные нам функции на равенство NIL - тогда мы говорим пользователю "до свидания", а не Halt'имся с сообщением вроде function XXX not found in library XXX.
257
11 июля 2006 года
kosfiz
1.6K / / 18.09.2005
Про динамическое связывание понял. Спасибо. Я тут предпринял все-таки попытку портировать Winternl.h и хотелось бы чтоб кто-нибудь проверил. Выкладываю Winternl.pas там ошибок наверное, но я старался. Если что не так, то обязательно подскажите.
5
11 июля 2006 года
hardcase
4.5K / / 09.08.2005
Ошибки действительно есть.
Я нашёл всётаки модуль (сам когда-то портировал). Передалал в динамическое связывание.
Вообще-то в NTDLL тьма функций - winternl импортирует только малую часть из них.
257
11 июля 2006 года
kosfiz
1.6K / / 18.09.2005
Спасибо огромное! Теперь еще попробую разобраться, что я сделал не так при портировании, непосредственно сравнивая с оригиналом. Еще раз спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог