PsSetCreateProcessNotifyRoutine где-то BSOD

Тема в разделе "WASM.NT.KERNEL", создана пользователем JCronuz, 9 сен 2009.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Всем привет.

    Написал мини-драйвер, для мониторинга запускаемых приложений в системе

    PsSetCreateProcessNotifyRoutine (BSOD)

    Всем привет.
    Написал мини-драйвер использующий
    Код (Text):
    1. VOID Notify()
    2. {
    3.     NTSTATUS s = PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, s);
    4.     if (s == STATUS_SUCCESS)
    5.     {
    6.         KDPRINT("NotifyRoutine registered");
    7.     }
    8.  
    9.     else if (s == STATUS_INVALID_PARAMETER)
    10.     {
    11.         KDPRINT("NotifyRoutine has already been registered");
    12.     }
    13. }
    14.  
    15.  
    16.  
    17. VOID NotifyCallback(HANDLE ParentId,
    18.             HANDLE ProcessId,
    19.             BOOLEAN Create)
    20. {
    21.     if (bCreate)
    22.     {
    23.         // load
    24.         KDPRINT("Loaded new application (PID), %u", ProcessId);
    25.     }
    26.    
    27.     if (!bCreate)
    28.     {
    29.         KDPRINT("Application with (PID), %u", ProcessId, "terminated");
    30.     }
    31. }
    Загружаю драйвер через KmdKit loader, запускаю DbgView -> получаю сообщения запускаю Notepad комп перезагружается и все, как можно узнать где вылетает драйвер?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Честно говоря, этот ахтунг даже комментировать не хочется. Минимум 3 ошибки.
     
  3. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    гг, +1))
     
  4. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    ггг, не то отредактировал когда добавлял :dntknw:
    Код (Text):
    1. {
    2.     NTSTATUS s = PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, false);
    3.     if (s == STATUS_SUCCESS)
    4.     {
    5.         KDPRINT("NotifyRoutine registered");
    6.     }
    7.  
    8.     else if (s == STATUS_INVALID_PARAMETER)
    9.     {
    10.         KDPRINT("NotifyRoutine has already been registered");
    11.     }
    12. }
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    VOID UnloadDriver(
    IN PDRIVER_OBJECT DriverObject
    )
    {
    PsSetCreateProcessNotifyRoutin((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyCallback, TRUE);

    }
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    Крэшдамп покажите.
     
  7. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    minidump
    http://webfile.ru/3904602
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. FAULTING_IP:
    2. DriverPsNoti+107c
    3. f88a907c ??              ???
    Что по этому адресу ?
    Предположу что нотификатор вызывается после выгрузки дрова, следовательно он не удаляется.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    JCronuz
    Оно там пароль просит)
    Какой тип бсода? DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS?
    В любом случае, у тебя не стоит никаких синхронизирующих механизмов, что может закончиться тем, что ты выгрузишь драйвер в тот момент, пока другой поток выполняется внутри твоей NotifyCallback.
     
  10. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Да именно так, нет синхронизирующих механизмов!
    В драйвере из статьи смотрел
    http://www.codeproject.com/KB/threads/procmon.aspx

    Код (Text):
    1. //
    2. // Process function callback
    3. //
    4. VOID ProcessCallback(
    5.     IN HANDLE  hParentId,
    6.     IN HANDLE  hProcessId,
    7.     IN BOOLEAN bCreate
    8.     )
    9. {
    10.     PDEVICE_EXTENSION extension;
    11.     //
    12.     // Assign extension variable
    13.     //
    14.     extension = g_pDeviceObject->DeviceExtension;
    15.     //
    16.     // Assign current values into device extension.  
    17.     // User-mode apps will pick it up using DeviceIoControl calls.
    18.     //
    19.     extension->hParentId  = hParentId;
    20.     extension->hProcessId = hProcessId;
    21.     extension->bCreate    = bCreate;
    22.     //
    23.     // Signal the event thus the user-mode apps listening will be aware
    24.     // that something interesting has happened.  
    25.     //
    26.     KeSetEvent(extension->ProcessEvent, 0, FALSE);
    27.     KeClearEvent(extension->ProcessEvent);
    28. }
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    JCronuz
    Посмотрел минидамп - ну я верно предсказал.
    Ну в приведенном тобой в последний раз куске кода тоже нет таких механизмов. А не помешало бы.
    И удалять корректно в DriverUnload нужно твою notification routine.
    Насчет синхронизации - посмотри в сторону Remove lock (IoInitializeRemoveLock, IoAcquireRemoveLock, IoReleaseRemoveLock, IoReleaseRemoveLockAndWait).
    И приведи нормальный код DriverUnload. То, что ты привел работать не может - там опечатка, следовательно ты что-то вырезал или добавлял. Приведи оригинал.
     
  12. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Все нормально компилируется
    Код (Text):
    1. //----------------------------------------------------------------------------------------------
    2. // driver.c
    3. //----------------------------------------------------------------------------------------------
    4. //
    5. //
    6. //----------------------------------------------------------------------------------------------
    7.  
    8. #include <ntddk.h>
    9.  
    10.  
    11.  
    12. //----------------------------------
    13. // Device name
    14. //----------------------------------
    15. #define DEVICE_NAME L"\\Device\\ProcMon1"
    16. #define SYMBOL_NAME L"\\DosDevices\\ProcMon1"
    17.  
    18. //----------------------------------
    19. // Macroses
    20. //----------------------------------
    21. #define DEBUG
    22.  
    23. #ifdef DEBUG
    24.   #define PROCMON_KDPRINT DbgPrint
    25. #else
    26.   #define PROCMON_KDPRINT
    27. #endif
    28.  
    29.  
    30.  
    31.  
    32.  
    33. //----------------------------------
    34. // Prototypes
    35. //----------------------------------
    36.  
    37. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);
    38. //----------------------------------
    39.    
    40. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject,
    41.                              IN PIRP pIrp);
    42.                              
    43.                              
    44. VOID SetProcessNotify(IN BOOLEAN state);                     
    45.                              
    46. /*VOID CreateProcessNotifyRoutine (IN HANDLE hParentId,
    47.                                  IN HANDLE hProcessId,
    48.                                  IN BOOLEAN bCreate);
    49.     */
    50.  
    51.  
    52. //----------------------------------
    53. // Global vars
    54. //----------------------------------
    55. //PDEVICE_OBJECT g_pDeviceObject;
    56. //ACTIVATE_INFO  g_ActivateInfo;
    57.  
    58. //----------------------------------------------------------------------------------------------
    59.  
    60. /*
    61. #ifdef ALLOC_PRAGMA
    62. #pragma alloc_text( INIT, DriverEntry )
    63. #pragma alloc_text( PAGE, SioctlCreateClose)
    64. #pragma alloc_text( PAGE, SioctlDeviceControl)
    65. #pragma alloc_text( PAGE, SioctlUnloadDriver)
    66. #pragma alloc_text( PAGE, PrintIrpInfo)
    67. #pragma alloc_text( PAGE, PrintChars)
    68. #endif // ALLOC_PRAGMA
    69. */
    70. //----------------------------------------------------------------------------------------------
    71.  
    72. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    73.                      IN PUNICODE_STRING RegistryPath)
    74. {
    75.     NTSTATUS ntStatus;              //  Для результатата
    76.     UNICODE_STRING uszDeviceName;   // 2 Юникод строки для устройства и ссылки
    77.     UNICODE_STRING uszSymbolName;
    78.     PDEVICE_OBJECT pDeviceObject;   // указатель на объект (последний параметр IoCreateDevice)
    79.    
    80.     PROCMON_KDPRINT("Driver loaded");
    81.        
    82.     // Инициализируем UNICODE строку
    83.     RtlInitUnicodeString(&uszDeviceName, DEVICE_NAME);
    84.    
    85.     // Создаем объект устройство
    86.     ntStatus = IoCreateDevice(DriverObject,
    87.                               0,
    88.                               &uszDeviceName,
    89.                               FILE_DEVICE_UNKNOWN,
    90.                               0,
    91.                               0,
    92.                               &pDeviceObject);
    93.  
    94.     // Проверяем доступность
    95.     if (ntStatus != STATUS_SUCCESS)
    96.         return ntStatus;
    97.        
    98.     // Инициализируем UNICODE строку
    99.     RtlInitUnicodeString(&uszSymbolName, SYMBOL_NAME);
    100.        
    101.     // Пробуем создать симольную ссылку
    102.     ntStatus = IoCreateSymbolicLink(&uszSymbolName, &uszDeviceName);
    103.     if (ntStatus != STATUS_SUCCESS)
    104.     {
    105.         IoDeleteDevice(pDeviceObject);
    106.         return ntStatus;
    107.     }
    108.  
    109.     // Обрабатываем диспатчеры(Dispatches)
    110.     DriverObject->DriverUnload = DriverUnload;
    111.     /*
    112.     DriverObject->MajorFunction[IRP_MJ_CREATE]          = DispatchCreateClose;
    113.     DriverObject->MajorFunction[IRP_MJ_CLOSE]           = DispatchCreateClose
    114.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = DispatchIOCTL;
    115.     */
    116.    
    117.     // Устанавливаем callback
    118.     SetProcessNotify( FALSE );
    119.  
    120.     return STATUS_SUCCESS;
    121. }
    122. //----------------------------------------------------------------------------------------------
    123.  
    124. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject,
    125.                              IN PIRP pIrp)
    126. {
    127.     pIrp->IoStatus.Status      = STATUS_SUCCESS;
    128.     pIrp->IoStatus.Information = 0;
    129.    
    130.     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    131.     return STATUS_SUCCESS;
    132. }
    133.  
    134. //----------------------------------------------------------------------------------------------
    135.  
    136. //VOID
    137. //(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
    138. //    IN HANDLE  ParentId,
    139. //    IN HANDLE  ProcessId,
    140. //    IN BOOLEAN  Create
    141. //    );
    142.  
    143. VOID CreateProcessNotifyRoutine (IN HANDLE hParentId,
    144.                                  IN HANDLE hProcessId,
    145.                                  IN BOOLEAN bCreate)
    146. {
    147.     switch (bCreate)
    148.     {
    149.         // Create process
    150.         case TRUE:
    151.             PROCMON_KDPRINT("Loaded new application with (PID) =  %u", hProcessId);
    152.             break;
    153.    
    154.         // Terminate process
    155.         case FALSE:
    156.             PROCMON_KDPRINT("Loaded new application with (PID) =  %u", hProcessId);
    157.             break;
    158.        
    159.     }
    160. }
    161.  
    162. //----------------------------------------------------------------------------------------------
    163.  
    164. VOID SetProcessNotify(IN BOOLEAN state)
    165. {
    166.     NTSTATUS ntStatus;
    167.  
    168.     // Устанавливаем/удаляем нотификатор
    169.     ntStatus = PsSetCreateProcessNotifyRoutine( (PCREATE_PROCESS_NOTIFY_ROUTINE)CreateProcessNotifyRoutine, state);
    170.    
    171.     switch ( ntStatus )
    172.     {
    173.         case STATUS_SUCCESS:
    174.             PROCMON_KDPRINT("The given NotifyRoutine is now registered with the system.");
    175.             break;
    176.        
    177.         case STATUS_INVALID_PARAMETER:
    178.             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.");
    179.             break;
    180.     }
    181. }
    182.  
    183. //----------------------------------------------------------------------------------------------
    184.  
    185. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    186. {
    187.     NTSTATUS       ntStatus;
    188.     UNICODE_STRING uszSymbolName;
    189.    
    190.     PROCMON_KDPRINT("Driver unloaded");
    191.    
    192.     // Удаление нотификатора из списка
    193.     SetProcessNotify( TRUE );
    194.    
    195.     IoDeleteDevice(DriverObject->DeviceObject);
    196.    
    197.     RtlInitUnicodeString(&uszSymbolName, SYMBOL_NAME);
    198.     IoDeleteSymbolicLink(&uszSymbolName);
    199. }
    200.  
    201. //----------------------------------------------------------------------------------------------
    При загрузке снова перезагружается и bluescreenview по прежнему показывает
    Код (Text):
    1. 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
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В мсдн достаточно подробное описание, чтобы пример можно было написать самому.