Всем привет. Написал мини-драйвер, для мониторинга запускаемых приложений в системе PsSetCreateProcessNotifyRoutine (BSOD) Всем привет. Написал мини-драйвер использующий Код (Text): VOID Notify() { NTSTATUS s = PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, s); if (s == STATUS_SUCCESS) { KDPRINT("NotifyRoutine registered"); } else if (s == STATUS_INVALID_PARAMETER) { KDPRINT("NotifyRoutine has already been registered"); } } VOID NotifyCallback(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create) { if (bCreate) { // load KDPRINT("Loaded new application (PID), %u", ProcessId); } if (!bCreate) { KDPRINT("Application with (PID), %u", ProcessId, "terminated"); } } Загружаю драйвер через KmdKit loader, запускаю DbgView -> получаю сообщения запускаю Notepad комп перезагружается и все, как можно узнать где вылетает драйвер?
ггг, не то отредактировал когда добавлял Код (Text): { NTSTATUS s = PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, false); if (s == STATUS_SUCCESS) { KDPRINT("NotifyRoutine registered"); } else if (s == STATUS_INVALID_PARAMETER) { KDPRINT("NotifyRoutine has already been registered"); } }
VOID UnloadDriver( IN PDRIVER_OBJECT DriverObject ) { PsSetCreateProcessNotifyRoutin((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, TRUE); }
Код (Text): FAULTING_IP: DriverPsNoti+107c f88a907c ?? ??? Что по этому адресу ? Предположу что нотификатор вызывается после выгрузки дрова, следовательно он не удаляется.
JCronuz Оно там пароль просит) Какой тип бсода? DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS? В любом случае, у тебя не стоит никаких синхронизирующих механизмов, что может закончиться тем, что ты выгрузишь драйвер в тот момент, пока другой поток выполняется внутри твоей NotifyCallback.
Да именно так, нет синхронизирующих механизмов! В драйвере из статьи смотрел http://www.codeproject.com/KB/threads/procmon.aspx Код (Text): // // Process function callback // VOID ProcessCallback( IN HANDLE hParentId, IN HANDLE hProcessId, IN BOOLEAN bCreate ) { PDEVICE_EXTENSION extension; // // Assign extension variable // extension = g_pDeviceObject->DeviceExtension; // // Assign current values into device extension. // User-mode apps will pick it up using DeviceIoControl calls. // extension->hParentId = hParentId; extension->hProcessId = hProcessId; extension->bCreate = bCreate; // // Signal the event thus the user-mode apps listening will be aware // that something interesting has happened. // KeSetEvent(extension->ProcessEvent, 0, FALSE); KeClearEvent(extension->ProcessEvent); }
JCronuz Посмотрел минидамп - ну я верно предсказал. Ну в приведенном тобой в последний раз куске кода тоже нет таких механизмов. А не помешало бы. И удалять корректно в DriverUnload нужно твою notification routine. Насчет синхронизации - посмотри в сторону Remove lock (IoInitializeRemoveLock, IoAcquireRemoveLock, IoReleaseRemoveLock, IoReleaseRemoveLockAndWait). И приведи нормальный код DriverUnload. То, что ты привел работать не может - там опечатка, следовательно ты что-то вырезал или добавлял. Приведи оригинал.
Все нормально компилируется Код (Text): //---------------------------------------------------------------------------------------------- // driver.c //---------------------------------------------------------------------------------------------- // // //---------------------------------------------------------------------------------------------- #include <ntddk.h> //---------------------------------- // Device name //---------------------------------- #define DEVICE_NAME L"\\Device\\ProcMon1" #define SYMBOL_NAME L"\\DosDevices\\ProcMon1" //---------------------------------- // Macroses //---------------------------------- #define DEBUG #ifdef DEBUG #define PROCMON_KDPRINT DbgPrint #else #define PROCMON_KDPRINT #endif //---------------------------------- // Prototypes //---------------------------------- VOID DriverUnload(IN PDRIVER_OBJECT DriverObject); //---------------------------------- NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp); VOID SetProcessNotify(IN BOOLEAN state); /*VOID CreateProcessNotifyRoutine (IN HANDLE hParentId, IN HANDLE hProcessId, IN BOOLEAN bCreate); */ //---------------------------------- // Global vars //---------------------------------- //PDEVICE_OBJECT g_pDeviceObject; //ACTIVATE_INFO g_ActivateInfo; //---------------------------------------------------------------------------------------------- /* #ifdef ALLOC_PRAGMA #pragma alloc_text( INIT, DriverEntry ) #pragma alloc_text( PAGE, SioctlCreateClose) #pragma alloc_text( PAGE, SioctlDeviceControl) #pragma alloc_text( PAGE, SioctlUnloadDriver) #pragma alloc_text( PAGE, PrintIrpInfo) #pragma alloc_text( PAGE, PrintChars) #endif // ALLOC_PRAGMA */ //---------------------------------------------------------------------------------------------- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS ntStatus; // Для результатата UNICODE_STRING uszDeviceName; // 2 Юникод строки для устройства и ссылки UNICODE_STRING uszSymbolName; PDEVICE_OBJECT pDeviceObject; // указатель на объект (последний параметр IoCreateDevice) PROCMON_KDPRINT("Driver loaded"); // Инициализируем UNICODE строку RtlInitUnicodeString(&uszDeviceName, DEVICE_NAME); // Создаем объект устройство ntStatus = IoCreateDevice(DriverObject, 0, &uszDeviceName, FILE_DEVICE_UNKNOWN, 0, 0, &pDeviceObject); // Проверяем доступность if (ntStatus != STATUS_SUCCESS) return ntStatus; // Инициализируем UNICODE строку RtlInitUnicodeString(&uszSymbolName, SYMBOL_NAME); // Пробуем создать симольную ссылку ntStatus = IoCreateSymbolicLink(&uszSymbolName, &uszDeviceName); if (ntStatus != STATUS_SUCCESS) { IoDeleteDevice(pDeviceObject); return ntStatus; } // Обрабатываем диспатчеры(Dispatches) DriverObject->DriverUnload = DriverUnload; /* DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIOCTL; */ // Устанавливаем callback SetProcessNotify( FALSE ); return STATUS_SUCCESS; } //---------------------------------------------------------------------------------------------- NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp) { pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = 0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } //---------------------------------------------------------------------------------------------- //VOID //(*PCREATE_PROCESS_NOTIFY_ROUTINE) ( // IN HANDLE ParentId, // IN HANDLE ProcessId, // IN BOOLEAN Create // ); VOID CreateProcessNotifyRoutine (IN HANDLE hParentId, IN HANDLE hProcessId, IN BOOLEAN bCreate) { switch (bCreate) { // Create process case TRUE: PROCMON_KDPRINT("Loaded new application with (PID) = %u", hProcessId); break; // Terminate process case FALSE: PROCMON_KDPRINT("Loaded new application with (PID) = %u", hProcessId); break; } } //---------------------------------------------------------------------------------------------- VOID SetProcessNotify(IN BOOLEAN state) { NTSTATUS ntStatus; // Устанавливаем/удаляем нотификатор ntStatus = PsSetCreateProcessNotifyRoutine( (PCREATE_PROCESS_NOTIFY_ROUTINE)CreateProcessNotifyRoutine, state); switch ( ntStatus ) { case STATUS_SUCCESS: PROCMON_KDPRINT("The given NotifyRoutine is now registered with the system."); break; case STATUS_INVALID_PARAMETER: PROCMON_KDPRINT("The given NotifyRoutine has already been registered, so this call is a redundant call, or the system has reached its limit for registering process-creation callbacks."); break; } } //---------------------------------------------------------------------------------------------- VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { NTSTATUS ntStatus; UNICODE_STRING uszSymbolName; PROCMON_KDPRINT("Driver unloaded"); // Удаление нотификатора из списка SetProcessNotify( TRUE ); IoDeleteDevice(DriverObject->DeviceObject); RtlInitUnicodeString(&uszSymbolName, SYMBOL_NAME); IoDeleteSymbolicLink(&uszSymbolName); } //---------------------------------------------------------------------------------------------- При загрузке снова перезагружается и bluescreenview по прежнему показывает Код (Text): Mini091209-01.dmp 12.09.2009 13:08:34 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 0x100000ce 0xf892e07c 0x00000000 0xf892e07c 0x00000000 Есть пример кода IoInitializeRemoveLock, IoAcquireRemoveLock, IoReleaseRemoveLock, IoReleaseRemoveLockAndWait) Смотрел в этой теме, но там не полностью https://wasm.ru/forum/viewtopic.php?id=22586