Глобална критична секция на ниво ядро ​​на Windows

Пиша в буфер на потребителско пространство от драйвер на ниво ядро ​​(от функционалността IOControl) и трябва да се уверя, че програмата/услугата на потребителското пространство няма да презапише буфера или да го прочете, преди драйверът да е приключил с писането към него.

Има ли начин (и ако да, какъв е предпочитаният начин) да въведете един вид „глобална критична секция“ в драйвер в режим на ядрото на Windows, позволявайки на драйвера да получи изключителност за обработка в цялата система за кратко време, така че драйверът може да има гарантиран изключителен достъп до буфер в потребителското пространство?


person Qix - MONICA WAS MISTREATED    schedule 13.06.2012    source източник
comment
какво искаш да постигнеш Няма (експортирано) глобално заключване в ядрото на Windows. Можете лесно да използвате заключвания на въртене или mutexes/и т.н. във вашия драйвер на ядрото, ако искате това.   -  person Christopher    schedule 13.06.2012
comment
Можете ли да ни кажете действителния проблем, който се опитвате да разрешите? Има ли изискване за реално време във вашия хардуер?   -  person Simon Richter    schedule 13.06.2012
comment
Пиша в буфер, който се съхранява в потребителското пространство от драйвера (от функционалността IOControl) и трябва да се уверя, че програмата/услугата за потребителска земя няма да го презапише или прочете, преди драйверът да е приключил с писането към него.   -  person Qix - MONICA WAS MISTREATED    schedule 13.06.2012
comment
Предайте буфера си през IOCTL и завършете IOCTL, когато драйверът е написал някои данни в него. Не правете сложно заключване, ако е възможно.   -  person Sergey Podobry    schedule 13.06.2012
comment
След това трябва да се уверите, че програмата за потребителски режим не променя буфера, вместо да се опитва да заключи обработката в цялата система. Вижте примерите за ioctl в DDK за прости примери и прочетете на Взаимодействия в потребителски режим: Указания за драйвери в режим на ядро или подобни   -  person msam    schedule 13.06.2012


Отговори (1)


Като вземем предвид отговора ви в коментарите, един от начините да постигнете това е да поддържате нишки в режим на ядрото, свързани с всеки системен процесор и да повишите техния IRQL до DPC по времето, когато пишете в буфера. Планирането на нишки не е разрешено в DPC IRQL, така че приложението в потребителски режим няма да може да поеме контрола.

Забележка: това е отговорът на въпроса, но по принцип съм съгласен с коментарите, които казват, че не трябва да правите това. Вероятно трябва да препроектирате драйвера така, че да работи при предположението, че буферът на потребителския режим може да се промени във всеки един момент.

person glagolig    schedule 15.06.2012
comment
Това няма да помогне на многопроцесорна система. IRQL е за всеки процесор и други процесори все още са свободни да изпълняват код в потребителски режим. - person Raymond Chen; 15.06.2012
comment
Под нишки в режим на ядрото, свързани с всеки системен процесор, имах предвид да имам брой нишки, равен на броя или процесорите. Така че всеки процесор е зает, никой не може да стартира приложението за потребителски режим. - person glagolig; 16.06.2012
comment
Интересен подход. Съгласен съм, че не е безпогрешно, но наистина е един от начините да го направите. - person Qix - MONICA WAS MISTREATED; 16.06.2012