VrpInitializeNamespaceNodeList
NTSTATUS __stdcall VrpInitializeNamespaceNodeList(_VRP_JOB_CONTEXT *JobContext){
unsigned __int64 v2;
NTSTATUS v3;
__int64 v4;
__int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
VOID *v11;
VOID **PoolWithTag;
VOID **v13;
void *v14;
*((_OWORD *)JobContext + 2) = 0i64;
*((_OWORD *)JobContext + 3) = 0i64;
*((_OWORD *)JobContext + 4) = 0i64;
*((_QWORD *)JobContext + 6) = 0i64;
*((_QWORD *)JobContext + 7) = 0i64;
*((_QWORD *)JobContext + 9) = 0i64;
*((_QWORD *)JobContext + 8) = 16i64;
*((_QWORD *)JobContext + 5) = 8i64;
v2 = *((_QWORD *)JobContext + 7);
if( v2 < 0x14 )
{
v4 = *((_QWORD *)JobContext + 8);
v5 = v4 - 1;
v6 = v4 + 19;
if( v6 < 0x14 )
{
v3 = -2147483637;
goto LABEL_22;
}
v7 = *((_QWORD *)JobContext + 5);
v8 = v6 & ~v5;
v9 = v2 * v7;
if( !is_mul_ok(v2, v7) || (v10 = v8 * v7, !is_mul_ok(v8, v7)) )
{
v3 = -2147483637;
goto LABEL_19;
}
v11 = (VOID *)*((_QWORD *)JobContext + 9);
PoolWithTag = ExAllocatePoolWithTag(1ui64, v8 * v7, 1918981202i64);
v13 = PoolWithTag;
if( v11 )
{
if( PoolWithTag )
memset(PoolWithTag, 0i64, v10);
if( !v13 )
goto LABEL_18;
if( v9 >= v10 )
LODWORD(v9) = v10;
memmove(v13, v11, v9);
ExFreePoolWithTag(v11, 0x72615452u);
}
else if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v10);
}
if( v13 )
{
*((_QWORD *)JobContext + 9) = v13;
v3 = 0;
*((_QWORD *)JobContext + 7) = v8;
goto LABEL_19;
}
LABEL_18:
v3 = -2147024882;
LABEL_19:
if( !v3 )
return v3;
goto LABEL_22;
}
v3 = -2147024809;
LABEL_22:
v14 = (void *)*((_QWORD *)JobContext + 9);
if( v14 )
ExFreePoolWithTag(v14, 0x72615452u);
*((_OWORD *)JobContext + 2) = 0i64;
*((_OWORD *)JobContext + 3) = 0i64;
*((_OWORD *)JobContext + 4) = 0i64;
return v3;
}Referenced by:
VrpHandleIoctlInitializeJobForVreg