mirror of
https://github.com/BeneficialCode/WinArk.git
synced 2026-10-18 13:41:03 +08:00
42 lines
1.2 KiB
C++
42 lines
1.2 KiB
C++
#include "pch.h"
|
|
#include "NewKernelHandler.h"
|
|
|
|
void NewKernelHandler::InitMaxPhyMask(){
|
|
INT cpuInfo[4];// eax,ebx,ecx,edx
|
|
CpuIdEx(cpuInfo, 0x80000008, 0);
|
|
if (cpuInfo[0] != 0) {
|
|
_MaxPhyAddr = cpuInfo[0] & 0xFF;
|
|
_MaxPhyAddrMask = 0xffffffffffffffff;
|
|
_MaxPhyAddrMask = _MaxPhyAddrMask >> _MaxPhyAddr;
|
|
_MaxPhyAddrMask = ~(_MaxPhyAddrMask << _MaxPhyAddr);
|
|
_MaxPhyAddrMaskPb = _MaxPhyAddrMask & 0xfffffffffffff000;
|
|
|
|
_MaxLinearAddr = (cpuInfo[0] >> 8) & 0xFF;
|
|
_MaxLinearAddrMask = 0xffffffffffffffff;
|
|
_MaxLinearAddrMask = _MaxLinearAddrMask >> _MaxLinearAddr;
|
|
_MaxLinearAddrMask = _MaxLinearAddrMask << _MaxLinearAddr;
|
|
|
|
_MaxLinearAddrTest = 1ull << (_MaxLinearAddr - 1);
|
|
|
|
#ifdef _WIN64
|
|
_MaxPhyAddrMaskPbBig = _MaxPhyAddrMask & 0xffffffffffe00000;
|
|
#else
|
|
_MaxPhyAddrMaskPbBig = _MaxPhyAddrMask & 0xffffffffffc00000;
|
|
#endif // _WIN64
|
|
}
|
|
else {
|
|
_MaxPhyAddrMask = 0xffffffffffffffff;
|
|
_MaxLinearAddrMask = 0xffffffffffffffff;
|
|
}
|
|
}
|
|
|
|
bool NewKernelHandler::VerifyAddress(ULONG_PTR addr){
|
|
bool result = false;
|
|
if ((addr & _MaxLinearAddrTest) > 0) {
|
|
result = (addr & _MaxLinearAddrMask) == _MaxLinearAddrMask;
|
|
}
|
|
else {
|
|
result = (addr & _MaxLinearAddrMask) == 0;
|
|
}
|
|
return result;
|
|
} |