SmcCacheStart

NTSTATUS __stdcall SmcCacheStart(
        _SMC_CACHE *Cache,
        _SMC_CACHE_PARAMETERS *CacheParams,
        VOID *StartParam,
        INT64 a4,
        INT64 a5,
        INT64 *a6,
        VOID *a7,
        VOID *a8){
  _FILE_OBJECT *v8; 
  unsigned int StoreAlignment; 
  NTSTATUS UniqueId; 
  __int64 v14; 
  UINT64 v15; 
  _KEY_VALUE_FULL_INFORMATION **v16; 
  _DEVICE_OBJECT *v17; 
  NTSTATUS v18; 
  _LARGE_INTEGER *FileSizeInOut; 
  UINT64 *v21; 
  _FILE_OBJECT *VolumeFileObjectOut; 
  _LARGE_INTEGER CacheFileSize; 
  _DEVICE_OBJECT *VolumeDeviceObjectOut; 
  _SMKM_FILE_INFO FileInfo; 

  LODWORD(VolumeDeviceObjectOut) = 0;
  v8 = 0i64;
  VolumeFileObjectOut = 0i64;
  StoreAlignment = CacheParams->StoreAlignment;
  if( !StoreAlignment || ((StoreAlignment - 1) & StoreAlignment) != 0 )
  {
    UniqueId = -1073741811;
  }
  else
  {
    if( !CacheParams->CacheFileSize )
      return -1073741811;
    if( CacheParams->CacheFileSize > 0x800000000i64 )
      return -1073739516;
    *(_SMC_CACHE_PARAMETERS *)(Cache + 4) = *CacheParams;
    v14 = (unsigned __int8)StartParam & 1;
    v15 = (unsigned int)Cache[6];
    FileInfo = CacheParams->_bf_0 & 1;
    CacheFileSize = (_LARGE_INTEGER)CacheParams->CacheFileSize;
    UniqueId = SmKmStoreFileCreate(
                 (_DRIVER_OBJECT *)(Cache + 1),
                 StartParam,
                 v15,
                 (unsigned int)v15,
                 &CacheFileSize,
                 v21,
                 &FileInfo,
                 (UINT64 *)Cache + 5,
                 (UINT64 *)(Cache + 1),
                 (UINT64 *)Cache + 1);
    if( UniqueId < 0 )
      return UniqueId;
    if( (-(__int64)(v14 != 0) & (unsigned __int64)StartParam & 0xFFFFFFFFFFFFFFFEui64) != 0
      && CacheFileSize.QuadPart != CacheParams->CacheFileSize )
    {
      return -1073741792;
    }
    Cache[7] = FileInfo & 1 | Cache[7] & 0xFFFFFFFC | (2 * ((unsigned __int8)VolumeDeviceObjectOut & 1));
    v17 = (_DEVICE_OBJECT *)*((_QWORD *)Cache + 8);
    VolumeDeviceObjectOut = v17;
    if( v17 )
      goto LABEL_14;
    v18 = SmKmStoreFileOpenVolume(*((_FILE_OBJECT **)Cache + 6), &VolumeFileObjectOut, &VolumeDeviceObjectOut);
    v8 = VolumeFileObjectOut;
    UniqueId = v18;
    if( v18 >= 0 )
    {
      v17 = VolumeDeviceObjectOut;
LABEL_14:
      UniqueId = SmKmVolumeQueryUniqueId(
                   (_UNICODE_STRING *)v17,
                   (_UNICODE_STRING *)(Cache + 138),
                   (UINT64 *)0x200,
                   v16,
                   (UINT8 *)FileSizeInOut);
      if( UniqueId >= 0 )
      {
        UniqueId = StEtaHelper::StartHelper((__int64)(Cache + 26), Cache[6]);
        if( UniqueId >= 0 )
          UniqueId = 0;
      }
    }
  }
  if( v8 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v8);
  return UniqueId;
}

Referenced by:

SmcProcessCreateRequest