SmIssueIo
INT64 __fastcall SmIssueIo(UINT64 a1, ULONG a2, ULONG a3, ULONG a4, VOID *a5, UINT64 a6){
int v6;
UINT64 v7;
int v8;
int v13;
unsigned int v14;
__int64 v15;
void(__stdcall *v16)(void *, struct _IO_STATUS_BLOCK *, unsigned int);
struct _EX_RUNDOWN_REF *v17;
__int64 v19[2];
ULONG v20;
ULONG v21;
ULONG v22;
int v23;
UINT64 v24;
v6 = 0;
v7 = a6 & 0xFFFFFFFFFFFFFFFEui64;
v8 = 0;
if( (a6 & 1) == 0 )
v7 = a6;
if( (*(_DWORD *)(v7 + 28) & 4) != 0 )
{
if( (*(_BYTE *)(a1 + 6021) & 1) != 0 )
return(unsigned int)-1073741058;
}
else
{
if( !SmKmStoreReference((INT64)&SmGlobals, *(unsigned int *)(a1 + 6016)) )
return(unsigned int)-1073741058;
v6 = 1;
}
if( (a6 & 1) != 0 )
{
_InterlockedIncrement((volatile signed __int32 *)(a1 + 6104));
v8 = 1;
}
v24 = 0i64;
v14 = *(_DWORD *)a1;
v23 = *(_DWORD *)(a1 + 6208);
v19[1] = (__int64)a5;
v22 = a2;
v21 = a3;
v20 = a4;
v24 = a6 & 1;
if( (v14 & 0x2000) != 0 )
{
v15 = v7 + 32;
v7 = a1;
v19[0] = v15;
v16 = (void(__stdcall *)(void *, struct _IO_STATUS_BLOCK *, unsigned int))SmpIoCompletionApc;
}
else
{
*(_QWORD *)(v7 + 40) = a1;
v19[0] = v7 + 48;
v16 = (void(__stdcall *)(void *, struct _IO_STATUS_BLOCK *, unsigned int))SmpDeviceIoCompletion;
*(_DWORD *)(v7 + 32) = a4;
v14 = *(_DWORD *)a1;
}
v13 = SmKmIssueIo((struct _SMKM_FILE_INFO *)(a1 + 6216), (__int64)v19, v16, (void *)v7, (v14 >> 13) & 1);
if( v13 >= 0 )
{
v6 = 0;
v8 = 0;
}
if( v8 )
_InterlockedDecrement((volatile signed __int32 *)(a1 + 6104));
if( v6 )
{
v17 = (struct _EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex((INT64)&SmGlobals, *(_DWORD *)(a1 + 6016) & 0x3FF);
ExReleaseRundownProtection(v17 + 1);
}
return(unsigned int)v13;
}Referenced by:
ST_STORE::StDeviceIoIssue
ST_STORE::StStagingRegionIssueIo