Files
WinArk/WinSysCore/NewKernelHandler.cpp
2023-06-21 15:24:39 +08:00

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;
}