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.