Размер данных в IRP_MJ_READ в драйвере виртуального диска

Тема в разделе "WASM.NT.KERNEL", создана пользователем Xerx, 21 апр 2007.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Возможно я задаю глупый вопрос, но хотелось бы узнать какой размер может быть передан через subj. драйверу от системы. Произвольный или же строго определенный? Ведь чтение с диска (винчестер) идет блоками по 4Кб. Так наверное и к драйверу система будет обращаться на чтение аналогичной порции данных. Или не так?
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Насколько я понимаю, размер может быть произвольным, но кратным 512 байтам. Но одно дело представление, и совсем другое уверенность...
    Я хотел бы знать наверняка.
    P.S. Если размер порции недерминирован (в чем сильно сомневаюсь, т.к. винчестер - устройство блочное, а не символьное), то хоть об этом скажите. Буду думать, что с этим делать.
    P.P.S. Меня интересует размер, передаваемый драйверу в IoGetCurrentIrpStackLocation(pIrp).Parameters.Read._Length. Запись не совсем коректна, но зато суть ясна.на.
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Неужели никто не знает?
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Xerx
    На самом деле размер порции данных зависит не от типа устройства, блочное оно или нет, а от организации самого драйвера. Драйвер может обмениваться с устройством блоками, например, 512-байтного или 4-кб размера, но скрывать эти тонкости от приложения за счет внутренней буферизации данных и отдавать данные хоть побайтно. Так что все зависит исключительно от конкретного драйвера.
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    gilg
    Я говорю об обмене данными не между драйвером и устройством, а между драйвером и системой (прикладным ПО).
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Xerx
    Дык и я о том же:
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    gilg
    Опять ты меня не понял. Драйвер создает виртуальный логический диск. С ним (диском) посредством запросов к драйверу система и работает. Данные между "диском" и системой передаются через драйвер по системному запросу IRP_MJ_READ. Вот я и хочу узнать, какими порциами система получает данные (ну и записывает соответственно) на диск через драйвер. Тут речи о "левых" программах, типа Проводника или Тотала не идет. Для них все прозрачно, ибо работа аналогична работе с "реальными" логическими дисками.
    Дело именно во взаимодействии Драйвер <==> Система!
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Xerx
    По-любому непонятно, что ты подразумеваешь под словом "система". Все запросы на ввод-вывод в любом случае проходят через ядро ОС. Функции NtWriteFile и NtReadFile считаются системными в этом контексте?
    Если да, то ответ все тот же. В них создается единственный IRP, для которого выделяется буфер, равный по размеру заказанному в параметрах (т.е. размер опять же может быть произвольный).
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Так. Давай по-другому. Система читает с диска (винчестера) данные блоками. Это понятно. Тогда разумно предположить, что и к драйверу, инкапсулирующему диск, система будет обращаться аналогично. Это универсально и гораздо логичнее, чем обращаться к двум устройствам, одно из которых существует реально, а второе реализовано драйвером, по разному, ибо драйвер в данном случае выступает в роли конечного диска.
    P.S. Проведя следственный эксперимент, установил, что данные передаются блоками кратными 16 байтам. А может порция больше?
     
  10. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    скажем иначе: блоками, кратными размеру сектора устройства.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    поправочка: с диска читает драйвер, а не система. система только с драйвером общается
     
  12. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    ams007
    Вот, это именно то, что мне и нужно было. Т.е. для HDD размер блока равен 512 байт. Так?

    Great
    Я просто упростил фразу. Просто система читает с диска ПОСРЕДСТВОМ обращения к драйверу.

    Так что последный вопрос выше: 512 байт для винчестера?
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    короче, пора расставить точки над i, а то никто не может нормально сказать:

    объем блока данных, передаваемых в IRP, ни в каких спецификациях не ограничивается. он может быть любым. все

    если в какой-то конкретной винде с каким-то определенным драйвером данные передаются порциями одного размера, то никто не гарантирует, что после установки следующеих форточек, или даже просто нового обновления, этот размер не станет в 10 раз больше
     
  14. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Все, понял. Больше вопросов нет :derisive: