Необходимо создать шлюз прерывания для быстрого управления некоторым кодом в ядре, который будет вызываться из юзермода. Нужно сделоть статически(не искать свободный вектор), тоесть всюду номер прерывания должен быть константой. Свободных векторов много, посоветуйте какой использовать. Я решил использовать одино из свободных которое является заглушкой(для которых вектор равен KiTrap0F()). Это 0xF и [0x14%0x1E]. Но это у меня свободны, хотелось бы узнать у когонибудь они используются(разумеется виндоз).
Можно оффтоп - а почему решил делать именно через прерывание? Просто у меня тоже была такая мысль для драйвера который щас пишу но потом подумал что есть стандартные неплохие способы
SashaTalakin Нужно очень быстро. Варианта только два - вызов через шлюз вызова и через шлюз прерывания, решил делоть через прерывание, это удобнее. Была есчо идея заюзоть исключения(например mov dword ptr ds:[XXXX],XXXX), но решил что это не надёжно.
Partner Почему ? Для каждого процессора GDT своя, поэтому аналогично как и для создания шлюзов в IDT нужно выполнить код на всех процессорах, ибо я не уверен что в ядре есть таблица содержащая адреса всех GDT.
Partner Ты прав, походу буду использовать калгейт. В ядре в секции данных(RVA_5.1.2600.2180 = 0x0048C260 - 0x400000) есть таблица в которой содержаться адреса всех GDT. Код (Text): // KiAbiosGdt[] defines the Starting address of GDT for each processor. // ULONG KiAbiosGdt[MAXIMUM_PROCESSORS] Проверил всё верно, у меня два ядра, там два адреса теже что и в gdtr обоих процессоров. Тока не экспортируется, но найти проще(ссылка в KeI386AllocateGdtSelectors) чем KeIpiGenericCall(), но необходимо синхронно с остальными процессорами модифицировать эти таблицы, тоесть на время их модификации нужно остальные процессоры остановить что нужно сделоть посредством IPI, а нужный функционал ядром не экспортируется(я делол через поиск KeIpiGenericCall() как и для установки шлюзов во всех IDT, Грит реализовал вручную программированием APIC). Не знаю даже как быть..
Хотя нет, атомарно не нужно. Просто буду проверять атомарно(lock) флажок в хэндлере и всё. Спасибо, реализую через калгейт.
1. Не нужно искать свободный вектор 2. Аппаратная поддержка перегрузки параметров (word count в дескрипторе) 3. Не проверял, но говорят call gate быстрее.
Partner 1. Искать нужно, хотя есть переменная в которой определён последний занятый селектор, но думою если взять с конца таблицы то это не важно. 2. Не актуально, параметры передаются через регистры. 3. Врятле.
Medstrax Потомучто Sysenter чтоб заюзоть это нужно перехватывоть чтолибо, дескриптор в сст не подходит делоть ибо медленно. Щас ктото скажет мср перезагрузить.. нее, я уже почти кодес с GDT закончил.