PsSetNotifyRoutine ошибка?

Тема в разделе "WASM.WIN32", создана пользователем Saint German, 12 ноя 2005.

  1. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Как известно, есть такие функции:
    Код (Text):
    1.  
    2. NTSTATUS
    3.   PsSetLoadImageNotifyRoutine(
    4.     IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine
    5.     );
    6. NTSTATUS
    7.   PsSetCreateThreadNotifyRoutine(
    8.     IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine
    9.     );
    10. NTSTATUS
    11.   PsSetCreateProcessNotifyRoutine(
    12.     IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
    13.     IN BOOLEAN  Remove
    14.     );
    15.  


    Реализация их довольно простая,
    Код (Text):
    1.  
    2. for (i=0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++) {
    3.         if (Remove) {
    4.             if (PspCreateProcessNotifyRoutine[i] == NotifyRoutine) {
    5.                 PspCreateProcessNotifyRoutine[i] = NULL;
    6.                 PspCreateProcessNotifyRoutineCount -= 1;
    7.                 return STATUS_SUCCESS;
    8.             }(это на примере, CreateProcessNotifyRoutine)
    9.  


    Причем, все три функции, имеют одинаковый принцип действия, но у PsSetLoadImageNotifyRoutine, PsSetCreateThreadNotifyRoutine нет параметра Remove,

    это тоже всем известно, но известно ли, почему?

    Почему это так? Ведь как и в случае с PsSetCreateProcessNotifyRoutine удалить просто - из таблицы калбеков удаляется один из элементов, отсутствие

    параметра Remove, делает мой драйвер штатноневыгружаемым.

    Из каких соображений происходит дискриминация функций

    PsSetCreateThreadNotifyRoutine, PsSetLoadImageNotifyRoutine?

    А теперь самое интересное, в "Откровениях Иоана",

    в файле ntos\ps\create.c записано:


    Код (Text):
    1.  
    2. NTSTATUS
    3. PsSetLoadImageNotifyRoutine(
    4.     IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function allows a device driver to get notified for
    12.     image loads. The notify is issued for both kernel and user
    13.     mode image loads system-wide.
    14.  
    15. Arguments:
    16.  
    17.     NotifyRoutine - Supplies the address of a routine which is called at
    18.         image load. The routine is passed information describing the
    19.         image being loaded.
    20.  
    21.         The callout for creation happens just after the image is loaded
    22.         into memory but before executiona of the image.
    23.  
    24.     Remove - FALSE specifies to install the callout and TRUE specifies to
    25.         remove the callout that mat
    26.  
    27. Return Value:
    28.  
    29.     STATUS_SUCCESS if successful, and STATUS_INVALID_PARAMETER if not.
    30.  
    31. --*/
    32.  




    Ну и какие теперь будут предположения?:)
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Когда Mark Lucovsky писАл PsSetLoadImageNotifyRoutine, то для начала закопипастил исходник PsSetCreateProcessNotifyRoutine, которую он написАл до этого. Возможно, что первоначально предполагалось использовать параметр Remove, но потом от этого отказались, а комментарий просто забыли поправить.



    Это я, естественно, предполагаю, но наверняка так и было.



    В XP ядром уже экспортируются PsRemoveCreateThreadNotifyRoutine и PsRemoveLoadImageNotifyRoutine. Так что в ХР+ этот функционал добавили и теперь можно снять нотифай, установленный соответственно PsSetCreateThreadNotifyRoutine и PsSetLoadImageNotifyRoutine.
     
  3. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)




    Если глянуть дизасм ядра в XP, то реализация там уже другая, в виде двухсвязного списка.