IRQL и потеря данных

Тема в разделе "WASM.NT.KERNEL", создана пользователем at0s, 7 авг 2010.

  1. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    насколько я понял, правильно писать так:

    if(KeGetCurrentIrql() <=DISPATCH_LEVEL)
    status = IoCallDriver(pDevObj, pIrp);

    Возникает другой вопрос:
    скажем я обрабатываю какой-то поток,
    1. теоретически я могу потерять данные ?
    2. как этого избежать ?

    И еще, на что обратить внимание, если на VMware программа работает нормально, а на реальной машине бсодит
     
  2. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    так не надо писать, это ничего не дает. В любом случае для каждого IRP ты заранее знаешь irql, они заведомо ниже или равны диспатчу. Ещё может появится необходимость отправки irp после обработки прерывания устройства. Но посылают естественно в DPC, а не в ISR. Как следствие вызов функции будет всегда происходит на irql <= диспатчу, поэтому проверка лишняя.

    >> скажем я обрабатываю какой-то поток,
    какой поток ?

    ЗЫ Криво объясняю, сорри =\
     
  3. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    izl3sa
    А если так:

    oldIrql = KfRaiseIrql( PROFILE_LEVEL );
    ...
    status = IoCallDriver( pDevObj, pIrp );

    ?
     
  4. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    ладно а если используется функции которые работают на PASSIVE LEVEL, а я получил управление на большем IRQL
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    at0s
    Нельзя IRQL понизить ниже, чем исходный на котором ваш код начал исполняться. Для вызова таких функций используется DPC: http://ru.wikipedia.org/wiki/DPC
     
  6. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2TSS
    а что меняется? ты все равно знаешь уровень irql. Да и отдавать управление все равно надо на том же что и получил.
     
  7. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    izl3sa
    То, что IoCallDriver выполняется на irql <= DISPATCH_LEVEL.

    Хотя я придираюсь, в обычном коде проверки вида if(KeGetCurrentIrql() <=DISPATCH_LEVEL) излишни, просто показал крайний случай.
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2TSS
    Я считаю, что в вашем примере это ошибка разработчика, что он не понизил irql. Но ладно, это уже демагогия =)