summaryrefslogtreecommitdiff
path: root/crates/windows-kernel-sys/src/wrapper_intrin.c
blob: 5c17cf94520359c5eec311f574fc286d5950fea0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#define _AMD64_

#include "wdm.h"
#include "intrin.h"

unsigned __int64 read_cr3(void) {
	return __readcr3();
}

void write_cr3(unsigned __int64 Value) {
	__writecr3(Value);
}

unsigned __int64 read_msr(
	unsigned long Register
) {
	return __readmsr(Register);
}

NTSTATUS read_msr_safe(
	unsigned long Register,
	unsigned __int64 *Value
) {
	if (!Value) {
		return STATUS_INVALID_PARAMETER;
	}

	__try {
		*Value = __readmsr(Register);
	} __except(EXCEPTION_EXECUTE_HANDLER) {
		return GetExceptionCode();
	}

	return STATUS_SUCCESS;
}

void write_msr(
	unsigned long Register,
	unsigned __int64 Value
) {
	__writemsr(Register, Value);
}

NTSTATUS write_msr_safe(
	unsigned long Register,
	unsigned __int64 Value
) {
	__try {
		__writemsr(Register, Value);
	} __except(EXCEPTION_EXECUTE_HANDLER) {
		return GetExceptionCode();
	}

	return STATUS_SUCCESS;
}

void invlpg(
	void *Address
) {
	__invlpg(Address);
}