IoReserveKsrPersistentMemory
INT64 __fastcall IoReserveKsrPersistentMemory(INT64 a1, INT64 a2, INT64 a3, INT64 a4, GUID **a5){
__int64 v6;
__int16 *v7;
_WORD *v8;
PVOID *v9;
PVOID *v10;
__int64 v11;
__int64 v12;
__int64 v13;
_WORD *v14;
__int64 v15;
GUID *v16;
UINT8 *v17;
void *v18;
int DriverKsrGuid;
int v20;
struct _MDL *PagesForMdl;
PVOID v22;
VOID *PoolWithTag;
VOID *v24;
GUID *v25;
UINT64 v26;
INT64 v27;
INT64 v28;
VOID *v29;
ULONG_PTR BugCheckParameter4;
_QWORD v32[2];
int v33;
INT64 v34;
INT64 v35;
__int64 v36;
size_t v37;
PVOID v38;
GUID **v39;
GUID v40;
v39 = a5;
v36 = 0i64;
v37 = 0i64;
v40 = 0i64;
LODWORD(v32[0]) = 0;
v35 = a3;
v34 = a1;
if( KeGetCurrentIrql() )
KeBugCheckEx(0x121u, 1ui64, KeGetCurrentIrql(), 0i64, 0i64);
if( a2 )
{
v6 = *(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64);
if( !v6 || (*(_DWORD *)(v6 + 396) & 0x20000) != 0 )
{
IoAddTriageDumpDataBlock((PVOID)a2, *(unsigned __int16 *)(a2 + 2));
v7 = *(__int16 **)(a2 + 8);
if( v7 )
{
IoAddTriageDumpDataBlock(v7, (unsigned int)v7[1]);
v8 = (_WORD *)(*(_QWORD *)(a2 + 8) + 56i64);
if( *v8 )
{
IoAddTriageDumpDataBlock(v8, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(a2 + 8) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(a2 + 8) + 56i64));
}
}
v9 = *(PVOID **)(*(_QWORD *)(a2 + 312) + 40i64);
if( v9 )
{
v10 = v9 + 5;
IoAddTriageDumpDataBlock(v9, 0x310ui64);
if( *(_WORD *)v10 )
{
IoAddTriageDumpDataBlock(v10, 2ui64);
IoAddTriageDumpDataBlock(v10[1], *(unsigned __int16 *)v10);
}
v11 = *(_QWORD *)(a2 + 312);
v12 = *(_QWORD *)(v11 + 40);
if( *(_WORD *)(v12 + 56) )
{
IoAddTriageDumpDataBlock((PVOID)(v12 + 56), 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 56i64));
v11 = *(_QWORD *)(a2 + 312);
}
v13 = *(_QWORD *)(*(_QWORD *)(v11 + 40) + 16i64);
if( v13 )
{
v14 = (_WORD *)(v13 + 56);
if( *v14 )
{
IoAddTriageDumpDataBlock(v14, 2ui64);
v15 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 16i64);
IoAddTriageDumpDataBlock(*(PVOID *)(v15 + 64), *(unsigned __int16 *)(v15 + 56));
}
}
}
KeBugCheckEx(0xCAu, 2ui64, a2, 0i64, 0i64);
}
a1 = v34;
}
v16 = 0i64;
v17 = 0i64;
v33 = 0;
v18 = 0i64;
memset((char *)v32 + 4, 0, 12);
if( !PnpKsrEnabled )
return(unsigned int)-1073741637;
if( (_DWORD)a4 )
return(unsigned int)-1073741582;
DriverKsrGuid = PipGetDriverKsrGuid(a1, &v40);
if( DriverKsrGuid < 0 )
return(unsigned int)DriverKsrGuid;
if( a2 )
{
v17 = (UINT8 *)v32[1];
DriverKsrGuid = PipGetDeviceObjectLocation((PVOID)a2);
if( DriverKsrGuid < 0 )
goto LABEL_41;
v33 = HIDWORD(v32[0]);
}
v20 = 1;
LODWORD(BugCheckParameter4) = 1;
DriverKsrGuid = PipGetPersistentMemory(v34, a2, &v37, 0i64, BugCheckParameter4);
if( DriverKsrGuid == -1073741772 )
DriverKsrGuid = 0;
if( DriverKsrGuid < 0 )
goto LABEL_41;
v32[1] = (v35 + 4103) & 0xFFFFFFFFFFFFF000ui64;
PagesForMdl = MmAllocatePagesForMdlEx(0i64, MmNotMapped, 0);
v34 = (INT64)PagesForMdl;
if( PagesForMdl )
{
v22 = MmMapLockedPagesSpecifyCache(PagesForMdl, 0, MmCached, 0i64, 0, 0x40000020u);
v38 = v22;
if( v22 )
{
memset((INT64)v22, 0i64);
HIDWORD(v32[0]) = 2 * v33 + 16;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, HIDWORD(v32[0]), 0x61706E50ui64);
v32[1] = PoolWithTag;
if( !PoolWithTag )
goto LABEL_41;
v24 = PoolWithTag;
memset((INT64)PoolWithTag, 0i64);
*((_QWORD *)v24 + 1) = v35;
*(_WORD *)v24 = 1;
v25 = (GUID *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x61706E50ui64);
v16 = v25;
if( v25 )
{
*(_QWORD *)&v25->Data1 = 0i64;
*(_QWORD *)&v25[1].Data1 = 0i64;
*(_QWORD *)v25[1].Data4 = 0i64;
*(_QWORD *)&v25[2].Data1 = 0i64;
*(_QWORD *)v25[2].Data4 = v38;
*(_QWORD *)v25->Data4 = v34;
*(_QWORD *)&v25[3].Data1 = v24;
v25[1] = v40;
if( a2 )
{
v26 = (unsigned int)(2 * v33);
*((_DWORD *)v24 + 1) = 2 * v33;
memmove((UINT8 *)v24 + 16, v17, v26);
v20 = 2;
}
v27 = v34;
v28 = v34;
v16->Data1 = v20;
KsrMdlToMemoryRuns(v28, 0i64, 0i64, v32);
v29 = ExAllocatePoolWithTag(NonPagedPoolNx, 8i64 * LODWORD(v32[0]), 0x61706E50ui64);
v18 = v29;
if( v29 )
{
DriverKsrGuid = KsrMdlToMemoryRuns(v27, v29, LODWORD(v32[0]), v32);
if( DriverKsrGuid >= 0 )
{
DriverKsrGuid = KsrPersistMemoryWithMetadata(&v40, v18, LODWORD(v32[0]), v32[1], HIDWORD(v32[0]), &v36);
if( DriverKsrGuid >= 0 )
{
*(_QWORD *)&v16[2].Data1 = v36;
*v39 = v16;
v16 = 0i64;
}
}
goto LABEL_41;
}
}
}
}
DriverKsrGuid = -1073741670;
LABEL_41:
if( v16 )
ExFreePoolWithTag(v16, 0x61706E50u);
if( v18 )
ExFreePoolWithTag(v18, 0x61706E50u);
return(unsigned int)DriverKsrGuid;
}Referenced by:
No references.