А>я так понял что IoCancelFileOpen() нужно использовать в CREATE CompletionRoutine, но опять тот же вопрос — к этому времени я буду знать имя файла ? Ведь наскока я понимаю управление ещё не вернётся в мой Dispatcher ...
Имя в Вашей completion Вы уже будете знать — CREATE синхронная операция.
до вызова IoCallDriver(...); Вы можете отменть запрос штатным методом — не вызывать IoCallDriver(...); и просто вернуть ошибку, поэтому IoCancelFileOpen реально нужен в completion и Ваша схема вполне рабочая (только обычно я возвращаю STATUS_ACCESS_DENIED). Часто без completion не обойтись ибо приходится открывать файл чтобы хотя бы его имя получить либо какую-то иную информацию из самого файла\о нем самом — не директория ли он например.
стоит отметить что IoCancelFileOpen это 2000 и выше, однако на NT4 реализация довольно тривиальна: это посылка синхронных CLEANUP & CLOSE, как и написано в статье от OSR.
... << RSDN@Home 1.1.3 beta 1 >>
C>кстати какая разница между STATUS_UNSUCCESSFUL и STATUS_ACCESS_DENIED ?
разница в семантическом смысле

просто чаще всего приложения готовы к обработке STATUS_ACCESS_DENIED чем абстрактного неуспеха
... << RSDN@Home 1.1.3 beta 1 >>