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.