SmIssueIo
NTSTATUS __fastcall SmIssueIo(VOID *CompletionContext, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
int v6;
unsigned __int64 v7;
int v8;
int v9;
int v10;
int v11;
int v13;
unsigned int v14;
unsigned __int64 v15;
VOID *v16;
_EX_RUNDOWN_REF *v17;
UINT64 PerformsFileIo;
_SMKM_ISSUE_IO_PARAMS IoParams[2];
INT64 v21;
int v22;
int v23;
int v24;
int v25;
INT64 v26;
v6 = 0;
v7 = a6 & 0xFFFFFFFFFFFFFFFEui64;
v8 = 0;
v9 = a4;
v10 = a3;
v11 = a2;
if( (a6 & 1) == 0 )
v7 = a6;
if( (*(_DWORD *)(v7 + 28) & 4) != 0 )
{
if( (*((_BYTE *)CompletionContext + 6021) & 1) != 0 )
return -1073741058;
}
else
{
if( !SmKmStoreReference((_SMKM_STORE_LIST *)SmGlobals, *((unsigned int *)CompletionContext + 1504)) )
return -1073741058;
v6 = 1;
}
if( (a6 & 1) != 0 )
{
_InterlockedIncrement((volatile signed __int32 *)CompletionContext + 1526);
v8 = 1;
}
v26 = 0i64;
v14 = *(_DWORD *)CompletionContext;
v25 = *((_DWORD *)CompletionContext + 1552);
v21 = a5;
v24 = v11;
v23 = v10;
v22 = v9;
v26 = a6 & 1;
if( (v14 & 0x2000) != 0 )
{
v15 = v7 + 32;
v7 = (unsigned __int64)CompletionContext;
*(_QWORD *)IoParams = v15;
v16 = SmpIoCompletionApc;
}
else
{
*(_QWORD *)(v7 + 40) = CompletionContext;
*(_QWORD *)IoParams = v7 + 48;
v16 = SmpDeviceIoCompletion;
*(_DWORD *)(v7 + 32) = v9;
v14 = *(_DWORD *)CompletionContext;
}
LODWORD(PerformsFileIo) = (v14 >> 13) & 1;
v13 = SmKmIssueIo((_SMKM_FILE_INFO *)CompletionContext + 1554, IoParams, v16, (VOID *)v7, PerformsFileIo);
if( v13 >= 0 )
{
v6 = 0;
v8 = 0;
}
if( v8 )
_InterlockedDecrement((volatile signed __int32 *)CompletionContext + 1526);
if( v6 )
{
v17 = (_EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex(
(__int64)SmGlobals,
*((_DWORD *)CompletionContext + 1504) & 0x3FF);
ExReleaseRundownProtection(v17 + 1);
}
return v13;
}Referenced by:
ST_STORE::StDeviceIoIssue
ST_STORE::StStagingRegionIssueIo