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;
}
Вы строите драйвер в режиме отладки или в режиме деблокирования? –
@pepper_chico в режиме отладки. – wut
В заголовке '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-разрядная версия это утверждение. –