насколько я понял, правильно писать так: if(KeGetCurrentIrql() <=DISPATCH_LEVEL) status = IoCallDriver(pDevObj, pIrp); Возникает другой вопрос: скажем я обрабатываю какой-то поток, 1. теоретически я могу потерять данные ? 2. как этого избежать ? И еще, на что обратить внимание, если на VMware программа работает нормально, а на реальной машине бсодит
так не надо писать, это ничего не дает. В любом случае для каждого IRP ты заранее знаешь irql, они заведомо ниже или равны диспатчу. Ещё может появится необходимость отправки irp после обработки прерывания устройства. Но посылают естественно в DPC, а не в ISR. Как следствие вызов функции будет всегда происходит на irql <= диспатчу, поэтому проверка лишняя. >> скажем я обрабатываю какой-то поток, какой поток ? ЗЫ Криво объясняю, сорри =\
izl3sa А если так: oldIrql = KfRaiseIrql( PROFILE_LEVEL ); ... status = IoCallDriver( pDevObj, pIrp ); ?
ладно а если используется функции которые работают на PASSIVE LEVEL, а я получил управление на большем IRQL
at0s Нельзя IRQL понизить ниже, чем исходный на котором ваш код начал исполняться. Для вызова таких функций используется DPC: http://ru.wikipedia.org/wiki/DPC
2TSS а что меняется? ты все равно знаешь уровень irql. Да и отдавать управление все равно надо на том же что и получил.
izl3sa То, что IoCallDriver выполняется на irql <= DISPATCH_LEVEL. Хотя я придираюсь, в обычном коде проверки вида if(KeGetCurrentIrql() <=DISPATCH_LEVEL) излишни, просто показал крайний случай.
2TSS Я считаю, что в вашем примере это ошибка разработчика, что он не понизил irql. Но ладно, это уже демагогия =)