Большая часть моей ежедневной работы по программированию в Windows в настоящее время связана с операциями ввода-вывода всех видов (каналы, консоли, файлы, сокеты и т. Д.). Я хорошо осведомлен о различных методах чтения и записи из / в различные типы дескрипторов (синхронное, асинхронное ожидание завершения событий, ожидание обработчиков файлов, порты завершения ввода-вывода и предупреждаемый ввод-вывод). Мы используем многие из них.
Для некоторых наших приложений было бы очень полезно иметь только один способ обработки всех дескрипторов. Я имею в виду, что программа может не знать, какой дескриптор она получила, и мы хотели бы использовать, скажем, порты завершения ввода-вывода для всех.
Итак, сначала я бы спросил:
Предположим, у меня есть ручка:
HANDLE h;
который откуда-то был получен моим процессом для ввода-вывода. Есть ли простой и надежный способ узнать, с какими флагами он был создан? Основной рассматриваемый флаг - FILE_FLAG_OVERLAPPED
.
Единственный способ, который мне пока известен, - это попытаться зарегистрировать такой дескриптор в порту завершения ввода-вывода (используя CreateIoCompletionPort()
). Если это успешно, дескриптор был создан с помощью FILE_FLAG_OVERLAPPED. Но тогда должен использоваться только порт завершения ввода-вывода, так как дескриптор не может быть отменен для него без закрытия самого HANDLE
h
.
Если есть простой способ определить наличие FILE_FLAG_OVERLAPPED
, у меня возникнет второй вопрос:
Есть ли способ добавить такой флаг к уже существующему дескриптору? Это сделает дескриптор, изначально открытый для синхронных операций, открытым для асинхронных. Будет ли способ создать противоположное (удалить FILE_FLAG_OVERLAPPED
, чтобы создать синхронный дескриптор из асинхронного)?
Я не нашел прямого пути после прочтения MSDN и большого количества поисковых запросов. Был бы хоть какой-нибудь трюк, который мог бы сделать то же самое? Например, воссоздать ручку таким же образом, используя функцию CreateFile()
или что-то подобное? Что-то даже частично задокументированное или вообще не задокументированное?
Основное место, где мне это может понадобиться, - это определить способ (или изменить способ), которым процесс должен читать / писать из дескрипторов, отправленных ему сторонними приложениями. Мы не можем контролировать, как сторонние продукты создают свои дескрипторы.
Уважаемые гуру Windows: помогите пожалуйста!
С уважением
Мартин
CreateIoCompletionPort()
на самом деле довольно изящный, если предположить, что вы действительно хотите использовать дескриптор с этим конкретным портом. Не думал об этом! - person André Caron   schedule 31.03.2015