Re[3]: TDI filter - RECEIVE
От: TarasCo  
Дата: 01.06.05 13:41
Оценка:
Здравствуйте, 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 соединение принято, нужно ему сказать о закрытии

Кроме того, хотелось бы заметиь о порочности подобного подхода. Для удаленного хоста — соединение принято, он начнет слать запросы и не получая ответов, сам прикроет соединение.
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.