KeWaitForSingleObject & APC

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mika0x65, 22 май 2011.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Читаю о том, когда и как доставляются APC, немного запутался. Есть несколько вопросов.

    Как я понял, APC бывают трех видов: пользовательские, APC режима ядра и специальные APC режима ядра. Первые доставляются когда поток блокируется на каком-то объекте диспетчеризации, вторые доставляются во время исполнения потока, первые доставляются практически моментально. И все же хотелось бы знать, какое событие приводит к доставке специальных APC ядра и обычных APC ядра.

    Теперь по поводу KeWaitForSingleObject (и вообще KeWaitXxx и KeDelayExecutionThread) ф-ий. Они имеют два параметра для управления доставки APC -- Alertable & WaitMode. Вот с ними особенная путаница. Зачем было сделано два параметра? В MSDN в описании KeWaitForSingleObject написано следующее:
    Т.е. достаточно выставить хотя бы один параметр. А из этой таблицы можно сказать, что настоящее влияние на доставку APC имеет WaitMode. Как же рапределить роли между этими параметрами? Подозреваю, что Alertable разрешает/запрещает доставку неких alert'ов -- какой-то внутренний механизм ядра -- но точно не уверен.

    И еще пара вопросов.

    Насколько я понимаю, APC ядра и специальные APC ядра не описаны в вышеприведенной таблице, т.к. доставляются прямо в исполняющийся поток, так?

    Код APC исполняется на APC_LEVEL. Может ли возникнуть следующая ситуация: исполняется код APC. Управление по таймеру переходит на DISPATCH_LEVEL. Планировщик видит, что к исполнению готов другой поток, работающий на PASSIVE_LEVEL. Этот поток запускается. Т.е. получается, что APC_LEVEL может быть прерван и управление может быть передано потоку на PASSIVE_LEVEL?

    UPD: А, и еще: зачем сообщать спящему потоку, что была доставлена APC? Почему бы просто не уложить его спать, после того как APC была выполнена?

    Заранее благодарен.
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Если очень грубо, то APC доставляется в момент когда происходит переключение в контекст потока, которому послана APC. Вобщем, там всё зависит, от того в каком состоянии поток находится.

    Если ждёшь в пользовательском режиме, то можно обработать все APC, если в ядре, то пользовательские APC нельзя обработать. Если поток ждёт в не-alertable состоянии, то APC не будут доставлены пока состояние не изменится.

    Логика обработки событий может быть такая, что либо ждём Н времени, либо до того момента как в APC была выполнена какая-то работа.

    Итого, по APC читать там
    http://www.opening-windows.com/techart_windows_vista_apc_internals.htm