EtwpReceiveReplyDataBlock
NTSTATUS __stdcall EtwpReceiveReplyDataBlock(VOID *Buffer, UINT64 BufferSize, UINT64 *ReturnSize){
VOID *v5;
size_t v6;
_LARGE_INTEGER v7;
int v8;
_ADAPTER_OBJECT *v9;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
_ETWP_NOTIFICATION_HEADER *Flink;
size_t NotificationSize;
PADAPTER_OBJECT DmaAdapter;
_LARGE_INTEGER Timeout;
*(_DWORD *)ReturnSize = 0;
v5 = (VOID *)*(unsigned int *)Buffer;
v6 = BufferSize;
v7.QuadPart = EtwpOneMs * *((unsigned int *)Buffer + 1);
DmaAdapter = 0i64;
Timeout = v7;
v8 = ObReferenceObjectByHandle(v5, 4ui64, EtwpRegistrationObjectType, 1, (VOID **)&DmaAdapter, 0i64);
if( v8 >= 0 )
{
v9 = DmaAdapter;
if( (DmaAdapter->AdapterObject.CrashDump.ContiguousHint.Offset & 0x40000) != 0 )
{
v10 = KeRemoveQueue((_KQUEUE *)DmaAdapter->AdapterObject.ScatterTranslations, 1, &Timeout);
v11 = v10;
if( v10 == (_LIST_ENTRY *)258 || v10 == (_LIST_ENTRY *)192 )
{
v8 = (int)v10;
}
else
{
Flink = (_ETWP_NOTIFICATION_HEADER *)v10[1].Flink;
NotificationSize = Flink->NotificationSize;
if( NotificationSize > v6 )
{
v8 = -1073741789;
}
else
{
memmove(Buffer, Flink, NotificationSize);
NotificationSize = Flink->NotificationSize;
v8 = 0;
}
*(_DWORD *)ReturnSize = NotificationSize;
EtwpUnreferenceDataBlock(Flink);
ExFreePoolWithTag(v11, 0);
}
}
else
{
v8 = -1073741816;
}
HalPutDmaAdapter(v9);
}
return v8;
}Referenced by:
NtTraceControl