завершении асинхронной
операции файла, ассоциированного с портом, или вызове функции
PostQueuedCompletionStatus
|
передаче портом запроса
потоку на обработку
|
Очередь ожидающих потоков
|
вызове функции
GetQueuedCompletionStatus
|
начале обработки
клиентского запроса потоком
|
Список работающих потоков
|
начале обработки
клиентского запроса потоком
|
вызове потоком
GetQueuedCompletionStatus или какую-либо блокирующей функции
|
Список приостановленных
потоков
|
вызове потоком какой-либо
блокирующей функции
|
выходе потока из какой-либо
блокирующей функции
|
Таблица 1. Список очередей порта завершения
ввода/вывода [1].
Недокументированные возможности порта и его
низкоуровневое устройство
Как всегда это бывает у Microsoft, порт завершения
обладает многими недокументированными возможностями:
У порта завершения ввода/вывода может быть имя, и
соответственно, он доступен для других процессов. Совершенно непонятно, почему
разработчики решили скрыть эту, на мой взгляд, нужную особенность порта. Имя
можно задать в параметре ObjectAttributes функции NtCreateIoCompletion.
Вторая особенность вытекает из первой: с портом может
быть связан дескриптор безопасности, который также задается в параметре
ObjectAttributes функции NtCreateIoCompletion.
Открывается порт с помощью функции NtOpenIoCompletion.
При вызове функции нужно указать имя порта и уровень доступа. В качестве уровня
доступа можно указывать все стандартные и следующие специальные права [2]
(таблица 2).