FsRtlPrepareMdlWriteDev

BOOLEAN __stdcall FsRtlPrepareMdlWriteDev(
        PFILE_OBJECT FileObject,
        PLARGE_INTEGER FileOffset,
        ULONG Length,
        ULONG LockKey,
        PMDL *MdlChain,
        PIO_STATUS_BLOCK IoStatus,
        PDEVICE_OBJECT DeviceObject){
  __int64 v9; 
  __int64 v10; 
  char v11; 
  BOOL v12; 
  BOOL v13; 
  char *FsContext; 
  _ETHREAD *CurrentThread; 
  _MMSUPPORT_INSTANCE *v17; 
  UINT64 v18; 
  union _LARGE_INTEGER v19; 
  LONGLONG v20; 
  char v21; 
  UINT64 v22; 
  ERESOURCE *v23; 
  UINT64 v24; 
  UINT64 v25; 
  union _LARGE_INTEGER *v26; 
  ERESOURCE *v27; 
  ERESOURCE *v28; 
  PIO_STATUS_BLOCK v29; 
  PIO_STATUS_BLOCK v30; 
  UINT64 Alignment; 
  UINT64 Alignmenta; 
  UINT64 *NumberOfPages; 
  UINT64 *NumberOfPagesa; 
  BOOLEAN v35; 
  char v36; 
  char v37; 
  int v38; 
  union _LARGE_INTEGER EndOffset; 
  __int64 v40; 
  __int64 v41; 
  char *v42; 
  v9 = 0i64;
  v40 = 0i64;
  v10 = 0i64;
  v41 = 0i64;
  v35 = 1;
  v36 = 0;
  if( FileOffset->LowPart != -1 || (v11 = 1, FileOffset->HighPart != -1) )
    v11 = 0;
  v37 = v11;
  if( IoGetTopLevelIrp() )
    return 0;
  LOBYTE(v12) = 1;
  if( !CcCanIWrite(FileObject, Length, v12, 0) || (FileObject->Flags & 0x10) != 0 )
    return 0;
  IoStatus->Status = 0;
  if( !Length )
    return 1;
  FsContext = (char *)FileObject->FsContext;
  v42 = FsContext;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  if( v11 || Length + FileOffset->QuadPart > *((_QWORD *)FsContext + 5) )
  {
    ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), 1u);
    LOBYTE(v18) = 0;
  }
  else
  {
    LOBYTE(v13) = 1;
    ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v13);
    LOBYTE(v18) = 1;
  }
  if( v11 )
    v19 = *(union _LARGE_INTEGER *)(FsContext + 32);
  else
    v19 = *FileOffset;
  v20 = v19.QuadPart + Length;
  v38 = HIDWORD(v20);
  EndOffset = v19;
  if( !FileObject->PrivateCacheMap )
    goto LABEL_52;
  v21 = FsContext[5];
  if( !v21 )
    goto LABEL_52;
  v22 = Length;
  if( 0x7FFFFFFFFFFFFFFFi64 - v19.QuadPart < Length || v20 > *((_QWORD *)FsContext + 3) )
    goto LABEL_52;
  if( (_BYTE)v18 && v20 > *((_QWORD *)FsContext + 5) )
  {
    ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
    ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), 1u);
    if( v37 )
    {
      v19 = *(union _LARGE_INTEGER *)(FsContext + 32);
      EndOffset = v19;
      v22 = Length;
      v20 = v19.QuadPart + Length;
      v38 = HIDWORD(v20);
    }
    else
    {
      v22 = Length;
    }
    if( !FileObject->PrivateCacheMap )
      goto LABEL_52;
    v21 = FsContext[5];
    if( !v21 || v20 > *((_QWORD *)FsContext + 3) )
      goto LABEL_52;
  }
  if( v21 == 2 )
  {
    NumberOfPages = (UINT64 *)IoStatus;
    LOBYTE(Alignment) = 0;
    LODWORD(v29) = LockKey;
    LOBYTE(v18) = 1;
    if( !(*(unsigned __int8(__fastcall **)(PFILE_OBJECT, PLARGE_INTEGER, UINT64, UINT64))(*(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64)
                                                                                          + 8i64))(
            FileObject,
            FileOffset,
            v22,
            v18) )
    {
LABEL_52:
      ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      return 0;
    }
  }
  if( v20 > *((_QWORD *)FsContext + 4) )
  {
    v36 = 1;
    v9 = *((_QWORD *)FsContext + 4);
    v40 = v9;
    v10 = *((_QWORD *)FsContext + 5);
    v41 = v10;
    if( *((_DWORD *)FsContext + 9) == v38 || (v23 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
    {
      *((_QWORD *)FsContext + 4) = v20;
    }
    else
    {
      ExAcquireResourceExclusiveLite(v23, 1u);
      *((_QWORD *)FsContext + 4) = v20;
      ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
    }
  }
  IoSetTopLevelIrp((_MI_PARTITION *)4, v17, v22, v18, (UINT64)v29, Alignment, NumberOfPages);
  v26 = (union _LARGE_INTEGER *)(FsContext + 40);
  if( v19.QuadPart > *((_QWORD *)FsContext + 5) )
    v35 = CcZeroData(FileObject, v26, &EndOffset, 1u);
  if( v35 )
    CcPrepareMdlWrite(FileObject, &EndOffset, Length, MdlChain, IoStatus);
  IoSetTopLevelIrp(0i64, (_MMSUPPORT_INSTANCE *)v26, v24, v25, (UINT64)v30, Alignmenta, NumberOfPagesa);
  if( v35 )
  {
    if( v20 > *((_QWORD *)FsContext + 5) )
    {
      if( *((_DWORD *)FsContext + 11) == v38 || (v27 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
      {
        *((_QWORD *)FsContext + 5) = v20;
      }
      else
      {
        ExAcquireResourceExclusiveLite(v27, 1u);
        *((_QWORD *)FsContext + 5) = v20;
        ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
      }
    }
    FileObject->Flags |= 0x1000u;
    if( v36 )
    {
      *((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap + 1) = v20;
      FileObject->Flags |= 0x2000u;
    }
  }
  else if( v36 )
  {
    v28 = (ERESOURCE *)*((_QWORD *)FsContext + 2);
    if( v28 )
    {
      ExAcquireResourceExclusiveLite(v28, 1u);
      *((_QWORD *)FsContext + 4) = v9;
      *((_QWORD *)FsContext + 5) = v10;
      ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
    }
    else
    {
      *((_QWORD *)FsContext + 4) = v9;
      *((_QWORD *)FsContext + 5) = v10;
    }
  }
  ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v35;
}

Referenced by:

No references.