Возможно я задаю глупый вопрос, но хотелось бы узнать какой размер может быть передан через subj. драйверу от системы. Произвольный или же строго определенный? Ведь чтение с диска (винчестер) идет блоками по 4Кб. Так наверное и к драйверу система будет обращаться на чтение аналогичной порции данных. Или не так?
Насколько я понимаю, размер может быть произвольным, но кратным 512 байтам. Но одно дело представление, и совсем другое уверенность... Я хотел бы знать наверняка. P.S. Если размер порции недерминирован (в чем сильно сомневаюсь, т.к. винчестер - устройство блочное, а не символьное), то хоть об этом скажите. Буду думать, что с этим делать. P.P.S. Меня интересует размер, передаваемый драйверу в IoGetCurrentIrpStackLocation(pIrp).Parameters.Read._Length. Запись не совсем коректна, но зато суть ясна.на.
Xerx На самом деле размер порции данных зависит не от типа устройства, блочное оно или нет, а от организации самого драйвера. Драйвер может обмениваться с устройством блоками, например, 512-байтного или 4-кб размера, но скрывать эти тонкости от приложения за счет внутренней буферизации данных и отдавать данные хоть побайтно. Так что все зависит исключительно от конкретного драйвера.
gilg Я говорю об обмене данными не между драйвером и устройством, а между драйвером и системой (прикладным ПО).
gilg Опять ты меня не понял. Драйвер создает виртуальный логический диск. С ним (диском) посредством запросов к драйверу система и работает. Данные между "диском" и системой передаются через драйвер по системному запросу IRP_MJ_READ. Вот я и хочу узнать, какими порциами система получает данные (ну и записывает соответственно) на диск через драйвер. Тут речи о "левых" программах, типа Проводника или Тотала не идет. Для них все прозрачно, ибо работа аналогична работе с "реальными" логическими дисками. Дело именно во взаимодействии Драйвер <==> Система!
Xerx По-любому непонятно, что ты подразумеваешь под словом "система". Все запросы на ввод-вывод в любом случае проходят через ядро ОС. Функции NtWriteFile и NtReadFile считаются системными в этом контексте? Если да, то ответ все тот же. В них создается единственный IRP, для которого выделяется буфер, равный по размеру заказанному в параметрах (т.е. размер опять же может быть произвольный).
Так. Давай по-другому. Система читает с диска (винчестера) данные блоками. Это понятно. Тогда разумно предположить, что и к драйверу, инкапсулирующему диск, система будет обращаться аналогично. Это универсально и гораздо логичнее, чем обращаться к двум устройствам, одно из которых существует реально, а второе реализовано драйвером, по разному, ибо драйвер в данном случае выступает в роли конечного диска. P.S. Проведя следственный эксперимент, установил, что данные передаются блоками кратными 16 байтам. А может порция больше?
ams007 Вот, это именно то, что мне и нужно было. Т.е. для HDD размер блока равен 512 байт. Так? Great Я просто упростил фразу. Просто система читает с диска ПОСРЕДСТВОМ обращения к драйверу. Так что последный вопрос выше: 512 байт для винчестера?
короче, пора расставить точки над i, а то никто не может нормально сказать: объем блока данных, передаваемых в IRP, ни в каких спецификациях не ограничивается. он может быть любым. все если в какой-то конкретной винде с каким-то определенным драйвером данные передаются порциями одного размера, то никто не гарантирует, что после установки следующеих форточек, или даже просто нового обновления, этот размер не станет в 10 раз больше