Re: DeviceIoControl,METHOD_BUFFERED и данные по поинтеру Win32,
- From
- Gennady Mayko ()
- To
- Ihor Osov'yak ()
- Date
- 2003-04-22T09:18:52Z
- Area
- SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>
Добрый день!
>> В принципе, если рассматриваемый драйвер всегда выполняется в адресном
>> пространстве приложения, которое его вызывает, то это допустимо. Однако
IOy> никто
>> этого гарантировать не может и можно легко представить себе ситуации,
IOy> когда
>> это не будет выполняться.
IOy> Спасибо за ответ.
IOy> Если можно, то об этом несколько более подробно.. Я не совсем
IOy> представляю
IOy> себе механизм взаимодействия адресных пространсв драйвера и процесса.. В
IOy> этом изделии драйвер запускается как сервис по запросу. Открывеется по
IOy> имени устройства, созданного драйвером. По завершении работы приложения
IOy> драйвер
IOy> не выгружается. Если приложение запустить снова, то все работет
IOy> нормально.
IOy> В каком процессе работает драйвер при первом запуске приложения и при
IOy> втором? Как соотносятся адрессные пространства приложения и драйвера?
IOy> Исходя из того, что наблюдаем, есть подозрение, что здесь происходит
IOy> нечто подобное до мапирования длл на адрессное пространство процесса,
IOy> использующего длл, только "наоборот". То есть адресное пространство
IOy> процесса становится
IOy> доступным для драйвера.. ??????????
--
Kernel mode адресное пространство является общим для всех работающих процессов
в Windows NT/2K/XP. Поэтому код kernel mode драйвера в принципе может
выполняться в контексте адресного пространства любого процесса. Код драйвера
сравнительно редко "знает", в рамках какого процесса (thread'a) он
выполняется, поэтому основывать проектные решения на том, что этот код всегда
будет выполняться в рамках конкретного процесса, скажем так,
непрофессионально.
IOy> Да, и привидите пожалуйста пример, когда " ситуации, когда это не будет
IOy> выполняться.", тем более что "легко представить "
--
При обработке сообщений IRP_MJ_DEVICE_CONTROL, соответствующая процедура
самого верхнего драйвера в стеке драйверов будет выполняться в контексте
процесса, в котором был вызов DeviceIoControl (это, наверное, и есть причина
того, что в рассматриваемом случае программа и драйвер работают). Но
достаточно установить upper-filter драйвер и это уже не гарантируется
(например, upper-filter драйвер может запустить системный thread и из него
посылать IRP "вниз" по стеку драйверов).
>> Еще одной проблемой является то, что передача только указателя не
IOy> позволяет в
>> драйвере в общем случае определить размер передаваемых данных.
>>
IOy> Ну там эта проблема решается до безобразия просто. Указатели - PChar,
IOy> смотрят на буфферы выделенные с гарантированным запасом.. Данные -
IOy> обычная нуль-терминейт строка...
--
Достаточно забыть об этом нуле и есть шанс полностью "обрушить" систему.
С другой стороны, если передавать такую же "плохую" строку явно в буфере,
размер которого задается при вызове функции DeviceIoControl, то или система не
сможет выделить место для такой строки и сразу же вернет ошибку, или это ей
удастся, строка явно сопируется в буфер и код драйвера будет безопасно с ней
работать.
--
С уважением,
Геннадий Майко.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)