VrpAddNamespaceNodeToList
NTSTATUS __stdcall VrpAddNamespaceNodeToList(_VRP_JOB_CONTEXT *JobContext, _UNICODE_STRING *NamespaceNode){
_UNICODE_STRING *v2;
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
NTSTATUS result;
unsigned __int64 v10;
_UNICODE_STRING **v11;
__int64 v12;
VOID *v13;
unsigned __int64 v14;
unsigned __int64 v15;
__int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
UINT64 v19;
UINT64 v20;
VOID *v21;
VOID **PoolWithTag;
VOID **v23;
unsigned __int64 v24;
_UNICODE_STRING **v25;
unsigned __int64 v26;
__int64 v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
VOID *v32;
VOID **v33;
VOID **v34;
UINT64 v36;
v36 = 0i64;
v2 = NamespaceNode;
if( VrpFindExactNamespaceNode((UINT64 *)JobContext, NamespaceNode, &v36) )
return -1073741771;
v4 = *((_QWORD *)JobContext + 6);
v5 = v36;
v6 = *((_QWORD *)JobContext + 7);
if( v36 >= v4 )
{
if( v4 < v6 )
goto LABEL_35;
v15 = v4 + 1;
if( v4 + 1 <= v6 )
return -2147024809;
v16 = *((_QWORD *)JobContext + 8) - 1i64;
if( v16 + v15 < v15 )
return -2147483637;
v17 = *((_QWORD *)JobContext + 5);
v18 = (v16 + v15) & ~v16;
v19 = v6 * v17;
if( !is_mul_ok(v6, v17) )
{
result = -2147483637;
goto LABEL_34;
}
v20 = v18 * v17;
if( !is_mul_ok(v18, v17) )
{
result = -2147483637;
LABEL_33:
v2 = NamespaceNode;
LABEL_34:
if( result )
return result;
LABEL_35:
if( is_mul_ok(*((_QWORD *)JobContext + 5), v4) )
{
v24 = *((_QWORD *)JobContext + 9);
v25 = (_UNICODE_STRING **)(v24 + *((_QWORD *)JobContext + 5) * v4);
if( (unsigned __int64)v25 >= v24 )
{
*v25 = v2;
goto LABEL_12;
}
}
return -2147483637;
}
v21 = (VOID *)*((_QWORD *)JobContext + 9);
PoolWithTag = ExAllocatePoolWithTag(1ui64, v20, 1918981202i64);
v23 = PoolWithTag;
if( v21 )
{
if( PoolWithTag )
memset(PoolWithTag, 0i64, v20);
if( !v23 )
goto LABEL_32;
if( v19 >= v20 )
LODWORD(v19) = v20;
memmove(v23, v21, v19);
ExFreePoolWithTag(v21, 0x72615452u);
}
else if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v20);
}
if( v23 )
{
*((_QWORD *)JobContext + 9) = v23;
result = 0;
*((_QWORD *)JobContext + 7) = v18;
goto LABEL_33;
}
LABEL_32:
result = -2147024882;
goto LABEL_33;
}
if( v4 < v6 )
{
LABEL_4:
v7 = *((_QWORD *)JobContext + 5);
v8 = v7 * v5;
if( is_mul_ok(v7, v5) )
{
v10 = *((_QWORD *)JobContext + 9);
v11 = (_UNICODE_STRING **)(v10 + v8);
if( v10 + v8 >= v10 )
{
v12 = v7 * (v5 + 1);
if( is_mul_ok(v7, v5 + 1) )
{
v13 = (VOID *)(v10 + v12);
if( v10 + v12 >= v10 )
{
v14 = *((_QWORD *)JobContext + 6) - v5;
if( is_mul_ok(v14, v7) )
{
memmove(v13, v11, v14 * v7);
*v11 = v2;
LABEL_12:
++*((_QWORD *)JobContext + 6);
return 0;
}
}
}
}
}
return -2147483637;
}
v26 = v4 + 1;
if( v26 <= v6 )
return -2147024809;
v27 = *((_QWORD *)JobContext + 8) - 1i64;
if( v27 + v26 < v26 )
return -2147483637;
v28 = *((_QWORD *)JobContext + 5);
v29 = (v27 + v26) & ~v27;
v30 = v6 * v28;
if( !is_mul_ok(v6, v28) || (v31 = v29 * v28, !is_mul_ok(v29, v28)) )
{
result = -2147483637;
goto LABEL_56;
}
v32 = (VOID *)*((_QWORD *)JobContext + 9);
v33 = ExAllocatePoolWithTag(1ui64, v29 * v28, 1918981202i64);
v34 = v33;
if( v32 )
{
if( v33 )
memset(v33, 0i64, v31);
if( !v34 )
goto LABEL_55;
if( v30 >= v31 )
LODWORD(v30) = v31;
memmove(v34, v32, v30);
ExFreePoolWithTag(v32, 0x72615452u);
}
else if( v33 )
{
memset(v33, 0i64, v31);
}
if( v34 )
{
*((_QWORD *)JobContext + 9) = v34;
result = 0;
*((_QWORD *)JobContext + 7) = v29;
goto LABEL_56;
}
LABEL_55:
result = -2147024882;
LABEL_56:
if( !result )
{
v2 = NamespaceNode;
goto LABEL_4;
}
return result;
}Referenced by:
VrpHandleIoctlCreateMultipleNamespaceNodes
VrpHandleIoctlCreateNamespaceNode
VrpHandleIoctlInitializeJobForVreg
VrpPreLoadKey