2012-06-13 2 views
1

Я пишу в буфер пространства пользователя из драйвера уровня ядра (из функциональности IOControl), и мне нужно убедиться, что программа/служба пользовательской земли не будет перезаписывать буфером или прочитать его перед тем, как драйвер завершит запись на него.Глобальный критический раздел Windows Kernel-уровня

Есть ли способ (и если да, что является предпочтительным способом) для ввода своего рода «глобальной критической секции» в драйвер ядра в Windows, позволяющий драйверу получить эксклюзивность для обработки в масштабах всей системы для короткое время, чтобы драйвер мог гарантировать исключительный доступ к буферу в пользовательском пространстве?

+0

Чего вы хотите достичь? В ядре Windows нет (экспортированной) глобальной блокировки. Вы можете легко использовать спин-блокировки или мьютексы/и т. Д. в вашем драйвере ядра, если вы этого хотите. – Christopher

+0

Можете ли вы рассказать нам о реальной проблеме, которую вы пытаетесь решить? Есть ли требование в реальном времени в вашем оборудовании? –

+0

Я пишу в буфер, который хранится в пользовательском пространстве от драйвера (из функциональности IOControl), и мне нужно убедиться, что программа/служба пользовательской земли не перезапишет его или не прочитает, прежде чем драйвер завершит работу написав ему. – Qix

ответ

1

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

Примечание: это ответ на вопрос, но в основном я согласен с комментариями, говорящими, что вы не должны это делать. Вероятно, вы должны перепроектировать драйвер так, чтобы он работал в предположении, что буфер пользовательского режима может измениться в любой момент.

+0

Это не поможет в многопроцессорной системе. IRQL - для каждого процессора, а другие процессоры по-прежнему могут выполнять код пользовательского режима. –

+0

«Потоки в режиме ядра, связанные с каждым системным процессором», я имел в виду, что число потоков равно числу или процессорам. Таким образом, каждый процессор занят, никто не может запускать приложение режима пользователя. – glagolig

+0

Интересный подход. Я согласен, что это не безупречно, но это действительно один из способов сделать это. – Qix

Смежные вопросы