Инициализация RTL_CRITICAL_SECTION

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntdrivers, 8 янв 2011.

  1. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Нужно из драйвера ядра проинициализировать структуру RTL_CRITICAL_SECTION, находящуюся в пользовательском процессе. Эта структура инициализируется функцией RtlInitializeCriticalSection, экспортируемой ntdll.dll, можно ли как-то вызвать ее из драйвера?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Нельзя. RTL_CRITICAL_SECTION - в ядре не используется. Используйте специальный объекты ядра для синхронизации. Например Mutex (KeInitializeMutex). А вообще RTFM.
     
  3. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Да нет же, драйвер должен ее только проинициализировать. Сама структура расположена в пользовательском процессе и используется там же. Проблема в том, что инициализировать ее из этого пользовательского процесса возможности нет. Пытался проинициализировать ее вручную путем присвоения значений ее полям, но ничего хорошего из этого не вышло, кроме того, ее формат меняется от версии к версии винды.
     
  4. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    ntdrivers
    Почему из процесса нельзя вызывать RtlInitializeCriticalSection?
    Ну тогда можно сделать черезжопным методом - послать из драйвера APC процессу, с кодом вызова RtlInitializeCriticalSection.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Можно из ядра юзать критсекции
    См. мой проект http://code.google.com/p/critsect/source/browse/trunk/critsect.cpp
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да ладно о_0
     
  8. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Код уровня пользователя, который работает с этой критической секцией, сам загружается в процесс драйвером. Когда он получает управление, эта критическая секция уже должна быть проинициализирована, так как получить управление он может сразу из нескольких потоков. Использовать APC тоже не выход, этот код может быть вызван еще до того, как пользовательская APC будет доставлена. Наверно будет проще сделать свой примитив синхронизации на ассемблере, чем использовать критические секции.
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    ntdrivers
    Ну есть еще вариант - можно пропатчить процесс, и проинициализировать критическую секцию вставив дополнительный код (с возвратом обратно в нормальный ход работы программы).
    Эт если у вас ничего не выйдет с :
     
  10. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Пишут, что менялся на 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 но безрезультатно..