HalpWdatDiscover
NTSTATUS __stdcall HalpWdatDiscover(){
_LARGE_INTEGER *AcpiTable;
_LARGE_INTEGER *v1;
_WATCHDOG_TIMER_RESOURCE_TABLE *Wdrt;
int v4;
UINT64 v5;
INT64 v6;
char v7;
__int64 v8;
UINT64 v9;
INT64 v10;
unsigned __int64 v11;
bool v12;
_TIMER_INITIALIZATION_BLOCK NewTimer;
__int64 v14[18];
char v15;
unsigned int v16;
UINT64 OutputValue;
LODWORD(OutputValue) = 0;
v16 = 0;
memset(&NewTimer, 0i64, sizeof(NewTimer));
memset(v14, 0i64, 0x70u);
NewTimer.Header.TableVersion = 1;
NewTimer.Header.TableSize = 144;
v15 = 0;
AcpiTable = HalSocGetAcpiTable(0x54414457ui64);
v1 = HalSocGetAcpiTable(0x54524457ui64);
Wdrt = (_WATCHDOG_TIMER_RESOURCE_TABLE *)v1;
if( AcpiTable )
{
v4 = HalpWdatProcessWdatInternalData((__int64)AcpiTable, v14, &v16, &v15);
}
else
{
if( !v1 )
return 0;
v14[1] = (__int64)v1;
v4 = HalpWdatProcessWdrtInternalData((__int64)v1, v14, &v16, &v15);
}
v7 = v15;
if( v4 >= 0 )
{
if( !v15 )
return 0;
if( LODWORD(v14[3]) )
{
v8 = LODWORD(v14[2]);
if( LODWORD(v14[2]) >= HIDWORD(v14[2]) )
{
NewTimer.Capabilities = 163872;
LOBYTE(v6) = 32;
if( HalpWdatExecuteActionBeforeInitialize(
v6,
v5,
&OutputValue,
(_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable,
Wdrt) >= 0
&& (_DWORD)OutputValue == 1 )
{
NewTimer.Capabilities = 426016;
LOBYTE(v10) = 33;
HalpWdatExecuteActionBeforeInitialize(v10, v9, 0i64, (_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable, Wdrt);
}
v11 = (unsigned __int64)LODWORD(v14[3]) * v8 / 0x3E8;
if( v11 <= 0x12C436C73CE5i64 )
{
v5 = 894000 * v11;
v6 = 63i64;
NewTimer.CounterBitWidth = 63;
do
{
if( (1i64 << v6) - 1 < v5 )
break;
v12 = (_DWORD)v6 == 1;
v6 = (unsigned int)(v6 - 1);
}
while( !v12 );
NewTimer.CounterBitWidth = v6;
if( !(_DWORD)v6 )
goto LABEL_20;
}
else
{
NewTimer.CounterBitWidth = 64;
}
NewTimer.FunctionTable.AcknowledgeInterrupt = 0i64;
NewTimer.InternalData = 0i64;
NewTimer.Identifier = 0;
NewTimer.FunctionTable.Initialize = (PLONG)HalpWdatInitialize;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpWdatArmTimer;
NewTimer.FunctionTable.Stop = HalpWdatStop;
NewTimer.InternalDataSize = v16;
NewTimer.CounterFrequency = 894000i64;
NewTimer.KnownType = TimerWDAT;
HalpTimerRegister(&NewTimer, 0i64);
}
}
}
LABEL_20:
if( v7 )
{
LOBYTE(v6) = 11;
HalpWdatExecuteActionBeforeInitialize(v6, v5, 0i64, (_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable, Wdrt);
}
return 0;
}Referenced by:
HalpTimerRegisterBuiltinPluginsCommon