необходимо реализовать для win2k... глянул дизасм, там все просто впринципе, достаточно из массива, который можно получить из функции PsSetLoadImageNotifyRoutine удалить наш калбек... А вот в XP я как понял там двухсвязные списки... как добица чтобы дровина работала и под XP и под 2k? один способ вижу.... но он какойто нехороший... есть предложения?
кривая реализация, на WIN2K3 тестили хоть? адреса переменных отличаются... В общем решил я свою проблему, т.к. поиск переменных по смещению в XP, 2k3 ведет к разным результатам, даже разный в разных SP... Решил не изобретать велосипед и сделал так Код (Text): NTSTATUS _PsRemoveLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) { ULONG i,uMajorVersion,uMinorVersion,uPsSetLoadImageNotifyRoutineVA,uPsRemoveLoadImageNotifyRoutineVA; PVOID *PspLoadImageNotifyRoutine; KERNEL_INFO KernelInfo; // ïîëó÷àåì âåðñèþ âèíäû PsGetVersion(&uMajorVersion,&uMinorVersion,NULL,NULL); if((uMajorVersion == 5) && (uMinorVersion == 0)) { // win2k uPsSetLoadImageNotifyRoutineVA = *(PULONG) *(PULONG) ((ULONG) PsSetLoadImageNotifyRoutine + 2); PspLoadImageNotifyRoutine = (PVOID *) (*(PULONG) (uPsSetLoadImageNotifyRoutineVA+8)); // èùåì íàø êàëáåê for(i=0;i<PSP_MAX_LOAD_IMAGE_NOTIFY;i++) { if(PspLoadImageNotifyRoutine[i] == NotifyRoutine) { PspLoadImageNotifyRoutine[i] = NULL; return STATUS_SUCCESS; } } } else { if(!NT_SUCCESS(GetKernelInfo(&KernelInfo))) return STATUS_UNSUCCESSFUL; uPsRemoveLoadImageNotifyRoutineVA = GetProcRva(KernelInfo.uBase,"PsRemoveLoadImageNotifyRoutine"); if(!uPsRemoveLoadImageNotifyRoutineVA) { myfree(KernelInfo.cModuleName); return STATUS_UNSUCCESSFUL; } uPsRemoveLoadImageNotifyRoutineVA += KernelInfo.uBase; __asm { push NotifyRoutine call uPsRemoveLoadImageNotifyRoutineVA } myfree(KernelInfo.cModuleName); return STATUS_SUCCESS; } return STATUS_UNSUCCESSFUL; }