ST_STORE::StDeviceIoIssue
__int64 __fastcall ST_STORE::StDeviceIoIssue(__int64 a1, __int64 *a2){
NTSTATUS v4;
__int64 *v5;
__int64 v6;
NTSTATUS *v7;
unsigned int v8;
unsigned int *v9;
unsigned int v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
v4 = -2147483634;
while( 1 )
{
v5 = (__int64 *)a2[1];
if( v5 == a2 )
break;
v6 = *a2;
*a2 = *(_QWORD *)*a2 & 0xFFFFFFFFFFFFFFF8ui64;
if( (__int64 *)v6 == v5 )
{
*a2 = 0i64;
a2[1] = (__int64)a2;
}
else
{
*v5 = *v5 & 7 | (8 * ((unsigned __int64)*v5 >> 3) - 8);
}
v7 = (NTSTATUS *)(v6 + 8);
v8 = *(_DWORD *)(v6 + 24);
v9 = *(unsigned int **)(v6 + 16);
v10 = -*(_DWORD *)(a1 + 792) & (16 * (v8 & *(_DWORD *)(a1 + 808)));
v11 = v8 >> *(_DWORD *)(a1 + 812);
v12 = *(_DWORD *)(v6 + 28);
v13 = v12 >> 5;
v14 = v12;
if( *(_QWORD *)(a1 + 1816) && (v12 & 4) == 0 )
{
*(_QWORD *)(v9 + 1) = KeQueryPerformanceCounter(0i64);
v14 = *(_DWORD *)(v6 + 28);
}
StEtaIoStart(
*(_ST_ETA_CONTEXT **)(a1 + 1000),
v13,
StIoTypeRandRead,
(VOID *)((unsigned __int64)v7 | ((unsigned __int64)v14 >> 3) & 1));
*(_DWORD *)(v6 + 28) |= 8u;
v4 = SmIssueIo(
*(VOID **)(a1 + 800),
v11,
v10,
v13,
-(__int64)*(unsigned int *)(a1 + 792) & ((unsigned __int64)&v9[4 * *v9 + 2] + *(unsigned int *)(a1 + 792) + 3),
v6 | 1);
if( v4 < 0 )
{
*(_DWORD *)(v6 + 28) |= 1u;
v15 = *(_QWORD *)(v6 + 16);
if( v15 )
*(_DWORD *)(v15 + 4) = v4;
else
*v7 = v4;
*(_QWORD *)v6 = *(_DWORD *)v6 & 7 | ((*(_QWORD *)a2[1] & 0xFFFFFFFFFFFFFFF8ui64) + 8);
*(_QWORD *)a2[1] = v6 | *(_DWORD *)a2[1] & 7;
a2[1] = v6;
return(unsigned int)v4;
}
}
return(unsigned int)v4;
}
Referenced by:
No references.