Нужно из драйвера ядра проинициализировать структуру RTL_CRITICAL_SECTION, находящуюся в пользовательском процессе. Эта структура инициализируется функцией RtlInitializeCriticalSection, экспортируемой ntdll.dll, можно ли как-то вызвать ее из драйвера?
Нельзя. RTL_CRITICAL_SECTION - в ядре не используется. Используйте специальный объекты ядра для синхронизации. Например Mutex (KeInitializeMutex). А вообще RTFM.
Да нет же, драйвер должен ее только проинициализировать. Сама структура расположена в пользовательском процессе и используется там же. Проблема в том, что инициализировать ее из этого пользовательского процесса возможности нет. Пытался проинициализировать ее вручную путем присвоения значений ее полям, но ничего хорошего из этого не вышло, кроме того, ее формат меняется от версии к версии винды.
ntdrivers Почему из процесса нельзя вызывать RtlInitializeCriticalSection? Ну тогда можно сделать черезжопным методом - послать из драйвера APC процессу, с кодом вызова RtlInitializeCriticalSection.
Можно из ядра юзать критсекции См. мой проект http://code.google.com/p/critsect/source/browse/trunk/critsect.cpp
Код уровня пользователя, который работает с этой критической секцией, сам загружается в процесс драйвером. Когда он получает управление, эта критическая секция уже должна быть проинициализирована, так как получить управление он может сразу из нескольких потоков. Использовать APC тоже не выход, этот код может быть вызван еще до того, как пользовательская APC будет доставлена. Наверно будет проще сделать свой примитив синхронизации на ассемблере, чем использовать критические секции.
ntdrivers Ну есть еще вариант - можно пропатчить процесс, и проинициализировать критическую секцию вставив дополнительный код (с возвратом обратно в нормальный ход работы программы). Эт если у вас ничего не выйдет с :
Пишут, что менялся на 2003 винде: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/01/434648.aspx Интересную ты написал библиотеку. А проинициализированные через нее критические секции доступны для пользовательского процесса, ведь память под DebugInfo ты выделяешь в ядре? Кстати, судя по winnt.h, критические секции могут и не содержать структуры DebugInfo, есть даже флаг RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO. Я пробовал использовать этот флаг в поле SpinCount но безрезультатно..