Re[2]: TDI_RECEIVE, ReceiveCallback и ChainedReceiveCallback
От: Аноним  
Дата: 09.07.11 08:16
Оценка:
Здравствуйте, x64, Вы писали:
x64>Достаточно фильтровать TDI_RECEIVE и ClientEventReceive, а установку обработчика ClientEventChainedReceive() можно фейлить на TDI_SET_EVENT_HANDLER. Нормальный клиент должен адекватно отреагировать на подобный отлуп. Во всяком случае, системные драйвера реагируют адекватно, следовательно, это эталонное поведение.

Реанимирую тему:
x64, сорри, может гулпқй вопрос, но (если речь идет о простом TDI-фильтре) что значит зафейлить хендлер ClientEventChainedReceive()?
К примеру есть код, устанавливающий такой обработчик:

NTSTATUS TdiSetEvent( PDEVICE_EXTENSION pde, PIRP pIrp, PIO_STACK_LOCATION stack )
{
   NTSTATUS                     status;
   PADDRESS_OBJECT                AddressObject;
   PTDI_REQUEST_KERNEL_SET_EVENT pSrc, pDest;
   PIO_STACK_LOCATION            next_stack = NULL;

   IoCopyCurrentIrpStackLocationToNext( pIrp );

   pSrc = (PTDI_REQUEST_KERNEL_SET_EVENT)&stack->Parameters;
   next_stack = IoGetNextIrpStackLocation( pIrp );
   pDest = (PTDI_REQUEST_KERNEL_SET_EVENT)&next_stack->Parameters;
   IoSetCompletionRoutine( pIrp, TdiSetEventComplete, pde, TRUE, TRUE, TRUE );
   AddressObject = GetAddressObjectFromFileObject( stack->FileObject );

   if( AddressObject )
   {
      switch( pSrc->EventType )
      {
         case TDI_EVENT_CHAINED_RECEIVE:
            if( pSrc->EventHandler )
            {
               AddressObject->ao_chainedrcv = pSrc->EventHandler;
               AddressObject->ao_chainedrcvcontext = pSrc->EventContext;
               pDest->EventHandler = (PVOID )TdiChainedReceiveEventHandler;
               pDest->EventContext = (PVOID )AddressObject;
            }
            else
            {
               AddressObject->ao_chainedrcv = 0;
               AddressObject->ao_chainedrcvcontext = 0;
               pDest->EventHandler = 0;
               pDest->EventContext = 0;
            }
            break;
...

Нужно просто не устанавливать pDest->EventHandler?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.