Господа! Хотелось бы реализовать общий тип-ф-ия для сервисов. Т.е. (далее псевдо-код!) typedef (NTAPI *PNTSERVICE)( ... ); далее по коду PNTSERVICE _NtCreateEvent = (PNTSERVICE)GetSystemSevicePtrByName("NtCreateEvent"); Status = _NtCreateEvent( &EventHandle, DesiredAccess, NULL, NotificationEvent, FALSE ); и т.д. Возможно ли подобный сценарий реализовать? P.S. проблема данного кода - объявление stdcall-ф-ии с переменным числом аргументов - чего, конечно же, не существует, поэтому реально PNTSERVICE - cdecl. Соответственно, очевидно, получаем иногда exceptions.
Если правильно помню, вот такое у меня работало (x86): Код (Text): int (__stdcall* pNtCreateEvent) () = SdtGetServiceAddressByName (...);
В заголовках объявлена функция NtCreateEvent, как обычно: Код (Text): __kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCreateEvent ( __out PHANDLE EventHandle, __in ACCESS_MASK DesiredAccess, __in POBJECT_ATTRIBUTES ObjectAttributes, __out PIO_STATUS_BLOCK IoStatusBlock ); Использование тоже происходит обычным образом: Код (Text): DriverEntry() { HANDLE event; NtCreateEvent(&event); } Однако при линковке подключается сгенерированная либа, что-то среднее между библиотекой импорта и delay-load библиотекой. Т.е. символ "__imp_NtCreateEvent" определён, и по его адресу изначально располагается адрес thunk'а, ответственного за поиск функции и (как правило) заменяющего адрес себя на адрес нужной функции. Разумеется, возможны и несколько изменённые реализации. ^Это релевантно теме только если мы правильно поняли, чего один хочет добиться. Собственно, по-другом воспринять это сложно, ибо другие варианты либо бессмысленны, либо решения для них слишком очевидны, как то: указатель на функцию – в PVOID, освобождение – шаблоны и перегрузка.
retmas Не предлагаю, просто пример обьявления в сурсах ядра: Код (Text): ; Module Name: ; ; sysstubs.asm ; ; Abstract: ; ; This module implements the system service dispatch stub procedures. ; ; Revision History: ; Use Fast System call mechanism. ; SYSSTUBS_ENTRY1 macro ServiceNumber, Name, NumArgs cPublicProc _Zw&Name,NumArgs .FPO ( 0, NumArgs, 0, 0, 0, 0 ) extrn _KiSystemService:PROC mov eax, ServiceNumber ; (eax) = service number lea edx, [esp]+4 ; (edx) -> arguments pushfd ; EFLAGS to trap frame push KGDT_R0_CODE ; CS to trap frame call _KiSystemService ; EIP to trap frame and enter handler stdRET _Zw&Name stdENDP _Zw&Name endm SYSSTUBS_ENTRY1 0, AcceptConnectPort, 6 Тоесть число параметров указывается явно. Судя по имени GetSystemSevicePtrByName() возвращает ссылку на сервис(Nt), тогда логично былобы находить не только указатель, но и число параметров из стаба, определить для этого структуру, через которую далее сервисы юзать. Как с этим справится скрипт не знаю.
Обычно: Код (Text): Status = pNtCreateEvent ( &EventHandle, DesiredAccess, NULL, NotificationEvent, FALSE);
Оставь грабли для любителей острых ощущений, определи с параметрами и получишь проверки на этапе кампеляции. По теме вникай в пост Sol_Ksacap