2014-11-16 4 views
1

http://msdn.microsoft.com/en-us/library/windows/hardware/ff553079(v=vs.85).aspxЯ не понимаю, для Windows IRQL

MSDN говорит KeRaiseIrql(newIrql, &oldIrql) должна быть вызвана с newIrql, который> = currentIrql.

«Если новый IRQL меньше, чем текущий IRQL, возникает ошибка проверки ».

Но ниже кода KeRaiseIrql() хорошо работает с newIrql который < currentIrql. (Также, как погрузка, так и разгрузка этого драйвера работала хорошо.)

Есть ли кто-нибудь, чтобы это объяснить?

Test Environment: WinXp (32bit, Vmware Player), Win7 (32bit, VMWare Player)

#include <ntddk.h> 

VOID DriverUnload 
(
    IN PDRIVER_OBJECT DriverObject 
) 
{ 
    DbgPrint("BYE!\n"); 
} 

NTSTATUS DriverEntry 
(
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPath 
) 
{ 
    KIRQL oldIrql; 

    DriverObject->DriverUnload = DriverUnload; 

    DbgPrint("Hello!\n"); 

    KeRaiseIrql(3, &oldIrql); 

    DbgPrint("%d\n", KeGetCurrentIrql()); // 3 

    KeRaiseIrqlToDpcLevel(); 

    DbgPrint("%d\n", KeGetCurrentIrql()); // 2 

    KeRaiseIrql(1, &oldIrql); 

    DbgPrint("%d\n", KeGetCurrentIrql()); // 1 

    KeRaiseIrql(0, &oldIrql); 

    DbgPrint("%d\n", KeGetCurrentIrql()); // 0 

    DbgPrint("Yo!\n"); 

    return STATUS_SUCCESS; 
} 
+0

Вы строите драйвер в режиме отладки или в режиме деблокирования? –

+0

@pepper_chico в режиме отладки. – wut

+0

В заголовке 'wdm.h' есть версия« KeRaiseIrql »для платформ x64, для которых существует определение. Он просто использует 'NT_ASSERT' для проверки' newIrql> oldIrql'. ['NT_ASSERT' docs] (http://msdn.microsoft.com/en-us/library/windows/hardware/ff961903%28v=vs.85%29.aspx) подразумевает, что он должен проверяться только в режиме отладки. Не уверен, содержит ли эта 32-разрядная версия это утверждение. –

ответ

1

Как кто-то выше предположил, что это зависит от реализации данной ОС. Если у вас есть такие проблемы, лучше всего использовать отладчик.

E.g. в Win XP i386 релиз sp2 У меня есть:

hal!KfRaiseIrql: 
    806e43b8 0fb6d1   movzx edx,cl 
    806e43bb 0fb68a98436e80 movzx ecx,byte ptr hal!HalpIRQLtoTPR (806e4398)[edx] 
    806e43c2 a18000feff  mov  eax,dword ptr ds:[FFFE0080h] 
    806e43c7 890d8000feff mov  dword ptr ds:[0FFFE0080h],ecx 
    806e43cd c1e804   shr  eax,4 
    806e43d0 0fb68018f26e80 movzx eax,byte ptr hal!HalpVectorToIRQL (806ef218)[eax] 
    806e43d7 c3    ret 

Как вы можете видеть, что нет никакой предыдущей проверки IRQL. Если вы посмотрите в источники wrk, вы найдете версии KfRaiseIrql, где он проверен, также имейте в виду, что есть проверенная и бесплатная версия Windows. В большинстве случаев в проверенной версии у вас будет ошибка.

Если вы хотите видеть bsod на своем коде, используйте Driver Verifier :) afair, он проверяет правильность использования/снижения irql.

+0

Спасибо за ответ, я постараюсь использовать верификатор и проверить больше. – wut

+0

Ошибка с помощью проверки драйверов. Хотя правило IRQL, кажется, не является строгим иногда, я считаю, что соблюдение этого правила важно, чтобы избежать потенциальных ошибок. – wut

Смежные вопросы