Фатальный сбой при вызове PsCreateSystemThread

Тема в разделе "WASM.NT.KERNEL", создана пользователем SysProger, 14 дек 2008.

  1. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    C кодом ошибки IRQL_NOT_LESS_OR_EQUAL.
    Код (Text):
    1. VOID Thread_proc(PVOID count)
    2. {
    3.     PsTerminateSystemThread(STATUS_SUCCESS);
    4. }
    5.  
    6. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    7. {
    8.     OBJECT_ATTRIBUTES oa_2;
    9.     HANDLE hthread;
    10.     PKTHREAD thread;
    11.  
    12.     DriverObject->DriverUnload = DriverUnload;
    13.     DriverObject->DriverExtension->AddDevice = AddDevice;  
    14.  
    15.     if (KeGetCurrentIrql() == PASSIVE_LEVEL)
    16.     {
    17.         InitializeObjectAttributes(&oa_2, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
    18.  
    19.         status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS, &oa_2, 0, NULL, (PKSTART_ROUTINE) Thread_proc, NULL);
    20.  
    21.         if (!NT_SUCCESS(status))
    22.         {
    23.             return STATUS_DEVICE_CONFIGURATION_ERROR;
    24.         }
    25.  
    26.         ObReferenceObjectByHandle(hthread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID *) thread, NULL);
    27.         ZwClose(hthread);
    28.  
    29.         KeWaitForSingleObject(thread, Executive, KernelMode, FALSE, NULL);
    30.         ObDereferenceObject(thread);
    31.     }
    32.  
    33.     return STATUS_SUCCESS;
    34. }
    Кто знает, в чём ошибка? Все функции драйвера в VS по умолчанию расположены в неперемещаемой памяти.
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    OBJECT_ATTRIBUTES oa_2; это входной параметр. Ты его не инициализировал. Вообще зачем он тебе ? Напиши ноль и все :)
     
  3. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    1) Я его инициализировал.
    2) Эффект тот же самый.
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Ой точно, что-то я невнимательный стал.
    У меня работает вот так:
    Код (Text):
    1. NTSTATUS DriverEntry(PDRIVER_OBJECT pdoDriver,PUNICODE_STRING pusRegistry)
    2. {
    3.         DbgPrint("Test Driver start success");
    4.         HANDLE hThread;
    5.         PVOID pvThreadOb;
    6.         if(NT_SUCCESS(PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,0,0,0,MainKernelThread,0)))
    7.         {
    8.             ObReferenceObjectByHandle(hThread,THREAD_ALL_ACCESS,0,KernelMode,&pvThreadOb,0);
    9.             ZwClose(hThread);
    10.             KeWaitForSingleObject(pvThreadOb,Executive,KernelMode,FALSE,0);
    11.             ObDereferenceObject(pvThreadOb);
    12.         }
    13.         DbgPrint("Test Driver exit.");
    14.         return STATUS_FAILED_DRIVER_ENTRY;
    15. }
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    msdn InitializeObjectAttributes macro