MdlInvariantPreProcessing1
VOID __stdcall MdlInvariantPreProcessing1(
_IOFCALLDRIVER_STACKDATA *CallDriverData,
_IOV_REQUEST_PACKET *IovPacket,
_IO_STACK_LOCATION *IrpSp){
__int64 v3;
int v4;
_MDL *v8;
__int64 v9;
VOID *v10;
_MDL_INFO *v11;
__int64 v12;
char v13;
__int64 v14;
UINT64 v15;
__int64 v16;
__int64 v17;
unsigned int v18;
unsigned __int64 v19;
UINT64 v20;
__int64 v21;
ULONG_PTR v22;
UINT64 v23;
_CRC_CTRL_TABLE *BugCheckOnFailure;
UINT64 Priority;
_MDL_INFO MdlInfo[2];
UINT64 v27;
VOID *v28;
int v29;
char v30;
__int16 v31;
char v32;
v3 = *((_QWORD *)CallDriverData + 21);
v4 = 0;
v31 = 0;
v32 = 0;
v8 = *(_MDL **)(v3 + 8);
if( !v8->Next
&& (KeGetCurrentIrql() >= 2u || v8->ByteCount != -1)
&& MmMdlPageContentsState(v8, MmMdlPageContentsQuery) == MmMdlPageContentsInvariant )
{
v9 = *(_QWORD *)(*((_QWORD *)CallDriverData + 21) + 8i64);
if( (*(_BYTE *)(v9 + 10) & 5) != 0 )
{
v10 = *(VOID **)(v9 + 24);
}
else
{
LODWORD(Priority) = 1073741856;
LODWORD(BugCheckOnFailure) = 0;
v10 = MmMapLockedPagesSpecifyCache((_MDL *)v9, 0, MmCached, 0i64, (UINT64)BugCheckOnFailure, Priority);
}
if( v10 )
{
v11 = MdlInvariantFindMdlInfo(IovPacket, *(_MDL **)(*((_QWORD *)CallDriverData + 21) + 8i64));
if( v11 )
{
v13 = *(_BYTE *)(v12 + 67);
if( v13 == *(_BYTE *)(v12 + 66) || *((_BYTE *)v11 + 28) == v13 )
{
*(_OWORD *)v11 = 0i64;
*((_OWORD *)v11 + 1) = 0i64;
v11 = 0i64;
*(_QWORD *)(*((_QWORD *)IovPacket + 28) + 16i64) = 0i64;
v12 = *((_QWORD *)CallDriverData + 21);
}
}
v14 = *(_QWORD *)(v12 + 8);
if( !v11 )
{
v15 = RtlpComputeCrcInternal(
v10,
*(unsigned int *)(v14 + 40),
0i64,
(_CRC_CTRL_TABLE *)&Crc64Ctrl,
BugCheckOnFailure);
v16 = *((_QWORD *)CallDriverData + 21);
v27 = v15;
v28 = v10;
*(_QWORD *)MdlInfo = *(_QWORD *)(v16 + 8);
v29 = *(_DWORD *)(*(_QWORD *)MdlInfo + 40i64);
v30 = *(_BYTE *)(v16 + 67);
MdlInvariantInsertMdlInfo(IovPacket, MdlInfo);
return;
}
v17 = (unsigned int)v11[6];
v18 = *(_DWORD *)(v14 + 40);
if( (_DWORD)v17 == v18 )
{
v20 = *(unsigned int *)(v14 + 40);
}
else
{
v19 = *((_QWORD *)v11 + 2);
if( (unsigned __int64)v10 < v19 || (v20 = v18, (unsigned __int64)v10 + v18 > v19 + v17) )
{
LODWORD(v21) = v12;
LOBYTE(v4) = IrpSp->MajorFunction != 4;
v22 = v4 + 4112;
LABEL_28:
VerifierBugCheckIfAppropriate(0xC4ui64, v22, (ULONG_PTR)IrpSp->DeviceObject, v21, (ULONG_PTR)v10, Priority);
return;
}
}
if( (MmVerifierData & 0x4000) != 0 )
{
v23 = RtlpComputeCrcInternal(v10, v20, 0i64, (_CRC_CTRL_TABLE *)&Crc64Ctrl, BugCheckOnFailure);
if( *((_QWORD *)v11 + 1) != v23 )
{
if( IrpSp->MajorFunction == 4 )
{
v22 = 4112;
}
else
{
if( *(_DWORD *)(*(_QWORD *)(v3 + 184) + 8i64) != LODWORD(IrpSp->Parameters.SecurityContext) )
{
*((_QWORD *)v11 + 1) = v23;
return;
}
v22 = 4113;
}
v21 = *((_QWORD *)CallDriverData + 21);
goto LABEL_28;
}
}
}
}
}Referenced by:
IovpCallDriver1