HalpTimerSavePerformanceCounter
UINT64 __stdcall HalpTimerSavePerformanceCounter(){
void *v0;
void *v1;
unsigned __int64 v2;
ULONG_PTR v3;
__int64 v4;
__int64 v5;
__int64 v6;
__int64 v7;
void *v8;
__int64 v9;
char *v10;
UINT64 result;
ULONG_PTR v12;
__int64 v13;
__int64 v14;
unsigned __int64 v15;
signed __int64 v16;
unsigned __int64 v17;
__int64 v18;
__int64 v19;
__int64 v20;
__int64 v21;
__int64 v22;
__int64 v23;
signed __int64 v24;
__int64 v25;
__int64 v26;
signed __int64 v27;
int v28;
unsigned __int64 v29;
unsigned __int64 v30;
__int64 v31;
signed __int32 v32[10];
v3 = HalpPerformanceCounter;
v4 = -1i64;
v5 = 1i64;
if( *(_DWORD *)(HalpPerformanceCounter + 220) == 64 )
{
HalpTimerGetInternalData((KDPC *)HalpPerformanceCounter, v0, v1, (PVOID)v2);
v7 = (*(__int64(__fastcall **)(__int64))(v3 + 112))(v6);
v9 = *(_QWORD *)(v3 + 208);
v10 = (char *)v7;
}
else
{
do
{
v9 = *(_QWORD *)(v3 + 208);
do
{
v13 = *(_QWORD *)(v3 + 200);
HalpTimerGetInternalData((KDPC *)v3, v0, v1, (PVOID)v2);
v15 = (*(__int64(__fastcall **)(__int64))(v3 + 112))(v14);
_InterlockedOr(v32, 0);
v16 = *(_QWORD *)(v3 + 200);
}
while( v13 != v16 );
}
while( v9 != *(_QWORD *)(v3 + 208) );
v8 = (void *)*(unsigned int *)(v3 + 220);
v17 = v13 ^ v15;
if( _bittest64((const __int64 *)&v17, (unsigned __int8)((_BYTE)v8 - 1)) )
{
if( (_DWORD)v8 == 64 )
v18 = -1i64;
else
v18 = (1i64 << (char)v8) - 1;
v19 = 1i64;
if( (_DWORD)v8 != 64 )
v19 = 1i64 << (char)v8;
v2 = v13 & v18;
v10 = (char *)(v15 | v13 ^ v2);
if( v15 < v2 )
v10 += v19;
_InterlockedCompareExchange64((volatile signed __int64 *)(v3 + 200), (signed __int64)v10, v16);
}
else
{
if( (_DWORD)v8 == 64 )
v20 = -1i64;
else
v20 = (1i64 << (char)v8) - 1;
v10 = (char *)(v15 | v13 & ~v20);
}
}
result = (UINT64)&v10[v9];
*(_QWORD *)(v3 + 16) = &v10[v9];
v12 = HalpAlwaysOnCounter;
if( HalpAlwaysOnCounter )
{
if( *(_DWORD *)(HalpAlwaysOnCounter + 220) == 64 )
{
HalpTimerGetInternalData((KDPC *)HalpAlwaysOnCounter, v10, v8, (PVOID)v2);
v22 = (*(__int64(__fastcall **)(__int64))(v12 + 112))(v21);
v23 = *(_QWORD *)(v12 + 208);
v24 = v22;
}
else
{
do
{
v23 = *(_QWORD *)(v12 + 208);
do
{
v25 = *(_QWORD *)(v12 + 200);
HalpTimerGetInternalData((KDPC *)v12, v10, v8, (PVOID)v2);
v2 = (*(__int64(__fastcall **)(__int64))(v12 + 112))(v26);
_InterlockedOr(v32, 0);
v27 = *(_QWORD *)(v12 + 200);
}
while( v25 != v27 );
}
while( v23 != *(_QWORD *)(v12 + 208) );
v28 = *(_DWORD *)(v12 + 220);
v29 = v25 ^ v2;
if( _bittest64((const __int64 *)&v29, (unsigned __int8)(v28 - 1)) )
{
if( v28 != 64 )
v4 = (1i64 << v28) - 1;
if( v28 != 64 )
v5 = 1i64 << v28;
v30 = v25 & v4;
v24 = v2 | v25 ^ v30;
if( v2 < v30 )
v24 += v5;
_InterlockedCompareExchange64((volatile signed __int64 *)(v12 + 200), v24, v27);
}
else
{
if( v28 == 64 )
v31 = -1i64;
else
v31 = (1i64 << v28) - 1;
v24 = v2 | v25 & ~v31;
}
}
result = v23 + v24;
*(_QWORD *)(v12 + 16) = v23 + v24;
}
return result;
}Referenced by:
HalpAcpiPreSleep