PopPowerButtonWorkCallback
NTSTATUS __stdcall PopPowerButtonWorkCallback(){
unsigned __int64 v0;
unsigned int v1;
UINT64 v2;
INT64 v3;
NTSTATUS result;
unsigned int ActiveConsoleId;
void *SessionById;
INT64 v7;
UINT8 v8[4];
INT64 v9;
_KAPC_STATE ApcState;
*(_DWORD *)v8 = 0;
memset(&ApcState, 0, sizeof(ApcState));
LOBYTE(v0) = KeAcquireSpinLockRaiseToDpc(&PopPowerButtonHold);
do
{
v1 = qword_140C20698;
v9 = qword_140C20698;
KxReleaseSpinLock(&PopPowerButtonHold);
__writecr8((unsigned __int8)v0);
v3 = HIDWORD(v9);
if( (dword_140C206A0 & 1) != 0 && ((v1 & 1) == 0 || HIDWORD(v9) != dword_140C206A4) )
{
PopRecordPhysicalPowerButton(0i64);
dword_140C206A0 = 0;
byte_140C20728 = 0;
PopPublishPowerButtonState();
KeDisableTimer2(&stru_140C205E8, 1u, 1u, 0i64);
}
if( (v1 & 1) != 0 )
{
if( (dword_140C206A0 & 1) == 0 )
{
LOBYTE(v2) = 1;
PopRecordPhysicalPowerButton(v2);
dword_140C206A4 = v3;
dword_140C206A8 = PopQueryPowerButtonBugcheckEnabled();
*(_DWORD *)v8 = 65544;
LODWORD(v7) = 2;
KeInitializeIRTimer((INT64)&stru_140C205E8, (INT64)PopPowerButtonTimerCallback, v3, v8, v7);
KeSetTimer2((INT64)&stru_140C205E8, -10000000i64, 10000000i64, 0i64);
}
dword_140C206A0 = v1;
PopPublishPowerButtonState();
if( v1 >> 1 >= 0x1B58 )
{
if( PopAcpiPdttSupportEnabled )
((void(__fastcall *)(_QWORD))qword_140C009F8)(0i64);
PopDiagTracePowerButtonBugcheck(v1 >> 1);
PopRecordPoBlackboxInformation();
if( dword_140C206A8 )
{
ActiveConsoleId = RtlGetActiveConsoleId();
SessionById = MmGetSessionById(ActiveConsoleId);
if( SessionById && MmAttachSession(SessionById, &ApcState) < 0 )
DbgPrintEx(0x92u, 3u, "Unable to attach to active session\n");
KeBugCheckEx(0x1C8u, (PVOID)((unsigned __int64)v1 >> 1), &PopPowerButtonTriageBlock, 0i64, 0i64);
}
}
}
v0 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&PopPowerButtonHold);
}
while( __PAIR64__(v3, v1) != qword_140C20698 );
_InterlockedExchange(&dword_140C20690, 0);
KxReleaseSpinLock(&PopPowerButtonHold);
result = KiIrqlFlags;
__writecr8(v0);
return result;
}Referenced by:
No references.