FsRtlCopyWrite

BOOLEAN __stdcall FsRtlCopyWrite(
        PFILE_OBJECT FileObject,
        PLARGE_INTEGER FileOffset,
        ULONG Length,
        BOOLEAN Wait,
        ULONG LockKey,
        PVOID Buffer,
        PIO_STATUS_BLOCK IoStatus,
        PDEVICE_OBJECT DeviceObject){
  unsigned __int64 v9; 
  BOOLEAN v12; 
  int v13; 
  char *FsContext; 
  char v15; 
  __int64 v16; 
  __int64 v17; 
  _ETHREAD *CurrentThread; 
  int v19; 
  UINT64 v20; 
  _MMSUPPORT_INSTANCE *v22; 
  union _LARGE_INTEGER v23; 
  char *v24; 
  char v25; 
  signed __int64 v26; 
  __int64 v27; 
  PLARGE_INTEGER v28; 
  ERESOURCE *v29; 
  _MMSUPPORT_INSTANCE *v30; 
  UINT64 v31; 
  VOID *v32; 
  BOOLEAN v33; 
  ERESOURCE *v34; 
  ERESOURCE *v35; 
  PVOID v36; 
  PVOID v37; 
  UINT64 v38; 
  UINT64 v39; 
  __int128 *v40; 
  UINT64 *v41; 
  BOOLEAN v42; 
  char v43; 
  char v44; 
  char *v45; 
  union _LARGE_INTEGER EndOffset; 
  _MMSUPPORT_INSTANCE *Vm; 
  __int64 v48; 
  __int64 v49; 
  char *v50; 
  __int128 v51[5]; 
  v9 = Length;
  v12 = 0;
  v42 = 1;
  v44 = 0;
  if( FileOffset->LowPart != -1 || (v43 = 1, FileOffset->HighPart != -1) )
    v43 = 0;
  if( IoGetTopLevelIrp() )
    return 0;
  FsContext = (char *)FileObject->FsContext;
  v50 = FsContext;
  LOBYTE(v13) = Wait;
  if( !CcCanIWrite(FileObject, v9, v13, 0) )
    return 0;
  if( (FileObject->Flags & 0x10) != 0 )
    return 0;
  CcCopyWriteWontFlush(FileObject, FileOffset, (unsigned int)v9);
  if( !v15 )
    return 0;
  IoStatus->Status = 0;
  Vm = (_MMSUPPORT_INSTANCE *)v9;
  IoStatus->Information = v9;
  if( !(_DWORD)v9 )
    return 1;
  v16 = 0i64;
  v48 = 0i64;
  v17 = 0i64;
  v49 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v19 = -1;
  --*((_WORD *)CurrentThread + 242);
  if( v43 || (signed __int64)(FileOffset->QuadPart + v9) > *((_QWORD *)FsContext + 5) )
  {
    if( !ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), Wait) )
      goto LABEL_12;
    LOBYTE(v20) = 0;
  }
  else
  {
    LOBYTE(v19) = Wait;
    if( !ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v19) )
    {
LABEL_12:
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      return 0;
    }
    LOBYTE(v20) = 1;
  }
  v22 = Vm;
  if( v43 )
    v23 = *(union _LARGE_INTEGER *)(FsContext + 32);
  else
    v23 = *FileOffset;
  v24 = (char *)Vm + v23.QuadPart;
  v45 = (char *)Vm + v23.QuadPart;
  EndOffset = v23;
  if( !FileObject->PrivateCacheMap )
    goto LABEL_33;
  v25 = FsContext[5];
  if( !v25 )
    goto LABEL_33;
  v26 = *((_QWORD *)FsContext + 5);
  if( v23.QuadPart >= v26 + 0x2000
    || 0x7FFFFFFFFFFFFFFFi64 - v23.QuadPart < (__int64)Vm
    || (__int64)v24 > *((_QWORD *)FsContext + 3) )
  {
    goto LABEL_33;
  }
  if( (_BYTE)v20 && (__int64)v24 > v26 )
  {
    ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
    if( !ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), Wait) )
      goto LABEL_12;
    if( v43 )
    {
      v23 = *(union _LARGE_INTEGER *)(FsContext + 32);
      EndOffset = v23;
      v24 = (char *)Vm + v23.QuadPart;
      v45 = (char *)Vm + v23.QuadPart;
    }
    if( !FileObject->PrivateCacheMap || (v25 = FsContext[5]) == 0 || (__int64)v24 > *((_QWORD *)FsContext + 3) )
    {
LABEL_33:
      ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
      goto LABEL_12;
    }
  }
  if( v25 != 2 )
    goto LABEL_39;
  v27 = *(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64);
  v51[0] = 0i64;
  v28 = FileOffset;
  if( FileOffset->QuadPart == -1 )
    v28 = (PLARGE_INTEGER)(FsContext + 32);
  v40 = v51;
  LOBYTE(v38) = 0;
  LODWORD(v36) = LockKey;
  LOBYTE(v20) = Wait;
  if( (*(unsigned __int8(__fastcall **)(PFILE_OBJECT, PLARGE_INTEGER, _QWORD, UINT64))(v27 + 8))(
         FileObject,
         v28,
         Length,
         v20) )
  {
LABEL_39:
    if( (__int64)v24 > *((_QWORD *)FsContext + 4) )
    {
      v44 = 1;
      v16 = *((_QWORD *)FsContext + 4);
      v48 = v16;
      v17 = *((_QWORD *)FsContext + 5);
      v49 = v17;
      if( *((_DWORD *)FsContext + 9) == HIDWORD(v45) || (v29 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
      {
        *((_QWORD *)FsContext + 4) = v24;
      }
      else
      {
        ExAcquireResourceExclusiveLite(v29, 1u);
        *((_QWORD *)FsContext + 4) = v24;
        ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
      }
    }
    IoSetTopLevelIrp((_MI_PARTITION *)4, v22, v26, v20, (UINT64)v36, v38, (UINT64 *)v40);
    if( v23.QuadPart > *((_QWORD *)FsContext + 5) )
      v42 = CcZeroData(FileObject, (PLARGE_INTEGER)FsContext + 5, &EndOffset, Wait);
    if( v42 )
    {
      LOBYTE(v32) = Wait;
      CcCopyWrite(FileObject, &EndOffset, Length, v32, Buffer);
      v42 = v33;
    }
    IoSetTopLevelIrp(0i64, v30, v31, (UINT64)v32, (UINT64)v37, v39, v41);
    if( v42 )
    {
      if( (__int64)v24 > *((_QWORD *)FsContext + 5) )
      {
        if( *((_DWORD *)FsContext + 11) == HIDWORD(v45) || (v34 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
        {
          *((_QWORD *)FsContext + 5) = v24;
        }
        else
        {
          ExAcquireResourceExclusiveLite(v34, 1u);
          *((_QWORD *)FsContext + 5) = v24;
          ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
        }
      }
      FileObject->Flags |= 0x1000u;
      if( v44 )
      {
        *((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap + 1) = v24;
        FileObject->Flags |= 0x2000u;
      }
      FileObject->CurrentByteOffset.QuadPart = v23.QuadPart + Length;
    }
    else if( v44 )
    {
      v35 = (ERESOURCE *)*((_QWORD *)FsContext + 2);
      if( v35 )
      {
        ExAcquireResourceExclusiveLite(v35, 1u);
        *((_QWORD *)FsContext + 4) = v16;
        *((_QWORD *)FsContext + 5) = v17;
        ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
      }
      else
      {
        *((_QWORD *)FsContext + 4) = v16;
        *((_QWORD *)FsContext + 5) = v17;
      }
    }
    ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
    v12 = v42;
  }
  else
  {
    ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
  }
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v12;
}

Referenced by:

No references.