/
/
检测Bios是否开启VT
BOOLEAN VmxIsCheckSupportVTBIOS()
{
ULONG64 value
=
__readmsr(IA32_FEATURE_CONTROL);
return
(value &
0x5
)
=
=
0x5
;
}
/
/
检测CPU是否支持VT
BOOLEAN VmxIsCheckSupportVTCPUID()
{
int
cpuidinfo[
4
];
__cpuidex(cpuidinfo,
1
,
0
);
/
/
CPUID 是否支持VT ecx.vmx第
6
位 如果为
1
,支持VT,否则不支持
return
(cpuidinfo[
2
] >>
5
) &
1
;
}
/
/
检测CR4VT是否开启,如果为
1
代表已经开启过了,否则没有开启
BOOLEAN VmxIsCheckSupportVTCr4()
{
ULONG64 mcr4
=
__readcr4();
/
/
检测CR4 VT是否开启,cr4.vmxe如果第
14
位为
1
,那么VT已经被开启,否则可以开启
return
((mcr4 >>
13
) &
1
)
=
=
0
;
}
void checkVT()
{
if
(VmxIsCheckSupportVTCPUID())
{
DbgPrintEx(
77
,
0
,
"[db]:VmxIsCheckSupportVTCPUID number = %d\r\n"
, KeGetCurrentProcessorNumber());
}
if
(VmxIsCheckSupportVTBIOS())
{
DbgPrintEx(
77
,
0
,
"[db]:VmxIsCheckSupportVTBIOS number = %d\r\n"
, KeGetCurrentProcessorNumber());
}
if
(VmxIsCheckSupportVTCr4())
{
DbgPrintEx(
77
,
0
,
"[db]:VmxIsCheckSupportVTCr4 number = %d\r\n"
, KeGetCurrentProcessorNumber());
}
}