TddiBuildSend very long time to execute

Hello,

I had written small TDI client working fine.
But, after connecting them to the real-life sources I’ve discovered
that time to wait for Event after IoCallDriver returns STATUS_PENDING
is about 400 millisecs.
In the testing I didn’t noticed such weird behaviour.
Everything is done according to DDK and ntdev mail-list.
May I

  • kill KeWaitXXX after IoCall?
  • add completion routine?
    Does it help?
    Any advice?

What may be reason

{
KeInitializeEvent( &Event, NotificationEvent , FALSE );
IRP* pIrp = TdiBuildInternalDeviceControlIrp(
IrpSubFunction,
m_pDeviceObject,
m_pEndPoint[i].m_Object,
&Event,
&IoStatus
);

DumpTime(“HTSD: 2”);
if ( pIrp == NULL ) // validate pointer
ret = STATUS_INSUFFICIENT_RESOURCES;
else
{
pMdl = IoAllocateMdl (
buf, // buffer pointer - virtual address
len, // length
FALSE, // not secondary
FALSE, // don’t charge quota
NULL ); // don’t use irp

if ( pMdl ) // validate mdl pointer
{
__try
{
MmProbeAndLockPages ( pMdl, KernelMode, IoModifyAccess ); // probe & lock
}
__except ( EXCEPTION_EXECUTE_HANDLER )
{
dump ( “EXCEPTION: MmProbeAndLockPages\n” );
IoFreeMdl( pMdl );
pMdl = NULL;
}
}

if ( pMdl )
{
TdiBuildSend(
pIrp,
m_pDeviceObject,
pClient->m_pEp->m_Object,
NULL, // completion routine
NULL, // completion context
pMdl,
0, // flags
len
);
DumpTime(“HTSD: 3”);

ret = IoCallDriver( m_pDeviceObject, pIrp );

DumpTime(“HTSD: 4”);
if ( ret == STATUS_PENDING ) // make all request synchronous
{
KeWaitForSingleObject (
(PVOID)&Event, // signaling object
Executive, // wait reason
KernelMode, // wait mode
TRUE, // alertable
NULL ); // timeout
DumpTime(“HTSD: 5”);
ret = IoStatus.Status;
}
else
{
if(ret == STATUS_SUCCESS)
ret = IoStatus.Status;
}

if(ret == STATUS_SUCCESS)
{
// dump(“Ping %d successful\n”, (DWORD)pClient->m_wClientId );
}
else
{
dump(“Send %d failed with status %X\n”, (DWORD)pClient->m_wClientId, ret );
}
}
else
{
IoFreeIrp(pIrp);
ret = STATUS_INSUFFICIENT_RESOURCES;
}
}

return ret;


Best regards,
Sergey mailto:kipnis@wp.pl