SmKmStoreFileWriteHeader

NTSTATUS __stdcall SmKmStoreFileWriteHeader(
        _SMKM_FILE_INFO *FileInfo,
        UINT64 PerformsFileIo,
        _SMC_CACHE_PARAMETERS *CacheParams,
        UINT64 StoreCount){
  int v5; 
  _MDL *v6; 
  char v7; 
  char v8; 
  _PRIVILEGE_SET *v9; 
  INT16 v10; 
  _PRIVILEGE_SET *Buffer; 
  signed int Status; 
  _MDL *Mdl; 
  VOID *v14; 
  NTSTATUS v15; 
  INT64 *v16; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  _LARGE_INTEGER StartingOffset; 
  INT64 v20[3]; 
  __int128 FileInformation; 
  __int64 v22; 

  StartingOffset.QuadPart = 0i64;
  v22 = 0i64;
  IoStatusBlock = 0i64;
  v5 = PerformsFileIo;
  v6 = 0i64;
  FileInformation = 0i64;
  IoSetThreadHardErrorMode(0);
  v8 = v7;
  LODWORD(v9) = SSHSupportAllocateNonPaged(0x10000, 0x68466D73u);
  Buffer = v9;
  if( !v9 )
  {
    Status = -1073741670;
    goto LABEL_19;
  }
  if( !v5 )
  {
    Mdl = MmCreateMdl(0i64, v9, 0x10000ui64);
    v6 = Mdl;
    if( !Mdl )
    {
      Status = -1073741670;
      goto LABEL_17;
    }
    MmBuildMdlForNonPagedPool(Mdl);
    MmMdlPageContentsState(v6, MmMdlPageContentsInvariant);
  }
  memset(Buffer, 0i64, 0x10000u);
  Buffer->PrivilegeCount = 1164135783;
  Buffer->Control = 3;
  Buffer[2].PrivilegeCount = 1;
  Buffer->Privilege[0].Luid.LowPart = RtlComputeCrc32(0i64, (UINT8 *)Buffer, 0x30ui64);
  v14 = *(VOID **)FileInfo;
  if( v5 )
  {
    v15 = ZwWriteFile((_HANDLE)v14, 0, 0i64, 0i64, &IoStatusBlock, Buffer, 0x10000u, &StartingOffset, 0i64);
    v16 = (INT64 *)(*((_QWORD *)FileInfo + 1) + 152i64);
  }
  else
  {
    Status = ZwQueryInformationFile(v14, &IoStatusBlock, &FileInformation, 0x18ui64, FileStandardInformation);
    if( Status == 259 )
    {
      KeWaitForSingleObject(*((_QWORD *)FileInfo + 1) + 152i64, 0, 0, 0, 0i64);
      Status = IoStatusBlock.Status;
    }
    if( Status < 0 )
      goto LABEL_17;
    KeInitializeEvent((INT64)v20, 0, 0);
    v15 = IoSynchronousPageWrite(*((_FILE_OBJECT **)FileInfo + 1), v6, &StartingOffset, (_KEVENT *)v20, &IoStatusBlock);
    v16 = v20;
  }
  Status = v15;
  if( v15 == 259 )
  {
    KeWaitForSingleObject((UINT64)v16, 0, 0, 0, 0i64);
    Status = IoStatusBlock.Status;
  }
  if( Status >= 0 )
    Status = IoStatusBlock.Information != 0x10000 ? 0xC000016A : 0;
LABEL_17:
  CmSiFreeMemory(Buffer);
  if( v6 )
    ExFreePoolWithTag(v6, 0);
LABEL_19:
  LOBYTE(v10) = v8;
  IoSetThreadHardErrorMode(v10);
  return Status;
}

Referenced by:

SmKmStoreFileCreate