Re[2]: TDI filter - RECEIVE
От: onyx2 Украина  
Дата: 01.06.05 10:43
Оценка:
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?
www.cubik.biz
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.