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.