CmpDoFileRead
VOID __fastcall CmpDoFileRead(VOID *FileHandle, INT64 a2, UINT32 a3, CHAR *a4, UINT32 a5, INT64 a6, INT64 a7){
UINT32 v7;
unsigned int v9;
NTSTATUS v10;
UINT32 v11;
CHAR *Buffer;
UINT32 Length;
NTSTATUS Status;
int Information;
PIO_STATUS_BLOCK IoStatusBlock;
union _LARGE_INTEGER ByteOffset;
PVOID Object;
HANDLE Event;
struct _IO_STATUS_BLOCK v20;
UINT32 v21;
v21 = a3;
ByteOffset.QuadPart = 0i64;
Event = 0i64;
v7 = a3;
Object = 0i64;
v9 = 0x10000000;
v20 = 0i64;
v10 = CmpCreateEvent(SynchronizationEvent, &Event, (KEVENT **)&Object);
if( v10 < 0 )
{
LODWORD(IoStatusBlock) = 16;
SetFailureLocation(a7, 1i64, 12i64, (unsigned int)v10, (INT64)IoStatusBlock);
return;
}
v11 = a5;
if( !a5 )
goto LABEL_12;
Buffer = a4;
while( 1 )
{
ByteOffset.QuadPart = v7;
Length = v9;
if( v11 <= v9 )
Length = v11;
Status = ZwReadFile(FileHandle, Event, 0i64, 0i64, &v20, Buffer, Length, &ByteOffset, 0i64);
if( Status == 259 )
{
KeWaitForSingleObject(Object, Executive, 0, 0, 0i64);
Status = v20.Status;
}
if( Status < 0 && v9 > 0x10000 )
{
Buffer = a4;
v9 >>= 1;
goto LABEL_11;
}
v11 -= Length;
v21 = Length + ByteOffset.LowPart;
Buffer = &a4[Length];
a4 = Buffer;
if( Status < 0 )
break;
if( v20.Information != Length )
{
ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
ZwClose(Event);
Information = v20.Information;
if( a7 )
{
*(_DWORD *)(a7 + 208) = 1;
*(_QWORD *)(a7 + 216) = FileHandle;
*(_DWORD *)(a7 + 224) = Information - Length;
}
CmRegistryIODebug = 1;
dword_140D2DAA0 = Information - Length;
qword_140D2DA98 = (__int64)FileHandle;
return;
}
LABEL_11:
v7 = v21;
if( !v11 )
goto LABEL_12;
}
if( a7 )
{
*(_DWORD *)(a7 + 208) = 1;
*(_QWORD *)(a7 + 216) = FileHandle;
*(_DWORD *)(a7 + 224) = Status;
}
CmRegistryIODebug = 1;
qword_140D2DA98 = (__int64)FileHandle;
dword_140D2DAA0 = Status;
LABEL_12:
ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
ZwClose(Event);
}Referenced by:
CmpFileRead