SPCallServerHandleFileUsnQuery

NTSTATUS __stdcall SPCallServerHandleFileUsnQuery(INT64 a1, VOID *a2, INT64 a3, INT64 a4){
  VOID *v4; 
  VOID *v5; 
  int v6; 
  __int128 v7; 
  unsigned int *v9; 
  unsigned int *v10; 
  unsigned int i; 
  __int64 v12; 
  unsigned int *v13; 
  signed int v14; 
  VOID **v15; 
  unsigned int *v16; 
  unsigned int j; 
  __int64 v18; 
  unsigned int *v19; 
  VOID **v20; 
  unsigned int k; 
  unsigned int v22; 
  unsigned int *v23; 
  unsigned int v24; 
  VOID **v25; 
  unsigned int v26; 
  int *v27; 
  NTSTATUS v28; 
  _FILE_OBJECT *v29; 
  VOID **PoolWithTag; 
  VOID **v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned int v34; 
  unsigned __int64 m; 
  unsigned int v36; 
  VOID *v37; 
  VOID *v39; 
  __int64 v40; 
  unsigned int *v41; 
  unsigned int v42; 
  int v43; 
  unsigned int v44; 
  UINT64 OutputBufferLength; 
  UINT64 OutputBufferLengtha; 
  __int128 v47; 
  PVOID Object; 
  UINT64 RetOutputBufferSize; 

  LODWORD(RetOutputBufferSize) = a3;
  Object = a2;
  v4 = 0i64;
  v5 = 0i64;
  v6 = 0;
  v7 = 0i64;
  if( !a1 || !a4 )
    return -1073741811;
  v9 = *(unsigned int **)(a1 + 8);
  if( v9 && *(_DWORD *)a1 > 3u )
  {
    v10 = *(unsigned int **)(a1 + 8);
    for( i = 0; i < 3; ++i )
    {
      v12 = *v10;
      v13 = v10 + 1;
      if( v10 + 1 < v10 )
        goto LABEL_7;
      v10 = (unsigned int *)((char *)v13 + v12);
      if( (unsigned int *)((char *)v13 + v12) < v13 )
        goto LABEL_7;
    }
    v22 = *v10;
    v23 = v10 + 1;
    if( v10 + 1 < v10 )
    {
LABEL_7:
      v14 = -1073741675;
      goto LABEL_12;
    }
    v15 = 0i64;
    if( v22 )
      v15 = (VOID **)v23;
    v14 = 0;
    if( v22 != 8 )
      return -1073741789;
    v4 = *v15;
  }
  else
  {
    v14 = -1073741811;
  }
LABEL_12:
  if( v14 < 0 )
    return v14;
  if( v9 && *(_DWORD *)a1 > 4u )
  {
    v16 = *(unsigned int **)(a1 + 8);
    for( j = 0; j < 4; ++j )
    {
      v18 = *v16;
      v19 = v16 + 1;
      if( v16 + 1 < v16 )
        goto LABEL_17;
      v16 = (unsigned int *)((char *)v19 + v18);
      if( (unsigned int *)((char *)v19 + v18) < v19 )
        goto LABEL_17;
    }
    v24 = *v16;
    v25 = (VOID **)(v16 + 1);
    if( v16 + 1 < v16 )
    {
LABEL_17:
      v14 = -1073741675;
      goto LABEL_22;
    }
    v20 = 0i64;
    if( v24 )
      v20 = v25;
    v14 = 0;
    if( v24 != 8 )
      return -1073741762;
    v5 = *v20;
  }
  else
  {
    v14 = -1073741811;
  }
LABEL_22:
  if( v14 < 0 )
    return v14;
  if( v9 && *(_DWORD *)a1 > 5u )
  {
    for( k = 0; k < 5; ++k )
    {
      v40 = *v9;
      v41 = v9 + 1;
      if( v9 + 1 < v9 )
        goto LABEL_85;
      v9 = (unsigned int *)((char *)v41 + v40);
      if( (unsigned int *)((char *)v41 + v40) < v41 )
        goto LABEL_85;
    }
    v26 = *v9;
    if( v9 + 1 < v9 )
    {
LABEL_85:
      v14 = -1073741675;
      goto LABEL_39;
    }
    v27 = 0i64;
    if( v26 )
      v27 = (int *)(v9 + 1);
    v14 = 0;
    if( v26 == 4 )
    {
      v6 = *v27;
      goto LABEL_39;
    }
    return -1073741789;
  }
  v14 = -1073741811;
LABEL_39:
  if( v14 < 0 )
    return v14;
  if( v6 != 16 )
    return -1073741762;
  if( !v5 )
    return -1073741811;
  Object = 0i64;
  v28 = ObReferenceObjectByHandle(v5, 0i64, (_OBJECT_TYPE *)IoFileObjectType, 1, &Object, 0i64);
  v29 = (_FILE_OBJECT *)Object;
  v14 = v28;
  if( v28 >= 0 )
  {
    LODWORD(RetOutputBufferSize) = 0;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x248ui64, 542329939i64);
    if( !PoolWithTag )
    {
      v14 = -1073741801;
      goto LABEL_45;
    }
    LODWORD(OutputBufferLength) = 584;
    v14 = FsRtlKernelFsControlFile(v29, 0x900F4ui64, 0i64, 0i64, PoolWithTag, OutputBufferLength, &RetOutputBufferSize);
    if( v14 < 0 )
      goto LABEL_56;
    if( (unsigned int)RetOutputBufferSize < 0x40 )
    {
      v14 = -1073741762;
LABEL_56:
      ExFreePoolWithTag(PoolWithTag, 0x20534C53u);
      goto LABEL_45;
    }
    v37 = *PoolWithTag;
    LODWORD(OutputBufferLengtha) = 584;
    if( v29->WriteAccess )
    {
      v14 = FsRtlKernelFsControlFile(
              v29,
              0x900EFui64,
              0i64,
              0i64,
              PoolWithTag,
              OutputBufferLengtha,
              &RetOutputBufferSize);
      if( v14 < 0 )
        goto LABEL_56;
      if( (unsigned int)RetOutputBufferSize < 8 )
      {
LABEL_63:
        v14 = -1073741762;
        goto LABEL_56;
      }
      v39 = *PoolWithTag;
    }
    else
    {
      v14 = FsRtlKernelFsControlFile(
              v29,
              0x900EBui64,
              0i64,
              0i64,
              PoolWithTag,
              OutputBufferLengtha,
              &RetOutputBufferSize);
      if( v14 < 0 )
        goto LABEL_56;
      if( (unsigned int)RetOutputBufferSize < 0x40 )
        goto LABEL_63;
      v39 = PoolWithTag[3];
    }
    *(_QWORD *)&v47 = v37;
    *((_QWORD *)&v47 + 1) = v39;
    v7 = v47;
    goto LABEL_56;
  }
