Как управлять прерыванием IA32_TSC_DEADLINE в Windows

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

  1. zky02

    zky02 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2024
    Сообщения:
    20
    Я хотел бы считать значение IA32_TSC_DEADLINE в Windows, но, кажется, оно возвращает значение 0 в DebugView

    Код (Text):
    1. #define IA32_APIC_BASE_MSR 0x1B
    2. #define IA32_TSC_DEADLINE_MSR 0x6E0
    3. #define LOCAL_APIC_LVT_TIMER_OFFSET 0x320
    4. #define LOCAL_APIC_TIMER_MODE_MASK (1 << 17)
    5.  
    6.  
    7. NTSTATUS ReadLocalApicBaseAddress(ULONG64* apic_base_address)
    8. {
    9.         ULONG64 ia32_apic_base = __readmsr(IA32_APIC_BASE_MSR);
    10.         *apic_base_address = ia32_apic_base & 0xFFFFFFFFF000ULL;
    11.         return STATUS_SUCCESS;
    12. }
    13.  
    14. NTSTATUS MapLocalApicMmio(PVOID* apic_base_virtual, ULONG64 apic_base_address)
    15. {
    16.         PHYSICAL_ADDRESS apic_physical_base;
    17.         apic_physical_base.QuadPart = apic_base_address;
    18.         *apic_base_virtual = MmMapIoSpace(apic_physical_base, PAGE_SIZE, MmNonCached);
    19.         return *apic_base_virtual ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
    20. }
    21.  
    22. VOID UnmapLocalApicMmio(PVOID apic_base_virtual)
    23. {
    24.         MmUnmapIoSpace(apic_base_virtual, PAGE_SIZE);
    25. }
    26.  
    27. NTSTATUS ReadTscDeadlineValue(ULONG64* tsc_deadline_value)
    28. {
    29.         ULONG64 apic_base_address;
    30.         NTSTATUS status = ReadLocalApicBaseAddress(&apic_base_address);
    31.         if (!NT_SUCCESS(status))
    32.         {
    33.                 return status;
    34.         }
    35.  
    36.         PVOID apic_base_virtual;
    37.         status = MapLocalApicMmio(&apic_base_virtual, apic_base_address);
    38.         if (!NT_SUCCESS(status))
    39.         {
    40.                 return status;
    41.         }
    42.  
    43.         ULONG timer_lvt = *(volatile ULONG*)((PUCHAR)apic_base_virtual + LOCAL_APIC_LVT_TIMER_OFFSET);
    44.         if (timer_lvt & LOCAL_APIC_TIMER_MODE_MASK)
    45.         {
    46.                 *tsc_deadline_value = __readmsr(IA32_TSC_DEADLINE_MSR);
    47.         }
    48.         else
    49.         {
    50.                 status = STATUS_NOT_SUPPORTED;
    51.         }
    52.  
    53.         UnmapLocalApicMmio(apic_base_virtual);
    54.         return status;
    55. }  

    код для вывода, если срок доступен

    Код (Text):
    1. ULONG64 tsc_deadline_value;
    2.         status = ReadTscDeadlineValue(&tsc_deadline_value);
    3.         if (NT_SUCCESS(status))
    4.         {
    5.                 DbgPrint("TSC_DEADLINE value: %llu\n", tsc_deadline_value);
    6.         }
    7.         else
    8.         {
    9.                 DbgPrint("Failed to read TSC_DEADLINE value, status: %08X\n", status);
    10.         }  
    Оно возвращает 0, почему это происходит?