Здравствуйте, 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?