Подскажите, плиз, кто знает... Мне в проге из под Винды 98,2000,XP необходимо ловить момент обращения к порту таймера. Можно ли это сделать вообще (типа что-то хука например поставить), и на каком уровне можна сделать (обычное приложение или драйвер например). Может у кого уже есть ссылки по теме?
Я думал об этом, но не уверен, что это корректный с точки зрения Винды метод. Мой вопрос касается ОФИЦИАЛЬНЫХ способов, при которых САМА Винда информирует приложение об обращении к заданому порту.
Что значит ОФИЦИАЛЬНЫХ? драйвре весит в R-0 и работает с портами устройства через in/out, винда это не контролирует. Тем более отладочные регистры это универсальый способ.
"Официальный способ" - это по-видимуму, то, что делает portmon - фильтр IRP. Но это работает для прог общающихся с COM/LPT портами из юзерленда, а для таймера врядли подойдёт
Да есть вполне официальный способ, по крайней мере в 98. Способ заключается ~в том, что в I/O permission map для задач дос/win32 запрещен доступ к портам (не всем, но для hdd например). Вот сервис в 98: Enable_Global_Trapping include vmm.inc mov edx, Port ; I/O port number VMMCall Enable_Global_Trapping Enables I/O port trapping for the specified port (I/O requests are trapped instead of working directly with hardware). Enabled by default at system startup. This applies to every virtual machine. Uses Flags. No return value. Port Number of the I/O port for which global trapping is to be enabled. This service must not be used unless an I/O callback procedure has been installed for the given port using the Install_IO_Handler or Install_Mult_IO_Handlers service during initialization. In particular, you should not attempt to alter the port trapping state of a port for which you did not personally install an I/O handler. Altering the port trapping state of a port owned by another virtual device driver may cause that other driver to get confused. The system applies to current global trapping state to each new virtual machine as it is created. When the system first starts, global trapping is enabled by default. See Also Disable_Global_Trapping, Install_IO_Handler, Install_Mult_IO_Handlers Разумеется, для этого нужно написать vxd/sys динамически загружаемый из приложения. А вот перехват кода из нулевого кольца уже действительно не может быть сделан "официальным" способом - см. DRx регистры и т.п. Про регистры DRX недавно была тема.