При деиницилизации драйвера крайне желательно
При деиницилизации драйвера крайне желательно "отобрать" доступ к команде RDPMC с прикладного уровня и остановить все ранее запущенные счетчики производительности, сбросив флажок Enable Counter в MSR-регистрах PerfEvtSel0/PerfEvtSel1 (код, приведенный ниже останавливает только PerfEvtSel0):
DriverUnload: ; // процедура деиницилизации драйвера
…
; // сбрасываем бит pce регистра cr4 для запрета чтения
; // счетчика производительности с пользовательского уровня
MOV EAX, CR4
MOV ECX, 100h
NOT ECX ; // запрещаем доступ к RDPMC с прикладного уровня
AND EAX, ECX
MOV CR4, EAX
; // останавливаем счетчик производительности
XOR EDX, EDX
XOR EAX, EAX
MOV ECX, 186h
WRMSR
…
Листинг 5 фрагмент процедуры деиницилизации драйвера
Прикладная программа первым делом должна загрузить драйвер (пусть для определенности он будет называться 996.SYS), открыв его с помощью функции CreateFile. При этом управление получит процедура инициализации, открывающая доступ к машинной команде RDPMC, но сами счетчики производительности еще не заданы, так что читать, собственно говоря, нечего и незачем.
Нет никакой необходимости писать загрузку драйвера на ассемблере и лучше всего воспользоваться для этой цели языком Си:
// определения необходимых констант
#define PrefCtrl0 0x0000
#define DCU_MISS_OUTSTANDING 0x0048
// дескриптор драйвера 996
static HANDLE _996_handle = INVALID_HANDLE_VALUE;
int _996_init()
{
if (_996_handle == INVALID_HANDLE_VALUE)
{
_996_handle = CreateFile("\\\\.\\996",GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (_996_handle == INVALID_HANDLE_VALUE) return 0;
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий