Вот из Руссиновича на стр 114: "Обычно ядро начинает опустошение очереди DPC с прерывания уровня DPC/Dispatch" Интересно, а это как? Сам же в книге пишет, что нельзя прервать поток прерыванием DISPATCH,таким же прерыванием Из оригинала: "NT usually initiates DPC queue draining with a software interrupt whose associated IRQL is Dispatch Level. " Блин из труда на оригинальном языке, лучше выражено. Как я понял DPC объекты еще содержат IRQL, если да то вопрос отпадает. Но нет же: nt!_KDPC +0x000 Type : Int2B +0x002 Number : UChar +0x003 Importance : UChar +0x004 DpcListEntry : _LIST_ENTRY +0x00c DeferredRoutine : Ptr32 +0x010 DeferredContext : Ptr32 Void +0x014 SystemArgument1 : Ptr32 Void +0x018 SystemArgument2 : Ptr32 Void +0x01c Lock : Ptr32 Uint4B нету тута IRQL никакого!
И что тут непонятного? Обработка DPC начинается после понижения IRQL до DISPTCH_LEVEL (имеется в виду, что до этого DPC был задан в ISR с более высоким IRQL). Если DPC задается на IRQL < DISPATCH, то его обработка начинается немедленно. Никакие потоки на DISPTCH_LEVEL при этом не прерываются. З.Ы. тебе еще не надоело учить голую теорию? Имхо давно пора с ней заканчивать и переходить к практике.
Ms Rem >тебе еще не надоело учить голую теорию? Как же возводить стены, если еще надежного фундамента нет. Пример тому мой дом, где я живу. Вроде обычная 5ти этажка, а по проекту 9ти этажка, почему так? Да потому что фундамент Ху..й вот и 5ти этажка получилась! >И что тут непонятного? Смотрю запись в книге: Исходные данные: сейчас выполняется поток1 и его IRQL равен DISPATCH. Факт: любое аппратное прерывание его может прервать! ибо DIRQL > DISPATCH_LEVEL. Вывод: Следовательно когда я двину мышью поток забэкапится, и начнет выполняться рутина закрепленная за конкретным IRQ, после завершения работы рутины, поток1 вновь продолжает работу. Это-то понятно. Нюанс: но позавершению любой DPC ядро прежде чем понизить IRQL глядит, а нету ли DPC? Почему они могут там находиться: Во время выполнения потока1 в DPC-очередь могли заполнить рутины постарше с IRQL > DISPATCH_LEVEL. Вот смотрит оно и начинает опустошать ее, в случае если там есть эти объекты. Но ведь ядро еще не понижает IRQL! (стр. 113 "Системные механизмы" М.Руссинович,Д.Соломон 2005 год) А тут Руссинович пишет: "Обычно ядро начинает опустошение очереди DPC с прерывания уровня DPC/Dispatch" Вопрос: Зачем ядро, по словам Руссиновича, должно генерировать DPC, если оно уже имеет IRQL равный DISPATCH_LEVEL. ЗЫ: Сорцы винды, будут еще не скоро, а матчасть читаю и усиленно-внимательно!
Этот руссинович тут такого наворотил что черт ногу сломит.В его рисунках столько загадок.В от в этом например что значит молния?