PopFlushVolumeWorker
VOID __stdcall PopFlushVolumeWorker(POP_FLUSH_VOLUME *Flush){
_QWORD *v2;
__int64 v3;
_QWORD *v4;
_QWORD *v5;
UINT64 FileAttributes;
UINT64 ShareAccess;
UINT64 CreateDisposition;
UINT64 CreateOptions;
UINT64 EaLength;
VOID *FileHandle;
UINT64 ReturnLength;
_IO_STATUS_BLOCK IoStatusBlock;
_OBJECT_ATTRIBUTES ObjectAttributes;
ULONG Length[128];
LODWORD(ReturnLength) = 0;
FileHandle = 0i64;
IoStatusBlock = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
memset(Length, 0i64, sizeof(Length));
ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 1368));
while( 1 )
{
v2 = *(_QWORD **)Flush->List;
if( *(POP_FLUSH_VOLUME **)Flush->List == Flush )
break;
v3 = *v2;
if( *(_QWORD **)(*v2 + 8i64) != v2
|| (v4 = (_QWORD *)v2[1], (_QWORD *)*v4 != v2)
|| (*v4 = v3,
*(_QWORD *)(v3 + 8) = v4,
v5 = (_QWORD *)*(&stru_140C23628 + 168),
(_UNKNOWN *)**(&stru_140C23628 + 168) != (_UNKNOWN *)((char *)&stru_140C23628 + 1336)) )
{
__fastfail(3u);
}
*v2 = (char *)&stru_140C23628 + 1336;
v2[1] = v5;
*v5 = v2;
*(&stru_140C23628 + 168) = v2;
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 1368));
if( ObQueryNameString((VOID *)*(v2 - 6), (_OBJECT_NAME_INFORMATION *)Length, 0x200ui64, &ReturnLength) >= 0 )
{
if( *(_QWORD *)&Length[2] )
{
LODWORD(EaLength) = 0;
LODWORD(CreateOptions) = 32;
LODWORD(CreateDisposition) = 1;
LODWORD(ShareAccess) = 3;
LODWORD(FileAttributes) = -1073741824;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)Length;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwCreateFile(
&FileHandle,
0x100003ui64,
&ObjectAttributes,
&IoStatusBlock,
0i64,
FileAttributes,
ShareAccess,
CreateDisposition,
CreateOptions,
0i64,
EaLength) >= 0 )
{
if( Flush[1].Wait[4] )
{
PopFlushAndHold(FileHandle, &IoStatusBlock);
}
else if( Flush[1].Wait[5] )
{
NtDeviceIoControlFile((_HANDLE)FileHandle, 0, 0i64, 0i64, &IoStatusBlock, 0x53C004u, 0i64, 0, 0i64, 0);
}
else
{
ZwFlushBuffersFile(FileHandle, &IoStatusBlock);
}
ZwClose((_HANDLE)FileHandle);
}
}
}
ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 1368));
}
if( (*(_DWORD *)&Flush->Wait[4])-- == 1 )
KeSetEvent((PRKEVENT)&Flush->Wait[12], 0, 0);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 1368));
}Referenced by:
PopFlushVolumes