запустить таймер в ядре на 24 часа

Тема в разделе "WASM.NT.KERNEL", создана пользователем zky02, 15 июн 2024.

  1. zky02

    zky02 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2024
    Сообщения:
    20
    Я считываю таймер с помощью команды RDTSC на протяжении 24 часов, и это работает замечательно. Но проблема в том, что драйвер загружается, и таймер начинает отсчет сразу, хотя драйвер загружается мгновенно. Интересно, не упустил ли я что-то здесь.

    Код (Text):
    1. #define TIMER_QUERY_STATE    0x0001
    2. #define TIMER_MODIFY_STATE    0x0002
    3. #define TIMER_ALL_ACCESS    (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
    4. #define SECONDS_IN_24_HOURS 24 * 60 * 60
    Код (Text):
    1. NTSTATUS DriverEntry(PDRIVER_OBJECT theDriverObject, PUNICODE_STRING theRegistryPath)
    2. {
    3.     HANDLE hThread = NULL;
    4.     NTSTATUS ntStatus = STATUS_SUCCESS;
    5.     OBJECT_ATTRIBUTES ThreadAttributes;
    6.     KEVENT kEvent;
    7.     PETHREAD pThread = NULL;
    8.     KAFFINITY threadAffinityMask = (1ull << 0);
    9.  
    10.     theDriverObject->DriverUnload = OnUnload;
    11.     DbgPrint("Entering KERNEL mode..\n");
    12.  
    13.     InitializeObjectAttributes(&ThreadAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
    14.  
    15.     KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE);
    16.  
    17.     __try
    18.     {
    19.         ntStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, &ThreadAttributes, NULL, NULL, (PKSTART_ROUTINE)ThreadStart, &kEvent);
    20.         if (NT_SUCCESS(ntStatus))
    21.         {
    22.  
    23.             ZwSetInformationThread(hThread, ThreadAffinityMask, &threadAffinityMask, sizeof(threadAffinityMask));
    24.  
    25.             ntStatus = ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, *PsThreadType, KernelMode, (PVOID*)&pThread, NULL);
    26.             if (NT_SUCCESS(ntStatus))
    27.             {
    28.                 // Wait for the thread to signal completion
    29.                 KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL);
    30.  
    31.                 // Clean up
    32.                 ZwClose(hThread);
    33.                 ObDereferenceObject(pThread);
    34.             }
    35.             else
    36.             {
    37.                 DbgPrint("ObReferenceObjectByHandle failed!\n");
    38.             }
    39.         }
    40.         else
    41.         {
    42.             DbgPrint("Could not create system thread!\n");
    43.         }
    44.     }
    45.     __except (EXCEPTION_EXECUTE_HANDLER)
    46.     {
    47.         DbgPrint("Error while creating system thread!\n");
    48.         ntStatus = GetExceptionCode();
    49.     }
    50.  
    51.     return ntStatus;
    52. }
    Код (Text):
    1.  
    2. VOID ThreadStart(PVOID lpParam)
    3. {
    4.     KEVENT *pEvent = (KEVENT*)lpParam;
    5.     LARGE_INTEGER interval;
    6.     HANDLE timerHandle;
    7.     NTSTATUS status;
    8.     OBJECT_ATTRIBUTES timerAttributes;
    9.     WCHAR buffer[256];
    10.  
    11.     interval.QuadPart = -10000000; // 1 second in 100-nanosecond intervals
    12.  
    13.     InitializeObjectAttributes(&timerAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
    14.  
    15.     status = ZwCreateTimer(&timerHandle, TIMER_ALL_ACCESS, &timerAttributes, SynchronizationTimer);
    16.     if (!NT_SUCCESS(status))
    17.     {
    18.         DbgPrint("Failed to create timer object.\n");
    19.         PsTerminateSystemThread(status);
    20.     }
    21.  
    22.  
    23.     auto cr8 = __readcr8();
    24.     __writecr8(HIGH_LEVEL);
    25.     _disable();
    26.     unsigned __int64 time = __rdtsc();
    27.     _enable();
    28.     __writecr8(cr8);
    29.  
    30.     for (int i = 0; i < SECONDS_IN_24_HOURS; ++i)
    31.     {
    32.  
    33.         double currentTime = MyTimer(time, data->frequency);
    34.         RtlStringCbPrintfW(buffer, sizeof(buffer), L"Thread countdown at: %d seconds, Current time: %lf seconds\n", i + 1, currentTime);
    35.         DbgPrint("%ws", buffer);
    36.  
    37.         // Set the timer to expire in 1 second
    38.         status = ZwSetTimer(timerHandle, &interval, NULL, NULL, FALSE, 0, NULL);
    39.         if (!NT_SUCCESS(status))
    40.         {
    41.             DbgPrint("Failed to set timer.\n");
    42.             break;
    43.         }
    44.  
    45.         status = ZwWaitForSingleObject(timerHandle, FALSE, NULL);
    46.         if (!NT_SUCCESS(status))
    47.         {
    48.             DbgPrint("Failed to wait for timer.\n");
    49.             break;
    50.         }
    51.     }
    52.  
    53.     DbgPrint("---------------- 24 hours have passed! ----------------\n");
    54.  
    55.  
    56.     KeSetEvent(pEvent, 0, FALSE);
    57.  
    58.     ZwClose(timerHandle);
    59.  
    60.  
    61.     PsTerminateSystemThread(STATUS_SUCCESS);
    62. }
    --- Сообщение объединено, 15 июн 2024 ---
    Я исправил это
    Код (Text):
    1.  KeSetEvent(&ddx->kill, 0, FALSE);
    2.     KeWaitForSingleObject(ddx->hThread, Executive, KernelMode, FALSE, NULL);
    3.     ObDereferenceObject(ddx->hThread);
    Код (Text):
    1.     for (int i = 0; i < SECONDS_IN_24_HOURS; ++i)
    2.     {
    3.         if (KeReadStateEvent(&ddx->kill) != 0)
    4.         {
    5.             break;
    6.         }
    7.  
    Код (Text):
    1.   PreviousState = TRUE;
    2.         status = ZwSetTimer(timerHandle, &interval, NULL, NULL, FALSE, 0, &PreviousState);
    3.         if (!NT_SUCCESS(status))
    4.         {
    5.             DbgPrint("Failed to set timer, status = %lx\n", status);
    6.             break;
    7.         }
    8.         if (PreviousState)
    9.         {
    10.             DbgPrint("Set timer previous state wrong\n");
    11.         }
    12.  
    13.         // Wait for the timer to expire
    14.         status = ZwWaitForSingleObject(timerHandle, FALSE, NULL);
    15.         if (!NT_SUCCESS(status))
    16.         {
    17.             DbgPrint("Failed to wait for timer, status = %lx\n", status);
    18.             break;
    19.         }
    20.  
    21.         // Cancel the timer
    22.         CurrentState = FALSE;
    23.         status = ZwCancelTimer(timerHandle, &CurrentState);
    24.         if (!NT_SUCCESS(status))
    25.         {
    26.             DbgPrint("Failed to cancel timer, status = %lx\n", status);
    27.             break;
    28.         }
    Код (Text):
    1.     KeInitializeEvent(&ddx->kill, NotificationEvent, FALSE);
    2.  
    Теперь он выгружается идеально, без утечек :dance3::dance3::dance3::good:
     
    Последнее редактирование: 15 июн 2024
    UbIvItS нравится это.
  2. MAPTbIH

    MAPTbIH Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    84
    Подскажите по чём учили написание драйверов? Я последний раз на этом форуме был 16-летним пацанёнком. Спустя 20 лет решил вспомнить увлечения и заново изучить программирование. Посоветуете что-нибудь?
     
  3. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Four-f же,)
     
    Mikl___ и Win32Api нравится это.
  4. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    Да =)) а помню как с помощью приложух свина, по конструированию инструкций свой первый полиморф писал ...