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