ST_STORE::StDmDeviceIoCompletion

__int64 __fastcall ST_STORE::StDmDeviceIoCompletion(__int64 a1, __int64 a2){
  __int64 v2; 
  __int64 v5; 
  __int64 k; 
  __int64 v7; 
  __int64 m; 
  LARGE_INTEGER v9; 
  __int64 v10; 
  int v11; 
  int v12; 
  _DWORD *v13; 
  __int16 v14; 
  int v15; 
  UINT64 *v16; 
  __int64 v17; 
  __int16 v18; 
  int v19; 
  unsigned int v20; 
  unsigned int IsCurrentRegion; 
  unsigned int v22; 
  __int64 v23; 
  unsigned int v24; 
  __int64 i; 
  LARGE_INTEGER PerformanceCounter; 
  __int64 v27; 
  __int64 v28; 
  _DWORD *v29; 
  LARGE_INTEGER v30; 
  __int64 v31; 
  int v32; 
  __int64 v33; 
  UINT64 v34; 
  __int64 j; 
  INT64 Status; 
  unsigned int RegionIndex; 
  UINT64 RegionIndexa; 
  INT64 v40; 
  __int64 v41; 
  v2 = a2 + 8;
  v5 = (unsigned int)(*(_DWORD *)(a2 + 24) >> *(_DWORD *)(a1 + 812));
  RegionIndex = *(_DWORD *)(a2 + 24) >> *(_DWORD *)(a1 + 812);
  LODWORD(v40) = 0;
  v41 = *(_QWORD *)(a1 + 1032);
  if( *(_QWORD *)(a2 + 16) )
  {
    v22 = *(_DWORD *)(a2 + 28);
    if( (v22 & 8) != 0 )
    {
      v23 = *(_QWORD *)(a1 + 1000);
      v24 = v22 >> 5;
      for( i = *(_QWORD *)(v23 + 16); *(_DWORD *)i < v24; i += 32i64 )
        ;
      if( v2 == *(_QWORD *)(i + 24) )
      {
        PerformanceCounter = KeQueryPerformanceCounter(0i64);
        v27 = 7i64 * *(_QWORD *)(i + 8);
        *(_QWORD *)(i + 24) |= 1ui64;
        *(_QWORD *)(i + 8) = (unsigned __int64)(PerformanceCounter.QuadPart + v27 - *(_QWORD *)(i + 16)) >> 3;
      }
      _InterlockedDecrement((volatile signed __int32 *)(v23 + 8));
    }
    if( (unsigned int)ST_STORE::StDeviceIoIsFailed(v2, &v40) )
    {
      v12 = v40;
      ST_STORE::StDmDeviceError(a1, 1, v40);
    }
    else
    {
      v12 = ST_STORE::StDmDeviceIoTransfer(a1, v28, v2);
      v29 = *(_DWORD **)(a1 + 1816);
      if( v29 )
      {
        if( v12 >= 0 )
          ++*v29;
        if( (*(_DWORD *)(a2 + 28) & 4) == 0 )
        {
          v30 = KeQueryPerformanceCounter(0i64);
          v31 = *(_QWORD *)(a2 + 16);
          LODWORD(RegionIndexa) = *(_DWORD *)(v31 + 4);
          v32 = *(_DWORD *)(v31 + 8);
          v33 = *(_QWORD *)(a1 + 1816);
          HIDWORD(RegionIndexa) = v32;
          v34 = v30.QuadPart - RegionIndexa;
          j = *(_QWORD *)(v33 + 1328);
          if( *(_QWORD *)j < v34 || j != *(_QWORD *)(v33 + 1344) && *(_QWORD *)(j - 16) >= v34 )
          {
            for( j = *(_QWORD *)(v33 + 1344); *(_QWORD *)j < v34; j += 16i64 )
              ;
            *(_QWORD *)(v33 + 1328) = j;
          }
          ++*(_DWORD *)(j + 8);
        }
      }
    }
    ST_STORE::StDeviceWorkItemCleanup((_DWORD *)a1, a2);
  }
  else
  {
    for( k = a1 + 1104; *(_DWORD *)k != (_DWORD)v5; k += 24i64 )
      ;
    v7 = *(_QWORD *)(a1 + 1000);
    for( m = *(_QWORD *)(v7 + 24); *(_DWORD *)m < *(_DWORD *)(a1 + 784); m += 32i64 )
      ;
    if( v2 == *(_QWORD *)(m + 24) )
    {
      v9 = KeQueryPerformanceCounter(0i64);
      v10 = 7i64 * *(_QWORD *)(m + 8);
      *(_QWORD *)(m + 24) |= 1ui64;
      *(_QWORD *)(m + 8) = (unsigned __int64)(v9.QuadPart + v10 - *(_QWORD *)(m + 16)) >> 3;
    }
    _InterlockedDecrement((volatile signed __int32 *)(v7 + 8));
    if( (unsigned int)ST_STORE::StDeviceIoIsFailed(v2, &v40) )
    {
      v12 = v40;
      ST_STORE::StDmDeviceError(a1, 1, v40);
      v11 = 0;
    }
    else
    {
      v13 = *(_DWORD **)(a1 + 1816);
      v12 = v11;
      if( v13 )
        ++*v13;
    }
    v14 = *(_WORD *)(v41 + 2 * v5);
    if( v14 >= 0 )
    {
      if( (*(_DWORD *)(a2 + 28) & 1) != 0 )
      {
        ++*(_DWORD *)(a1 + 1892);
        v15 = 1;
      }
      else
      {
        v15 = v11;
      }
      v20 = RegionIndex;
      ST_STORE::StRegionReadDereference(a1, RegionIndex);
    }
    else
    {
      v15 = 1;
      *(_WORD *)(v41 + 2 * v5) = v14 & 0x7FFF;
      v16 = SmEtwEnabled(0i64);
      if( v16 )
      {
        LODWORD(Status) = v12;
        SmEtwLogRegionOp(
          v16,
          4ui64,
          a1,
          RegionIndex,
          Status,
          v18 & 0x1FFF,
          *(unsigned __int8 *)(*(_QWORD *)(a1 + 1048) + v5));
        v17 = v41;
        v19 = 0;
      }
      if( (*(_DWORD *)(a2 + 28) & 1) != 0 )
      {
        ++*(_DWORD *)(a1 + 1888);
        v20 = RegionIndex;
        if( (*(_WORD *)(v17 + 2 * v5) & 0x1FFF) != 0 )
          v15 = v19;
      }
      else
      {
        v20 = RegionIndex;
      }
    }
    *(_OWORD *)v2 = 0i64;
    *(_QWORD *)(v2 + 16) = 0i64;
    if( v15 )
    {
      if( *(_DWORD *)k != -1 )
      {
        ExFreePoolWithTag(*(PVOID *)(k + 8), 0);
        ExFreePoolWithTag(*(PVOID *)(k + 16), 0);
      }
      *(_OWORD *)k = 0i64;
      *(_QWORD *)(k + 16) = 0i64;
      *(_DWORD *)k = -1;
      IsCurrentRegion = ST_STORE::StDmIsCurrentRegion(a1, v20);
      if( IsCurrentRegion != 8 )
        ST_STORE::StDmCurrentRegionSet(a1, IsCurrentRegion, 0xFFFFFFFFi64);
    }
  }
  return(unsigned int)v12;
}

Referenced by:

No references.