Как FILE_FLAG_NO_BUFFERING взаимодействует с дескрипторами, открытыми для устройств связи?

Как сказано в заголовке, я пишу сетевую программу, в которой открываю дескриптор сетевого драйвера с помощью CreateFile, и я экспериментирую с флагом NO_BUFFERING.

В большей части документации даже не упоминается, что это используется с устройствами связи, а в тех, которые используются (также известные как ссылка на MSDN и т. Д.), Просто упоминается, что вы можете.

Кто-нибудь знает, как это может повлиять на связь с устройством?


person JoshuaN    schedule 25.10.2015    source источник


Ответы (1)


Это деталь реализации драйвера устройства, параметры, которые вы указываете в вызове CreateFile (), передаются в запрос IRP_MJ_REQUEST. Тот, который я связал, предназначен для файловых систем, он очень навороченный. Щелкните ссылку IrpSp-> Parameters.Create.Options на аргумент Параметры IoCreateFileSpecifyDeviceObjectHint (), чтобы увидеть FILE_NO_INTERMEDIATE_BUFFERING.

Документация для IRP_MJ_REQUEST для последовательных портов здесь. Очень простой, без аргументов :) В общем, интерфейс winapi для драйвера устройства для коммуникационных портов очень прост. Существует (почти) прямое соответствие между документированной функцией winapi и ее лежащий в основе IOCTL. Функция winapi не делает ничего, кроме базовой проверки ошибок, а затем быстро передает задание драйверу.

Таким образом, невозможно передать указанную вами опцию FILE_FLAG_NO_BUFFERING, чтобы она просто не использовалась.

В противном случае логический вывод, ввод-вывод последовательного порта управляется прерыванием, драйвер должен буферизовать, чтобы не терять байты и поддерживать приемлемую скорость передачи. Технически вы можете повозиться с размерами буфера через SetupComm (), но, как указано в документации, это всего лишь рекомендация с довольно высокой вероятностью того, что драйвер просто игнорирует очень низкие значения.

person Hans Passant    schedule 25.10.2015
comment
Ух ты, ты открыл для меня совершенно новую перспективу! Напомним: означает ли это, что сама Windows ничего не буферизует - делает это драйвер? Если это так, то часть документации в Интернете неверна - я нашел сайты, на которых явно указано, что этот флаг запрещает Windows использовать собственные буферы! Кроме того, сетевой драйвер является драйвером TUN / TAP для Windows, а не последовательным портом как таковым. Это на что-нибудь влияет? Я предполагаю, что это все еще будет управляться прерываниями, но мне нужно спросить, чтобы быть уверенным! Большое спасибо, Ганс, -JN - person JoshuaN; 25.10.2015