IoRaiseInformationalHardError
VOID __fastcall IoRaiseInformationalHardError(_VACB_ARRAY_HEADER *VacbArrayHeader){
UINT8 **v1;
INT64 v2;
INT64 v3;
UINT8 **v4;
int v5;
UINT64 v6;
_OWORD *PoolWithTag;
UINT8 *v8;
_KAPC *v9;
UINT64 v10;
unsigned __int8 v11;
unsigned __int64 v12;
void *v13;
__int64 v14;
int v15;
void *v16;
_QWORD *v17;
void *v18;
v3 = v2;
v4 = v1;
v5 = (int)VacbArrayHeader;
if( IopInitSystemCompletedEnoughForReInitRoutines )
{
if( v2 )
{
if( (*(_DWORD *)(v2 + 1296) & 0x10) != 0 )
return;
}
else if( (*((_DWORD *)KeGetCurrentThread() + 324) & 0x10) != 0 )
{
return;
}
if( (_DWORD)VacbArrayHeader != -1073741283
&& (_DWORD)VacbArrayHeader != -1073741500
&& (_DWORD)VacbArrayHeader != 1073741848
&& (v2 || stru_140C45C78.Header.SignalState < 25)
&& dword_140C45C9C <= 25 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x28ui64, 0x72456F49ui64);
if( PoolWithTag )
{
*PoolWithTag = 0i64;
PoolWithTag[1] = 0i64;
*((_QWORD *)PoolWithTag + 4) = 0i64;
*((_DWORD *)PoolWithTag + 4) = v5;
if( v4 && *(_WORD *)v4 )
{
v8 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, *(unsigned __int16 *)v4, 0x72456F49ui64);
if( !v8 )
{
LABEL_40:
ExFreePoolWithTag(PoolWithTag, 0);
return;
}
*((_WORD *)PoolWithTag + 12) = *(_WORD *)v4;
*((_WORD *)PoolWithTag + 13) = *(_WORD *)v4;
*((_QWORD *)PoolWithTag + 4) = v8;
memmove(v8, v4[1], *(unsigned __int16 *)v4);
}
if( v3 )
{
v9 = (_KAPC *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x58ui64, 0x4350414Bui64);
if( v9 )
{
_InterlockedIncrement(&dword_140C45C9C);
KeInitializeApc(
(INT64)v9,
v3,
0i64,
(INT64)SC_ENV::Free,
0i64,
(INT64)IopRaiseInformationalHardError,
0,
(INT64)PoolWithTag);
KeInsertQueueApc(v9, 0i64, 0i64, 0i64);
return;
}
goto LABEL_38;
}
KeAcquireSpinLockRaiseToDpc(&qword_140C45C70, v6);
v12 = v11;
if( stru_140C45C78.Header.SignalState >= 25
|| IopCurrentHardError
&& *((_DWORD *)PoolWithTag + 4) == *(_DWORD *)(IopCurrentHardError + 16)
&& ((v13 = (void *)*((_QWORD *)PoolWithTag + 4)) == 0i64 && !*(_QWORD *)(IopCurrentHardError + 32)
|| *((_WORD *)PoolWithTag + 12) == *(_WORD *)(IopCurrentHardError + 24)
&& !memcmp(v13, *(PVOID *)(IopCurrentHardError + 32), *((unsigned __int16 *)PoolWithTag + 12))) )
{
LABEL_37:
KxReleaseSpinLock(&qword_140C45C70);
__writecr8(v12);
LABEL_38:
v18 = (void *)*((_QWORD *)PoolWithTag + 4);
if( v18 )
ExFreePoolWithTag(v18, 0);
goto LABEL_40;
}
v14 = qword_140C45C60;
if( (__int64 *)qword_140C45C60 != &qword_140C45C60 )
{
v15 = *((_DWORD *)PoolWithTag + 4);
do
{
if( v15 == *(_DWORD *)(v14 + 16) )
{
v16 = (void *)*((_QWORD *)PoolWithTag + 4);
if( !v16 && !*(_QWORD *)(v14 + 32) )
goto LABEL_37;
if( *((_WORD *)PoolWithTag + 12) == *(_WORD *)(v14 + 24)
&& !memcmp(v16, *(PVOID *)(v14 + 32), *((unsigned __int16 *)PoolWithTag + 12)) )
{
goto LABEL_37;
}
}
v14 = *(_QWORD *)v14;
}
while( (__int64 *)v14 != &qword_140C45C60 );
}
v17 = (_QWORD *)qword_140C45C68;
if( *(__int64 **)qword_140C45C68 != &qword_140C45C60 )
__fastfail(3u);
*(_QWORD *)PoolWithTag = &qword_140C45C60;
*((_QWORD *)PoolWithTag + 1) = v17;
*v17 = PoolWithTag;
qword_140C45C68 = (__int64)PoolWithTag;
KeReleaseSemaphoreEx(&stru_140C45C78, 0i64, 1i64, v10);
if( !byte_140C45C98 )
{
byte_140C45C98 = 1;
ExQueueWorkItem(&IopHardError, DelayedWorkQueue);
}
KxReleaseSpinLock(&qword_140C45C70);
__writecr8(v12);
}
}
}
}Referenced by:
FsRtlLogCcFlushError
MiCauseOverCommitPopup
PopTransitionSystemPowerStateEx