PiDqIrpQueryGetResult
NTSTATUS __stdcall PiDqIrpQueryGetResult(IRP *Irp){
NTSTATUS v2;
__int64 v3;
INT64 v4;
char v5;
_ETHREAD *CurrentThread;
int v7;
unsigned int v8;
_ETHREAD *v9;
_ETHREAD *v10;
unsigned int v11;
_ETHREAD *v13;
int v14;
_OWORD v15[4];
unsigned int a4;
INT64 a5;
v2 = 0;
v3 = *((_QWORD *)Irp + 23);
v4 = *(_QWORD *)(*(_QWORD *)(v3 + 48) + 32i64);
v14 = *(_DWORD *)(v3 + 24);
v5 = 0;
a4 = 0;
LODWORD(a5) = 0;
v15[0] = 0i64;
if( !v4 )
{
v2 = -1073741637;
goto LABEL_14;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
v7 = *(_DWORD *)(v4 + 216);
if( (v7 & 8) != 0 )
{
v2 = -1073741536;
goto LABEL_7;
}
if( (v7 & 4) == 0 )
goto LABEL_28;
if( (v7 & 1) == 0 )
{
if( (v7 & 0x10) == 0 )
{
*(_DWORD *)(v4 + 216) = v7 | 0x10;
v5 = 1;
goto LABEL_7;
}
LABEL_28:
v2 = -1073741637;
goto LABEL_7;
}
v2 = -1073741670;
LABEL_7:
ExReleasePushLockEx(v4 + 64, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v2 < 0 )
goto LABEL_13;
v8 = *(_DWORD *)(v3 + 8);
if( v8 < 0x10 )
{
v2 = -1073741789;
}
else
{
if( v14 == 4653063 )
{
ProbeForWrite(*((VOID **)Irp + 14), v8, 8ui64);
v2 = PiDqQuerySerializeActionQueue(v4, *((_QWORD *)Irp + 14), *(unsigned int *)(v3 + 8), &a4, (INT64)&a5);
if( v2 < 0 )
goto LABEL_13;
v9 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v9 + 242);
ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
PiDqQueryGetNextIoctlInfo(v4, *(unsigned int *)(v3 + 8), (unsigned int)a5, v15);
LABEL_12:
ExReleasePushLockEx(v4 + 64, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
LABEL_13:
if( v2 == 259 )
return v2;
goto LABEL_14;
}
if( *((_QWORD *)Irp + 3) )
{
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 242);
ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
if( !*(_QWORD *)(v4 + 184)
&& *(_QWORD *)(v4 + 192) == v4 + 192
&& (*(_DWORD *)(*(_QWORD *)(v4 + 24) + 40i64) & 1) != 0 )
{
_InterlockedExchange64((volatile __int64 *)Irp + 13, (__int64)PiDqIrpCancel);
if( *((_BYTE *)Irp + 68) )
{
v2 = -1073741536;
}
else
{
*(_QWORD *)(v4 + 176) = Irp;
*(_BYTE *)(*((_QWORD *)Irp + 23) + 3i64) |= 1u;
v2 = 259;
}
}
else
{
PiDqQueryGetNextIoctlInfo(v4, *(unsigned int *)(v3 + 8), 0i64, v15);
a4 = 16;
}
goto LABEL_12;
}
v2 = -1073741811;
}
LABEL_14:
if( v5 )
{
v10 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v10 + 242);
ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
v11 = *(_DWORD *)(v4 + 216) & 0xFFFFFFEF;
*(_DWORD *)(v4 + 216) = v11;
if( v2 < 0 )
{
*(_DWORD *)(v4 + 216) = v11 | 1;
PiDqQueryFreeActiveData(v4);
}
ExReleasePushLockEx(v4 + 64, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
PiDqIrpComplete((__int64)Irp, v2, a4, v15);
return v2;
}Referenced by:
PiDqDispatch