PsSetNotifyRoutine ошибка?

Discussion in 'WASM.WIN32' started by Saint German, Nov 12, 2005.

  1. Saint German

    Saint German New Member

    Blog Posts:
    0
    Joined:
    Sep 13, 2003
    Messages:
    222
    Как известно, есть такие функции:
    Code (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.  


    Реализация их довольно простая,
    Code (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 записано:


    Code (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

    Blog Posts:
    0
    Joined:
    Aug 31, 2002
    Messages:
    1,237
    Когда Mark Lucovsky писАл PsSetLoadImageNotifyRoutine, то для начала закопипастил исходник PsSetCreateProcessNotifyRoutine, которую он написАл до этого. Возможно, что первоначально предполагалось использовать параметр Remove, но потом от этого отказались, а комментарий просто забыли поправить.



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



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

    Narkoliga New Member

    Blog Posts:
    0
    Joined:
    Nov 13, 2005
    Messages:
    19
    Location:
    С конопляного поля :)




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