LABEL_45:
  if( v29 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v29);
  if( v14 >= 0 )
  {
    *(_DWORD *)(a4 + 4) = 32;
    v31 = ExAllocatePoolWithTag(1ui64, 0x20ui64, 542329939i64);
    if( !v31 )
      return -1073741801;
    *(_QWORD *)(a4 + 8) = v31;
    *(_DWORD *)a4 = 0;
    if( (VOID **)((char *)v31 + 4) < v31 )
      return -1073741675;
    if( (char *)v31 + 12 > (char *)v31 + *(unsigned int *)(a4 + 4) )
      return -1073741789;
    *(_DWORD *)v31 = 8;
    *(VOID **)((char *)v31 + 4) = v4;
    v32 = ++*(_DWORD *)a4;
    v33 = *(_QWORD *)(a4 + 8);
    if( v33 )
    {
      v34 = 0;
      for( m = *(_QWORD *)(a4 + 8); v34 < v32; m += v36 )
      {
        v36 = *(_DWORD *)m + 4;
        if( *(_DWORD *)m >= 0xFFFFFFFC || m + v36 < m )
          return -1073741675;
        ++v34;
      }
      if( m + 4 < m )
        return -1073741675;
      v14 = 0;
      if( m + 20 <= v33 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
      {
        *(_DWORD *)m = 16;
        *(_OWORD *)(m + 4) = v7;
        ++*(_DWORD *)a4;
        return v14;
      }
      return -1073741789;
    }
    v42 = *(_DWORD *)(a4 + 4);
    v43 = -1;
    v44 = v42 + 20;
    if( v42 + 20 >= v42 )
      v43 = v42 + 20;
    v14 = v44 < v42 ? 0xC0000095 : 0;
    *(_DWORD *)(a4 + 4) = v43;
    if( v44 >= v42 )
    {
      v14 = 0;
      *(_DWORD *)a4 = v32 + 1;
    }
  }
  return v14;
}

Referenced by:

sub_1405F50F8