фрагмент процедуру инициализации драйвера
Следующий код обеспечивает взаимодействие драйвера с прикладной программой через API-функцию DeviceIOControl, передающий в IOCTL-коде номер события, за которым необходимо вести мониторинг. По соображениям наглядности, здесь используется всего лишь один счетчик производительности, управляемый MSR-регистром PerfEvtSel0.
IRP_MJ_DEVICE_CONTROL: ; // процедура обработки IOCTL-запросов
; // настраиваем регистр perfevtsel0 для мониторинга нужных событий
XOR EDX, EDX
MOV EAX, pisl->
Parameters.DeviceIoControl.IoControlCode ; //номер события
TEST EAX, EAX ; // если код события равен нулю
JZ wrt ; // то вырубаем счетчик
OR EAX, 10000h ; // делаем счетчик доступным
; // с прикладного уровня
OR EAX, 400000h ; // пускаем счетчик
wrt:
MOV ECX,0x186 ; // выбираем MSR-регистр PERFEVTSEL0
WRMSR