CmpCmdHiveClose
VOID __stdcall CmpCmdHiveClose(_CMHIVE *CmHive){
void **FileHandles;
char v3;
char v4;
VOID *v5;
_LARGE_INTEGER LastWriteTime;
unsigned int i;
VOID *v8;
__int16 *p_ObjectInformation;
UINT64 FileInformationClass;
__int16 v11;
__int16 ObjectInformation;
_IO_STATUS_BLOCK IoStatusBlock;
__int128 FileInformation;
__int128 v15;
__int64 v16;
v16 = 0i64;
IoStatusBlock = 0i64;
FileInformation = 0i64;
v15 = 0i64;
IoSetThreadHardErrorMode(0);
FileHandles = CmHive->FileHandles;
v4 = v3;
v5 = CmHive->FileHandles[0];
if( v5 && ZwQueryInformationFile(v5, &IoStatusBlock, &FileInformation, 0x28ui64, FileBasicInformation) >= 0 )
{
if( CmHive->Hive.DirtyFlag )
{
*(_QWORD *)&v15 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
}
else
{
LastWriteTime.QuadPart = v15;
if( CmHive->LastWriteTime.QuadPart )
LastWriteTime = CmHive->LastWriteTime;
*(_LARGE_INTEGER *)&v15 = LastWriteTime;
}
*((_QWORD *)&FileInformation + 1) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
LODWORD(FileInformationClass) = 4;
ZwSetInformationFile((UINT64)v5, (UINT64)&IoStatusBlock, (INT8 *)&FileInformation, 0x28ui64, FileInformationClass);
}
for( i = 0; i < 6; ++i )
{
v8 = *FileHandles;
if( *FileHandles )
{
if( i )
{
ObjectInformation = 0;
p_ObjectInformation = &ObjectInformation;
}
else
{
v11 = 0;
p_ObjectInformation = &v11;
}
ZwSetInformationObject(v8, ObjectHandleFlagInformation, p_ObjectInformation, 2ui64);
ZwClose((_HANDLE)*FileHandles);
*FileHandles = 0i64;
}
++FileHandles;
}
LOBYTE(v8) = v4;
IoSetThreadHardErrorMode((INT16)v8);
}Referenced by:
CmShutdownSystem
CmpCompleteUnloadKey
CmpDestroyHive