MmStoreRegister

NTSTATUS __stdcall MmStoreRegister(_EPROCESS *StoreProcess){
  __int64 v1; 
  int v2; 
  int v3; 
  __int64 v4; 
  _QWORD *Pool; 
  INT64 v6; 
  NTSTATUS SystemThread; 
  _RTL_BITMAP *v8; 
  _RTL_BITMAP *v9; 
  unsigned __int64 v10; 
  __int64 *v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  UINT64 MaximumSize; 
  _UNICODE_STRING *Pagefile; 
  _UNICODE_STRING *v18; 
  int v19; 
  int v20; 
  UINT64 Flags; 
  UINT64 InternalFlags; 
  _HANDLE Handle[2]; 
  PVOID Object; 

  *(_QWORD *)Handle = 0i64;
  v3 = v2;
  v4 = v1;
  *(&stru_140C50B28 + 265) = 1;
  if( !MmStoreCheckPagefiles() )
    return -1073741497;
  Pool = MiAllocatePool(64i64, 0x28ui64, 0x70546D4Dui64);
  v6 = (INT64)Pool;
  if( !Pool )
    return -1073741670;
  *Pool = &Irp;
  KeInitializeEvent((INT64)(Pool + 1), 0, 0);
  *(_DWORD *)(v6 + 32) = 0;
  SystemThread = PsCreateSystemThreadEx((__int64)Handle, 0x1FFFFF, 0i64, 0i64, 0i64, MiStoreEvictThread, v6, 0i64, 0i64);
  if( SystemThread < 0 )
  {
    ExFreePoolWithTag((PVOID)v6, 0);
  }
  else
  {
    v8 = (_RTL_BITMAP *)MiAllocatePool(
                          64i64,
                          8 * (((unsigned int)MaxIoSize >> 6) + ((MaxIoSize & 0x3F) != 0) + 2),
                          0x20206D4Dui64);
    v9 = v8;
    if( v8 )
    {
      v8->SizeOfBitMap = MaxIoSize;
      v8->Buffer = &v8[1].SizeOfBitMap;
      RtlClearAllBits(v8);
      v10 = 0i64;
      if( *(&stru_140C50B28 + 1708) )
      {
        v11 = (__int64 *)((char *)&stru_140C50B28 + 6840);
        v12 = *(&stru_140C50B28 + 1708);
        do
        {
          v13 = *v11;
          v14 = v10;
          ++v11;
          v10 = *(_QWORD *)(v13 + 8);
          if( v14 >= v10 )
            v10 = v14;
          --v12;
        }
        while( v12 );
      }
      v15 = *(&stru_140C50B28 + 853) + v10;
      MaximumSize = 0xFFFFFFFi64;
      LODWORD(InternalFlags) = 2;
      if( v15 <= 0xFFFFFFF )
        MaximumSize = v15;
      LODWORD(Flags) = 0;
      Pagefile = (_UNICODE_STRING *)MiCreatePagefile(
                                      &Irp,
                                      0i64,
                                      0i64,
                                      MaximumSize,
                                      MaximumSize,
                                      0i64,
                                      Flags,
                                      InternalFlags);
      v18 = Pagefile;
      if( Pagefile )
      {
        MiInsertPageFileInList(Pagefile);
        SystemThread = v19;
        if( v19 < 0 )
        {
          *(_DWORD *)(v6 + 32) = 1;
        }
        else
        {
          Object = 0i64;
          *(&stru_140C50B28 + 146) = v9;
          *(&stru_140C50B28 + 265) = 254;
          v20 = WORD2(v18[12].Buffer) & 0xF;
          *(&stru_140C50B28 + 147) = v4;
          *(&stru_140C50B28 + 263) = v20;
          ObReferenceObjectByHandle(*(VOID **)Handle, 0x1FFFFFui64, (_OBJECT_TYPE *)PsThreadType, 0, &Object, 0i64);
          v9 = 0i64;
          v18 = 0i64;
          *(&stru_140C50B28 + 136) = Object;
          *(&stru_140C50B28 + 296) = v3;
          SystemThread = 0;
          *(&stru_140C50B28 + 264) = 1;
        }
      }
      else
      {
        *(_DWORD *)(v6 + 32) = 1;
        SystemThread = -1073741670;
      }
      if( v9 )
        ExFreePoolWithTag(v9, 0);
      if( v18 )
        MiDeletePagefile((_MMPAGING_FILE *)v18, 1ui64);
    }
    else
    {
      *(_DWORD *)(v6 + 32) = 1;
      SystemThread = -1073741670;
    }
    KeSetEvent((PRKEVENT)(v6 + 8), 0, 0);
    ObCloseHandle(*(VOID **)Handle, 0);
  }
  return SystemThread;
}

Referenced by:

SmFirstTimeInit