Всем Доброго Времени суток! Пишу драйвер-фильтр файловой системы. Нужно передавать данные из user приложение в ядро. Для этого использую в user приложении: Код (Text): HRESULT FilterSendMessage( __in HANDLE hPort, __in_opt LPVOID lpInBuffer, __in DWORD dwInBufferSize, __out LPVOID lpOutBuffer, __in DWORD dwOutBufferSize, __out LPDWORD lpBytesReturned ) , а в драйвере Код (Text): VOID RtlCopyMemory( __in VOID UNALIGNED *Destination, __in const VOID UNALIGNED *Source, __in SIZE_T Length ); Все довольно классно работает. Но! Мне нужно передать не просто переменную, а массив строк в драйвер (список файлов). Создавать свой массив в драйвере очень нехочется, хочется просто передать указатель на этот массив строк, а в драйвере его читать. Но тут в отладчике то я и обнаружил, что память по адресу нефига не доступна за пределами функции считывания информации от приложения. Как же создать массив строк, чтобы он был виден из драйвера по переданному ему указателю? Спасибо за внимание.
Не знаю как это делается средствами винды, но вообще для этого нужно монтировать память кусок памяти приложения в пространство ядра, т.е. техника примерна такая: нужно получить физические адреса соотв. страниц и их примаппить к ядру. Вполне возможно, что для этого уже есть готовые вызовы.
Решить поставленную задачу можно с использованием MDL - http://msdn.microsoft.com/en-us/library/ff565421(VS.85).aspx. Механизмы MDL позволят залочить страницы и спроецировать физическую память, выделенную в user mod’е, в адресное пространство ядра. Но лучше все же воспользоваться пулом и хранить копию данных в ядре
А можно просто обратиться к оригинальному массиву строк в юзермоде по указателю, если IRQL = PASSIVE_LEVEL. Но это в простейших случаях. Частенько придется лочить. Открывай мсдн на тему IoAllocateMdl, MmProbeAndLockPages, MmMapLockedPagesSpecifyCache и сотоварищи.
Так а что, DeviceIoControl нынче не в моде ? Чем он плох? Передал буфер строк и размер, дров его принял, выделил память и закатал себе. Или это слишком просто и я от чего-то отстал? Или мы коммунисты не ищем легких путей ?
0x6b65 Спасибо, буду рыть в этом направлении! k3internal в том то и дело, зачем мне создавать копию в драйвере? А если строк тысячи? А если они ещё и меняются постоянно? Great Нет, не катит. Там даже для аналога моего фильтра в сорцах WDK в месте, где нужно обращаться к массиву стоит макрос: Код (Text): ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); . Т.е. драйвер в этом месте не должен выполняться на уровне IRQL = PASSIVE_LEVEL (интересно, а как драйвер в принципе может быть на таком уровне?). Или я что-то не так понял? К тому же, я продебажил свой драйвер. Через буфер передал указатель на мою строку. И если в функции драйвера, где происходит подсоединение в user программе это строка ещё видна по переданному адресу, то в других переменная, которая должна содержать строку содержит следующее: Код (Text): struct _UNICODE_STRING "--- memory read error at address 0x0027f8e4 ---" .
mavok "Учите мат.-часть"(С) : организация страничной адресации, виртуальная/физическая память, реализация в ядре NT-based OS, реализация адресного пространства процессов в NT-based OS. P.S. ASSERT проверяет, что условие выполняется. Т. е. приведенный кусок кода должен исполняться только на PASSIVE_LEVEL
mavok Ну если не лень, можешь приаттачиться в свой процесс и из него напрямую читать список (если знаешь адрес смещения). Для этого используй например KeStackAttachProcess.
0x6b65 Ну вот как раз и изучаю! блин, точно! Засиделся я что-то! Так, а почему в отладчике тогда memory read error? Может в HEAP память выделять тогда в user приложении?
Память, выделенная в куче, условно говоря, выделяется для конкретного процесса (в частности на это указывает адрес 0x0027f8e4). А "другая функция драйвера", видимо, вызывается в контексте другого процесса, у которого адресное пространство другое. Поэтому и нужно перепроецировать память в ядро – адресное пространство ядра доступно для драйвера в любом процессе. Кстати, есть еще функция переключения адресного пространства процесса (что бы прочитать данные из процесса, в котором они хранятся) - KeStackAttachProcess (http://msdn.microsoft.com/en-us/library/ff549659(VS.85).aspx). Но переключение АП процесса довольно тормозная операция, да и процесс может умереть или осводить память - лучше юзать MDL