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.
NtQuerySystemInformation и другие Nt функции
Мне нужно использовать в своей программе функцию NtQuerySystemInformation и другие ей подобные. Есть ли какой-нибудь, например, nt.pas, чтобы можно было спокойно пользоваться функциями без предварительного вызова их с помощью LoadLibrary и GetProcAddress?
вот тебе пример:
Код:
Эти функции объявлены в winternl.h - он небольшой, главное грамотно написать порт.
Да, лень что-то было. Попробую написать. Спасибо за пример. Насчет грамотности я что-то сомневаюсь, так что, если возникнут вопросы, надеюсь на помощь(например, проверить скорее всего надо будет).
Для динамического связывания можно поступить следующим образом:
Код:
...
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.
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.
Про динамическое связывание понял. Спасибо. Я тут предпринял все-таки попытку портировать Winternl.h и хотелось бы чтоб кто-нибудь проверил. Выкладываю Winternl.pas там ошибок наверное, но я старался. Если что не так, то обязательно подскажите.
Я нашёл всётаки модуль (сам когда-то портировал). Передалал в динамическое связывание.
Вообще-то в NTDLL тьма функций - winternl импортирует только малую часть из них.
Спасибо огромное! Теперь еще попробую разобраться, что я сделал не так при портировании, непосредственно сравнивая с оригиналом. Еще раз спасибо.