Sorry, что так долго не отвечал — тестировал код приведенный в скинутой мне ссылочке (спасибо за ссылочку).
В общем с ClientEventReceiv'ом ничего путного у меня не получилось — перепробовал все что можно.
Но зато получилось с обработчиком ClientEventConnect (что возможно даже лучше):
NTSTATUS ClientEventConnect(PVOID EventContext,LONG AddressLength,PVOID Address,
LONG UserDataLength,PVOID UserData,LONG OptionsLength,PVOID Options,
PVOID *ConnectionContext,PIRP*AcceptIrp)
{
//...
Status= OriginalConnectHandler(EventContext,AddressLength,Address,UserDataLength,UserData,
OptionsLength,Options,ConnectionContext,AcceptIrp);
IoCopyCurrentIrpStackLocationToNext(*AcceptIrp);
IoSetCompletionRoutine(*AcceptIrp, CompletionConnect, 0, TRUE, TRUE, TRUE);
IoSetNextIrpStackLocation(*AcceptIrp);
//...
return Status;
}
//==========================================================================================
//completion routine
NTSTATUS CompletionConnect( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
{
if (Irp->PendingReturned)
IoMarkIrpPending(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
После такого приема соединение с удаленным клиентом надежно тормозится (находится в состоянии ожидания) — то что мне и надо.
И теперь когда мне нужно разрешить соединение, я делаю
Irp->IoStatus.Status= STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT); //здесь Irp == *AcceptIrp в ClientEventConnect
И далее происходит нормальная передача данных.
Вопрос: как запретить соединение в данном случае?
Я пробовал
— отменить Irp
— вызывать обработчик ClientEventDisconnect
— и то и другое.
Ничего не происходит. Точнее, удаленный клиент тупо тормозит (Я тестирую на простом клиент-сервере TCP),
а TCP-сервер начинает беситься, т.е. ф-ция read, которой он читает из сокета становится почему-то неждущей и он
в бесконечном цикле выводит сообщения. В общем неважно. Результат один — отменить соединение не получается.
Как запретить (разорвать) соединение с удаленным клиентом, когда в ClientEventConnect мы сделали ему (соединению) как бы pending?