Винда, это конечно крутая весчь, однако для проца это не что иное как обычная программа. Слава Богу, что процы разрабатывает не мелкософт, однако мелкософт обязан использовать возможности проца (подстраиваться под его архитектуру).
Современные процы обладают сложной архитектурой (можете почитать доки на сайте интеля, например. на пентиум 3 дока в свое время была из 4 томов, страниц по 1000). Архитектура процессоров х86 имеет 4 класса "прав доступа" кода. Эти классы пронумерованы от 0 до 3 и называются "кольцами" (говорится "код, запущенный в 0 кольце"). Что нам следует знать, что код, запущенный в нижнем кольце (во 2, например) имеет приоритет над кодом, запущенным в кольце выше (над 3). Что еще следует знать, что некоторые операции возможны только в своем кольце (например работа со страницами памяти возможна только из 0 кольца). Для истории - раньше была единая програмная память в процессорах (не было этих самых колец) и это все называлось real mode. А в последующих версиях проца (с кольцами) это стало называться protected mode.
Мелкософтовцы, они ж не лентяи (не сказать грубее), они подумали и сказали: "а нафик нам парица с 1 и со 2 кольцом, тока геммор лишний". Вобщем в винде задействовали тока 0 (kernel mode) кольцо и 3 (user mode).
Причем, в 0 кольце запускается все что нужно для работы системы (в винде с 2000, кстати, куча разных менеджеров: менеджер памяти, менеджер девайсов, секьюрити менеджер и т.д. это отдельные блоки проги, каждый отвечает за свою часть). В том числе и драйвера для работы с периферией. Типа к ресурсам компа доступ есть тока у проверенных мелкософтом приложений (помните сообщения, типа а этот драйвер не был сертифицирован мелкософтом, не помню точно).
А все пользовательские приложения (ваши проги с красивыми окнами, да и просто пользовательские длл) запускаются в 3 кольце. И проги из 3 кольца могут общаться с периферией в основном тока через драйвера 0 кольца. И это все из-за кернела (ядра ос), который не дает нам напрямую запросить порт.
Однако есть возможность обратится к какому-то конкретному порту из проги 3 кольца. Дело в том, что у каждого запущенного процесса (не путать с процем. под виндой приложения запускают один как минимум или несколько процессов - типа многозадачность) есть, так называемая, карта доступа (Permission Map). Эта карта доступа каждого конкретного процесса к портам ввода-вывода.
Когда должна выполниться команда ввода-вывода на порт, процессор проверяет из какого кольца выполняется команда (если из 0, то все ОК), если это 3 кольцо - то он проверяет карту доступа процесса.
Карта доступа - как следует из названия, это просто битовое поле, где каждый бит соответствует 1 порту. Если бит равен 1, то доступ к порту разрешен, если 0 то закрыт.
Таким макаром, у нас есть 2 возможности (если кто знает больше, буду признателен за расшаривание инфы) для доступа к портам ввода-вывода под виндой.
1. Писать системный драйвер. Таким образом кернел запустит его в 0 кольце.
2. Изменить карту доступа к портам.
Написание драйвера - самый оптимальный способ (минусы - так это то, что надо его писать) так как система сама перейдет из 3 кольца в 0, да и все что еще надо сделает (в 0 кольце приоритет-то выше и всякие ворды нам будут по барабану).
Изменение карты доступа намного проще. Минусы - из 3 кольца организовывать все что надо для работы с переферией (приоритет-то нашего приложения низкий).
Как писать драйвер я сейчас писать не буду, это отдельная история. Если будете уметь их писать (вопреки существующему мнению, имхо, это не так уж и сложно), сможете бить себя в грудь пяткой и причислять себя к элите программеров под винду (системный программист как никак). Если хотите, могу рассказать в 2 словах про Windows Driver Model и про типы драйверов. Но мне кажется, это не тематика данного сайта.
Изменение карты доступа процесса осуществляется парой команд. Единственная проблема - эти команды недокументированы
. Если я с вами поделюсь, вы ж никому не расскажете? Если честно, я сам их стырил с одного сайта.
получение указателя на процесс:
PsLookupProcessByProcessId(IN ULONG ulProcId,OUT struct _EPROCESS ** pEProcess);
установить карту доступа:
void Ke386SetIoAccessMap(int, IOPM *);
запросить карту доступа:
void Ke386QueryIoAccessMap(int, IOPM *);
устанавливает права доступа процесса:
void Ke386IoSetAccessProcess(PEPROCESS, int);
да, есть длл, называется PortTalk, мона найти на
http://www.beyondlogic.org/porttalk/porttalk.htm
эта длл пользует принцип изменения карты доступа.
P.S. модераторам не знаю, вписывается ли все это в тематику сайта. Скажите, если что не так.
xelos, так-то в норме всё... разве что коды программ, если их много или он один, но большой, запихивай в файлик. себе траф сэкономишь и другим. А вообще - можешь стать автором статьи на РК по обмену данными с портами все будут тлько рады Ржавый