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