ST_STORE::StDeviceIoBuild

VOID **__fastcall ST_STORE::StDeviceIoBuild(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
  int v6; 
  VOID **v7; 
  int v8; 
  unsigned int v9; 
  int v10; 
  unsigned int v11; 
  int Reference; 
  VOID **PoolWithTag; 
  VOID **v14; 
  size_t v15; 
  size_t v16; 
  int v17; 
  unsigned int v19; 

  v6 = *(_DWORD *)(a1 + 824) + *(unsigned __int16 *)(a2 + 4);
  v7 = 0i64;
  v8 = *(_DWORD *)(a1 + 792);
  v9 = *(_DWORD *)a2 >> *(_DWORD *)(a1 + 812);
  v19 = v9;
  v10 = (v8 - 1) & (16 * (*(_DWORD *)a2 & *(_DWORD *)(a1 + 808)));
  v11 = v8 + v10 - ((v8 - 1) & (v10 + v8 + v6 - 1)) + v6 - 1;
  Reference = ST_STORE::StRegionReadReference(a1, v9);
  if( !Reference )
    return v7;
  PoolWithTag = *(VOID ***)(a1 + 1800);
  if( PoolWithTag )
  {
    *(_DWORD *)(a1 + 1800) |= 1u;
    goto LABEL_5;
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v11 + *(_DWORD *)(a1 + 792) + 28, 1951624563i64);
  if( PoolWithTag )
  {
LABEL_5:
    *(VOID **)((char *)PoolWithTag + 4) = 0i64;
    *(VOID **)((char *)PoolWithTag + 12) = 0i64;
    *(VOID **)((char *)PoolWithTag + 20) = 0i64;
    *(_DWORD *)PoolWithTag = 1;
    *(_OWORD *)((char *)PoolWithTag + 12) = *(_OWORD *)a2;
    v14 = *(VOID ***)(a1 + 1808);
    v15 = SmCalcIoWorkItemSize(
            *(VOID **)(a1 + 800),
            (VOID *)(-(__int64)*(unsigned int *)(a1 + 792) & ((unsigned __int64)&PoolWithTag[2
                                                                                           * *(unsigned int *)PoolWithTag
                                                                                           + 1]
                                                            + *(unsigned int *)(a1 + 792)
                                                            + 3)),
            v11);
    v16 = v15;
    if( v14 )
    {
      *(_DWORD *)(a1 + 1808) |= 1u;
    }
    else
    {
      v14 = ExAllocatePoolWithTag(0x200ui64, v15, 1951624563i64);
      if( !v14 )
      {
LABEL_9:
        if( PoolWithTag )
        {
          v17 = *(_DWORD *)(a1 + 1800);
          if( (v17 & 1) != 0 && ((unsigned __int64)PoolWithTag | 1) == *(_QWORD *)(a1 + 1800) )
            *(_DWORD *)(a1 + 1800) = v17 & 0xFFFFFFFE;
          else
            ExFreePoolWithTag(PoolWithTag, 0);
        }
        v9 = v19;
        goto LABEL_15;
      }
    }
    memset(v14, 0i64, v16);
    *(_DWORD *)v14 |= 7u;
    v7 = v14;
    v14[1] = (VOID *)a4;
    v14[2] = PoolWithTag;
    PoolWithTag = 0i64;
    *((_DWORD *)v14 + 6) = *(_DWORD *)a2;
    *((_DWORD *)v14 + 7) = *((_DWORD *)v14 + 7) & 0x1D | (32 * v11) | *(_DWORD *)(a1 + 832) & 2;
    Reference = 0;
    goto LABEL_9;
  }
LABEL_15:
  if( Reference )
    ST_STORE::StRegionReadDereference(a1, v9);
  return v7;
}

Referenced by:

No references.