Как известно, есть такие функции: Код (Text): NTSTATUS PsSetLoadImageNotifyRoutine( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine ); NTSTATUS PsSetCreateThreadNotifyRoutine( IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine ); NTSTATUS PsSetCreateProcessNotifyRoutine( IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, IN BOOLEAN Remove ); Реализация их довольно простая, Код (Text): for (i=0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++) { if (Remove) { if (PspCreateProcessNotifyRoutine[i] == NotifyRoutine) { PspCreateProcessNotifyRoutine[i] = NULL; PspCreateProcessNotifyRoutineCount -= 1; return STATUS_SUCCESS; }(это на примере, CreateProcessNotifyRoutine) Причем, все три функции, имеют одинаковый принцип действия, но у PsSetLoadImageNotifyRoutine, PsSetCreateThreadNotifyRoutine нет параметра Remove, это тоже всем известно, но известно ли, почему? Почему это так? Ведь как и в случае с PsSetCreateProcessNotifyRoutine удалить просто - из таблицы калбеков удаляется один из элементов, отсутствие параметра Remove, делает мой драйвер штатноневыгружаемым. Из каких соображений происходит дискриминация функций PsSetCreateThreadNotifyRoutine, PsSetLoadImageNotifyRoutine? А теперь самое интересное, в "Откровениях Иоана", в файле ntos\ps\create.c записано: Код (Text): NTSTATUS PsSetLoadImageNotifyRoutine( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine ) /*++ Routine Description: This function allows a device driver to get notified for image loads. The notify is issued for both kernel and user mode image loads system-wide. Arguments: NotifyRoutine - Supplies the address of a routine which is called at image load. The routine is passed information describing the image being loaded. The callout for creation happens just after the image is loaded into memory but before executiona of the image. Remove - FALSE specifies to install the callout and TRUE specifies to remove the callout that mat Return Value: STATUS_SUCCESS if successful, and STATUS_INVALID_PARAMETER if not. --*/ Ну и какие теперь будут предположения?
Когда Mark Lucovsky писАл PsSetLoadImageNotifyRoutine, то для начала закопипастил исходник PsSetCreateProcessNotifyRoutine, которую он написАл до этого. Возможно, что первоначально предполагалось использовать параметр Remove, но потом от этого отказались, а комментарий просто забыли поправить. Это я, естественно, предполагаю, но наверняка так и было. В XP ядром уже экспортируются PsRemoveCreateThreadNotifyRoutine и PsRemoveLoadImageNotifyRoutine. Так что в ХР+ этот функционал добавили и теперь можно снять нотифай, установленный соответственно PsSetCreateThreadNotifyRoutine и PsSetLoadImageNotifyRoutine.