Windows NT-service common function type

Тема в разделе "WASM.NT.KERNEL", создана пользователем retmas, 22 апр 2010.

  1. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Господа!

    Хотелось бы реализовать общий тип-ф-ия для сервисов.

    Т.е. (далее псевдо-код!)

    typedef
    (NTAPI *PNTSERVICE)(
    ...
    );

    далее по коду

    PNTSERVICE _NtCreateEvent =
    (PNTSERVICE)GetSystemSevicePtrByName("NtCreateEvent");

    Status = _NtCreateEvent(
    &EventHandle,
    DesiredAccess,
    NULL,
    NotificationEvent,
    FALSE
    );

    и т.д.


    Возможно ли подобный сценарий реализовать?

    P.S. проблема данного кода - объявление stdcall-ф-ии с переменным числом аргументов - чего, конечно же, не существует, поэтому реально PNTSERVICE - cdecl. Соответственно, очевидно, получаем иногда exceptions.
     
  2. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    О да! и прошу __asm не предлагать! Ищется что-нить симпатичное С/C++.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Если правильно помню, вот такое у меня работало (x86):

    Код (Text):
    1. int (__stdcall* pNtCreateEvent) () = SdtGetServiceAddressByName (...);
     
  4. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    x86?

    а как вызывали?
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    В заголовках объявлена функция NtCreateEvent, как обычно:
    Код (Text):
    1. __kernel_entry NTSYSCALLAPI
    2. NTSTATUS
    3. NTAPI
    4. NtCreateEvent (
    5.     __out PHANDLE EventHandle,
    6.     __in ACCESS_MASK DesiredAccess,
    7.     __in POBJECT_ATTRIBUTES ObjectAttributes,
    8.     __out PIO_STATUS_BLOCK IoStatusBlock
    9.     );
    Использование тоже происходит обычным образом:
    Код (Text):
    1. DriverEntry()
    2. {
    3.     HANDLE event;
    4.     NtCreateEvent(&event);
    5. }
    Однако при линковке подключается сгенерированная либа, что-то среднее между библиотекой импорта и delay-load библиотекой. Т.е. символ "__imp_NtCreateEvent" определён, и по его адресу изначально располагается адрес thunk'а, ответственного за поиск функции и (как правило) заменяющего адрес себя на адрес нужной функции.
    Разумеется, возможны и несколько изменённые реализации.

    ^Это релевантно теме только если мы правильно поняли, чего один хочет добиться. Собственно, по-другом воспринять это сложно, ибо другие варианты либо бессмысленны, либо решения для них слишком очевидны, как то: указатель на функцию – в PVOID, освобождение – шаблоны и перегрузка.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    retmas
    Не предлагаю, просто пример обьявления в сурсах ядра:
    Код (Text):
    1. ; Module Name:
    2. ;
    3. ;    sysstubs.asm
    4. ;
    5. ; Abstract:
    6. ;
    7. ;    This module implements the system service dispatch stub procedures.
    8. ;
    9. ; Revision History:
    10. ;       Use Fast System call mechanism.
    11. ;
    12.  
    13. SYSSTUBS_ENTRY1 macro ServiceNumber, Name, NumArgs
    14. cPublicProc _Zw&Name,NumArgs
    15. .FPO ( 0, NumArgs, 0, 0, 0, 0 )
    16.         extrn   _KiSystemService:PROC
    17.         mov     eax, ServiceNumber      ; (eax) = service number
    18.         lea     edx, [esp]+4            ; (edx) -> arguments
    19.         pushfd                          ; EFLAGS to trap frame
    20.         push    KGDT_R0_CODE            ; CS to trap frame
    21.         call    _KiSystemService        ; EIP to trap frame and enter handler
    22.         stdRET  _Zw&Name
    23. stdENDP _Zw&Name
    24. endm
    25.  
    26. SYSSTUBS_ENTRY1  0, AcceptConnectPort, 6
    Тоесть число параметров указывается явно. Судя по имени GetSystemSevicePtrByName() возвращает ссылку на сервис(Nt), тогда логично былобы находить не только указатель, но и число параметров из стаба, определить для этого структуру, через которую далее сервисы юзать. Как с этим справится скрипт не знаю.
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Обычно:

    Код (Text):
    1. Status = pNtCreateEvent (
    2.     &EventHandle,
    3.     DesiredAccess,
    4.     NULL,
    5.     NotificationEvent,
    6.     FALSE);
     
  8. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Хм, но вы определили тип-ф-ию без параметров!!! компилятор такого не потерпит...
     
  9. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    А.. да, Вы, наверное, используете Си компилятор, я же C++. В C++ такие фокусы не проходят.
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Тем хуже для C++.
     
  11. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Оставь грабли для любителей острых ощущений, определи с параметрами и получишь проверки на этапе кампеляции. По теме вникай в пост Sol_Ksacap
     
  12. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    не следует вникать.
    реализовано с помощью шаблонных классов.
    всем спасибо.