SmSetStoreInformation

NTSTATUS __stdcall SmSetStoreInformation(
        VOID *SystemInformation,
        VOID *SystemInformationLength,
        INT64 PreviousMode,
        _KPROCESSOR_MODE a4){
  INT8 v4; 
  UINT64 v5; 
  NTSTATUS result; 
  __int128 UserData; 
  UINT64 UserDataLength; 

  v4 = a4;
  if( (_DWORD)PreviousMode != 24 )
    return -1073741820;
  UserData = *(_OWORD *)SystemInformationLength;
  UserDataLength = *((_QWORD *)SystemInformationLength + 2);
  if( (unsigned int)*(_OWORD *)SystemInformationLength != 1 )
    return -1073741811;
  if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeProfileSingleProcessPrivilege, a4) )
    return -1073741790;
  if( SDWORD1(UserData) <= 12 )
  {
    switch( DWORD1(UserData) )
    {
      case 0xC:
        return SmcProcessStoreDeleteRequest(&CacheMgr, *((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
      case 3:
        return SmProcessCreateRequest(
                 (_SMKM_STORE_LIST *)SmGlobals,
                 *((VOID **)&UserData + 1),
                 (unsigned int)UserDataLength,
                 v4);
      case 4:
        return SmProcessDeleteRequest(
                 (_SMKM_STORE_LIST *)SmGlobals,
                 *((VOID **)&UserData + 1),
                 (unsigned int)UserDataLength,
                 v4);
      case 9:
        return SmcProcessCreateRequest(&CacheMgr, *((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
      case 0xA:
        return SmcProcessDeleteRequest(&CacheMgr, *((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
      case 0xB:
        return SmcProcessStoreCreateRequest(&CacheMgr, *((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
    }
    return -1073741821;
  }
  switch( DWORD1(UserData) )
  {
    case 0x11:
      LOBYTE(v5) = v4;
      SmProcessResizeRequest((UINT64)SmGlobals, *((UINT64 *)&UserData + 1), (unsigned int)UserDataLength, v5);
      break;
    case 0x12:
      return SmcProcessResizeRequest(&CacheMgr, *((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
    case 0x13:
      return SmProcessConfigRequest(*((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
    case 0x14:
      return SmProcessStoreMemoryPriorityRequest(*((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
    case 0x15:
      return SmProcessSystemStoreTrimRequest(*((VOID **)&UserData + 1), (unsigned int)UserDataLength, v4);
    default:
      return -1073741821;
  }
  return result;
}

Referenced by:

NtSetSystemInformation