DeviceIoControl,METHOD_BUFFERED и данные по поинтеру Win32,
- From
- Eugene Muzychenko (2:5000/14)
- To
- Ihor Osov'yak ()
- Date
- 2003-04-22T13:54:54Z
- Area
- SU.WINDOWS.NT.PROG
Привет!
21 Apr 03 23:12, you wrote to Gennady Mayko:
Iy> Если можно, то об этом несколько более подробно.. Я не совсем
Iy> представляю себе механизм взаимодействия адресных пространсв драйвера
Iy> и процесса..
У драйвера АП - системное, в котором лежат все системные модули (HAL, ядро, их DLL), системный динамический пул, таблицы разные. У процесса - пользовательское, он видит только себя и загруженные DLL. Соответственно, система размещает все свое в старших 2 Гб пространства, чтобы при переключении в kernel-mode оно не перекрывалось с пользовательским. Когда происходит переключение в kernel-mode по запросу от приложения, система включает отображение старших 2 Гб, а в младших остается то же самое.
Iy> В этом изделии драйвер запускается как сервис по запросу.
Любой "родной" драйвер так запускается.
Iy> Открывеется по имени устройства, созданного драйвером.
Приложение его иным образом напрямую открыть и не может, кроме как опосредованно, через промежуточные службы.
Iy> По завершении работы приложения драйвер не выгружается. Если
Iy> приложение запустить снова, то все работет нормально. В каком
Iy> процессе работает драйвер при первом запуске приложения и при втором?
Драйвер - это не процесс. Можешь рассматривать его, как продолжение ядра - совокупность процедур, из которых одна (точка входа) вызывается при загрузке, а на остальные он ставит вызовы по различным запросам. В некотором роде, драйвер похож на DLL (в Win16 многие драйверы были user-mode DLL) - он не имеет собственной активности, не участвует в планировании, если не запустит собственный системный thread. Соответственно, процедуры драйвера просто вызываются по описанному протоколу при запросе от приложений.
Iy> То есть адресное пространство процесса становится доступным для
Iy> драйвера.. ??????????
Угу. Точно так же, как оно доступно для системы. Но _виртуальное_ пространство доступно только непосредственно при вызове. Если ты хочешь запомнить адрес буфера, завершить запрос с ожиданием, а потом лазить в буфер асинхронно - тебе нужно сделать его фантомное отображение в системной области, для чего тебе дается MDL. Это уже будет виртуальное пространство системы, через которое ты будешь видеть те же физические страницы, но по другим адресам. Примерно так же, как два процесса отображают в свое адресное пространство один и тот же файл.
Iy> Да, и привидите пожалуйста пример, когда " ситуации, когда это не
Iy> будет выполняться.", тем более что "легко представить "
Когда в данный момент текущим является другой процесс. Младшие 2 Гб описывают его адресное пространство, а твоим процессом там и не пахнет.
Всего доброго!
Евгений Музыченко
--- GoldED+/W32 1.1.4.7
* Origin: Fox Tracks, Novosibirsk, Russia (2:5000/14)