CcPreparePinWrite

BOOLEAN __stdcall CcPreparePinWrite(
        PFILE_OBJECT FileObject,
        PLARGE_INTEGER FileOffset,
        ULONG Length,
        BOOLEAN Zero,
        ULONG Flags,
        PVOID *Bcb,
        PVOID *Buffer){
  unsigned int v8; 
  __int64 v10; 
  LONGLONG QuadPart; 
  PVOID *p_BcbVoid; 
  BOOLEAN v14; 
  PVOID v15; 
  __int64 v16; 
  PVOID BcbVoid; 
  LONGLONG v18; 
  __int64 v19; 
  void *v20; 
  PVOID *v21; 
  v8 = Length;
  v20 = 0i64;
  v10 = 0i64;
  v19 = 0i64;
  QuadPart = FileOffset->QuadPart;
  v18 = FileOffset->QuadPart;
  BcbVoid = 0i64;
  p_BcbVoid = &BcbVoid;
  if( (Flags & 0x20) != 0 )
  {
    CcMapDataForOverwrite(FileObject, FileOffset, *(UINT64 *)&Length, Bcb, Buffer);
    return 1;
  }
  else
  {
    v14 = 1;
    do
    {
      if( BcbVoid )
      {
        if( p_BcbVoid == &BcbVoid )
        {
          BcbVoid = (PVOID)CcAllocateObcb();
          p_BcbVoid = (PVOID *)((char *)BcbVoid + 16);
          v21 = (PVOID *)((char *)BcbVoid + 16);
          *Buffer = v20;
          v10 = v19;
          LODWORD(QuadPart) = v18;
        }
        v8 += QuadPart - v10;
        v18 = v10;
        v21 = ++p_BcbVoid;
      }
      LODWORD(v16) = Flags;
      if( !(unsigned __int8)CcPinFileData((__int64)FileObject, &v18, v8, 0, 1, v16, p_BcbVoid, (__int64 *)&v20, &v19) )
      {
        v14 = 0;
        v15 = BcbVoid;
        goto LABEL_16;
      }
      v10 = v19;
      LODWORD(QuadPart) = v18;
    }
    while( v19 - v18 < v8 );
    if( p_BcbVoid == &BcbVoid )
      *Buffer = v20;
    if( Zero )
      memset((INT64)*Buffer, 0i64);
    CcSetDirtyPinnedData(BcbVoid, 0i64);
    v15 = BcbVoid;
    *Bcb = BcbVoid;
LABEL_16:
    if( !v14 )
    {
      if( v15 )
        CcUnpinData(v15);
    }
    return v14;
  }
}

Referenced by:

No references.