DeviceIoControl,METHOD_BUFFERED и данные по поинтеру Win32,
- From
- Gennady Mayko ()
- To
- Ihor Osov'yak ()
- Date
- 2003-04-21T22:13:32Z
- Area
- SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>
Добрый день!
IOy> идущие вглубь драйвера.
IOy> То есть, в драйвер передаются не сами данные, а поинтер на них.
IOy> Драйвер потом успешно эти данные получает. Примерно по такой же схеме
IOy> данные возвращаются, только там не METHOD_BUFFERED, а METHOD_NEITHER..
IOy> Область данных, на которые смотрят эти поинтера распределяются конечно в
IOy> win32 и на время выполнения DeviceIoControl живы и никуда не исчезают -
IOy> DeviceIoControl выполняется в синхронном режиме.
IOy> Я был убежден, что это чушь, пока сам не увидел работающего изделия по
IOy> такому принцыпу и его исходники.. Которые сам компилил :-).
IOy> Это дело проверялось под W2K.
IOy> То есть получается, что из kernel mode можно работать по поинтеру,
IOy> который передан из пользовательского режима?
IOy> Насколько така техника безопасна?
--
В принципе, если рассматриваемый драйвер всегда выполняется в адресном
пространстве приложения, которое его вызывает, то это допустимо. Однако никто
этого гарантировать не может и можно легко представить себе ситуации, когда
это не будет выполняться.
Еще одной проблемой является то, что передача только указателя не позволяет в
драйвере в общем случае определить размер передаваемых данных.
Поэтому я думаю, что такая техника не безопасна. Надежнее просто передавать
сами данные (буфер) через DeviceIoControl. Если данных много, то, наверное,
лучше использовать METHOD_IN_DIRECT вместо METHOD_BUFFERED.
IOy> Зы - я в общем то заинтересован доказать, что так работать плохо...
IOy> Спасибо за внимание
--
С уважением,
Геннадий Майко.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)