SmKmStoreFileCreateForIoType

NTSTATUS __stdcall SmKmStoreFileCreateForIoType(
        _SMKM_FILE_INFO *FileInfo,
        WCHAR *FilePath,
        UINT64 *PerformsFileIo,
        UINT64 CreateDisposition,
        UINT64 CreateOptions){
  _BOOL8 v8; 
  int v9; 
  char v10; 
  char v11; 
  int IsVolumeIoPossible; 
  _OBJECT_ATTRIBUTES *v13; 
  _IO_STATUS_BLOCK *v14; 
  INT16 v15; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  _LARGE_INTEGER *AllocationSize; 
  UINT64 FileAttributes; 
  UINT64 FileAttributesa; 
  UINT64 ShareAccess; 
  UINT64 ShareAccessa; 
  UINT64 Disposition; 
  UINT64 Dispositiona; 
  UINT64 v27; 
  UINT64 v28; 
  PVOID EaBuffer; 
  UINT64 EaLength; 
  UINT64 EaLengtha; 
  _CREATE_FILE_TYPE CreateFileType; 
  PVOID InternalParameters; 
  UINT64 Options; 
  UINT64 Optionsa; 
  _ACL *DaclOut; 
  void *FileHandle[8]; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  _UNICODE_STRING DestinationString; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  _SECURITY_DESCRIPTOR SecurityDescriptor; 
  PVOID Object; 
  UINT64 DesiredAccess; 

  LODWORD(DesiredAccess) = 0;
  LODWORD(CreateOptions) = 0;
  LODWORD(v8) = 0;
  DestinationString = 0i64;
  IoStatusBlock = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  memset(&SecurityDescriptor, 0, sizeof(SecurityDescriptor));
  memset(FileHandle, 0i64, sizeof(FileHandle));
  DaclOut = 0i64;
  if( PerformsFileIo )
  {
    v9 = 0;
  }
  else
  {
    v9 = 1;
    PerformsFileIo = &CreateOptions;
  }
  IoSetThreadHardErrorMode(0);
  v11 = v10;
  RtlInitUnicodeString(&DestinationString, FilePath);
  IsVolumeIoPossible = SmKmStoreFileMakeSecurityDescriptor(&SecurityDescriptor, &DaclOut);
  if( IsVolumeIoPossible >= 0 )
  {
    ObjectAttributes.Length = 48;
    ObjectAttributes.ObjectName = &DestinationString;
    ObjectAttributes.SecurityDescriptor = &SecurityDescriptor;
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.Attributes = 576;
    ObjectAttributes.SecurityQualityOfService = 0i64;
    while( 1 )
    {
      LODWORD(Options) = *(_DWORD *)PerformsFileIo != 0 ? 264 : 266;
      LODWORD(EaLength) = 0;
      LODWORD(v27) = 32778;
      LODWORD(Disposition) = 0;
      LODWORD(ShareAccess) = 0;
      LODWORD(FileAttributes) = 0x2000;
      IsVolumeIoPossible = IoCreateFile(
                             FileHandle,
                             0x140003ui64,
                             &ObjectAttributes,
                             &IoStatusBlock,
                             0i64,
                             FileAttributes,
                             ShareAccess,
                             Disposition,
                             v27,
                             0i64,
                             EaLength,
                             CreateFileTypeNone,
                             0i64,
                             Options);
      if( IsVolumeIoPossible < 0 )
        break;
      Object = 0i64;
      IsVolumeIoPossible = ObReferenceObjectByHandle(FileHandle[0], 0x10003ui64, 0i64, 0, &Object, 0i64);
      FileHandle[1] = Object;
      if( IsVolumeIoPossible < 0 )
        break;
      if( *(_DWORD *)PerformsFileIo )
        v8 = (IoStatusBlock.Information & 0xFFFFFFFFFFFFFFFDui64) == 0;
      else
        LODWORD(v8) = 1;
      IsVolumeIoPossible = ZwSetSecurityObject((UINT64)FileHandle[0], 4ui64, (INT64)&SecurityDescriptor);
      if( IsVolumeIoPossible < 0 )
        break;
      if( *(_DWORD *)PerformsFileIo )
        goto LABEL_25;
      IsVolumeIoPossible = SmKmIsVolumeIoPossible(
                             FileHandle,
                             (UINT64)&DesiredAccess,
                             v13,
                             v14,
                             AllocationSize,
                             FileAttributesa,
                             ShareAccessa,
                             Dispositiona,
                             v28,
                             EaBuffer,
                             EaLengtha,
                             CreateFileType,
                             InternalParameters,
                             Optionsa);
      if( IsVolumeIoPossible < 0 )
        break;
      if( (_DWORD)DesiredAccess )
      {
LABEL_25:
        v17 = *(_OWORD *)&FileHandle[2];
        *(_OWORD *)FileInfo = *(_OWORD *)FileHandle;
        v18 = *(_OWORD *)&FileHandle[4];
        *((_OWORD *)FileInfo + 1) = v17;
        v19 = *(_OWORD *)&FileHandle[6];
        *((_OWORD *)FileInfo + 2) = v18;
        *((_OWORD *)FileInfo + 3) = v19;
        memset(FileHandle, 0i64, sizeof(FileHandle));
        IsVolumeIoPossible = 0;
        goto LABEL_22;
      }
      if( v9 )
      {
        IsVolumeIoPossible = -1073741637;
        break;
      }
      *(_DWORD *)PerformsFileIo = 1;
      if( v8 )
        SmKmStoreFileDelete((_SMKM_FILE_INFO *)FileHandle);
      SmKmFileInfoCleanup((_SMKM_FILE_INFO *)FileHandle);
      memset(FileHandle, 0i64, sizeof(FileHandle));
      LODWORD(v8) = 0;
    }
    if( v8 )
      SmKmStoreFileDelete((_SMKM_FILE_INFO *)FileHandle);
  }
LABEL_22:
  SmKmFileInfoCleanup((_SMKM_FILE_INFO *)FileHandle);
  HIBYTE(v15) = BYTE1(DaclOut);
  if( DaclOut )
    ExFreePoolWithTag(DaclOut, 0);
  LOBYTE(v15) = v11;
  IoSetThreadHardErrorMode(v15);
  return IsVolumeIoPossible;
}

Referenced by:

SmKmStoreFileCreate