Почему при IRP_MJ_READ не работает таймер?
Решил провести чистый эксперимент
Сделал следующее:
при IRP_MJ_READ вызываю TTTDevice::SerialRead(KIrp I)
при IRP_MJ_DEVICE_CONTROL вызываю допустим TTTDevice::ReadBlock(KIrp I)
в этих функциях вызываю следующую функцию и смотрю в отладчике последние значения
m_Timer.State() и i
BOOLEAN TTTDevice::GetTimeout()
{
ULONG i;
BOOLEAN stat;
t<<"Timer IsValid "<< m_Timer.IsValid()<<EOL;
stat=m_Timer.Set(RtlConvertLongToLargeInteger(READ_TIMEOUT),LinkTo(TimerCallback),this);
t<<"Timer start status "<< stat<<EOL;
for(i=0;i<40000000;i++)
{
stat=m_Timer.State();
if(stat)
{
t<<"Timer status1 "<< m_Timer.IsValid()<<EOL;
t<<"Timer Irq1="<< stat <<EOL;
t<<"Count Irq1="<< i <<EOL;
m_Timer.Cancel();
return TRUE;
}
}//end for
t<<"Timer status2 "<< m_Timer.IsValid()<<EOL;
t<<"Timer Irq2="<< stat <<EOL;
t<<"Count Irq2="<< i <<EOL;
m_Timer.Cancel();
return FALSE;
}
В результате при IRP_MJ_DEVICE_CONTROL выхожу по сигналу таймера stat=TRUE,
а при IRP_MJ_READ по концу цикла (если цикл сделать бесконечный, то все виснет) stat=FALSE i=40000000
В документации написано про KTimer::State :
The caller must be running at IRQL <= DISPATCH_LEVEL (2).
Это что же? в этих случаях работаем при разных IRQL?
И как быть, если таймер жизненно необходим?
Юзаю VC++6.0 Numega 2.6