Как проверить, что дескриптор конечного канала только для сервера является каналом? - PullRequest
4 голосов
/ 24 февраля 2020

Я хочу создать именованный канал только для исходящих сообщений и хочу, чтобы другой код в другом месте позже мог проверить, является ли этот дескриптор каналом. Это работает для всех случаев дескрипторов канала (клиент, сервер; исходящий, входящий), за исключением дескрипторов конца сервера для каналов только для исходящих.

Если я открою дескриптор на стороне клиента входящего в канал только для сервера с флагами доступа GENERIC_WRITE | FILE_READ_ATTRIBUTES, позже я могу проверить, является ли дескриптор каналом, вызвав GetNamedPipeInfo(handle,NULL,NULL,NULL,NULL), который возвращает true. Однако на стороне сервера отсутствует эта привилегия для исходящих каналов - если я вызываю CreateNamedPipe с PIPE_ACCESS_OUTBOUND, GetNamedPipeInfo возвращает false и GetLastError возвращает ERROR_ACCESS_DENIED.

1 Ответ

1 голос
/ 24 февраля 2020

Разобрался.

bool IsPipe(HANDLE maybePipe)
{
#if 1
    ULONG junk;
    return
        //This returns a false negative for server-side pipe endpoints opened as PIPE_ACCESS_OUTBOUND.
        //I tried or-ing that with FILE_READ_ATTRIBUTES, but CreateNamedPipe doesn't like that.
        ::GetNamedPipeInfo(maybePipe, nullptr, nullptr, nullptr, nullptr)
            //So we fall back onto this one, which returns true in that case,
            // and false for non-pipes.
            || ::GetNamedPipeServerSessionId(maybePipe, &junk);
#elif 0
    return
        //THIS RETURNS TRUE FOR NON-PIPE FILES X-(
        ::GetNamedPipeHandleState(maybePipe, nullptr, nullptr, nullptr, nullptr, nullptr, 0);
#endif
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...