Перехват обращения к порту

Тема в разделе "WASM.WIN32", создана пользователем inew, 14 июн 2005.

  1. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    Подскажите, плиз, кто знает...

    Мне в проге из под Винды 98,2000,XP необходимо ловить момент обращения к порту таймера. Можно ли это сделать вообще (типа что-то хука например поставить), и на каком уровне можна сделать (обычное приложение или драйвер например).

    Может у кого уже есть ссылки по теме?
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Из r-0, через отладочные регистры.В доках интела все описанно.
     
  3. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    Я думал об этом, но не уверен, что это корректный с точки зрения Винды метод. Мой вопрос касается ОФИЦИАЛЬНЫХ способов, при которых САМА Винда информирует приложение об обращении к заданому порту.
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Что значит ОФИЦИАЛЬНЫХ? драйвре весит в R-0 и работает с портами устройства через in/out, винда это не контролирует. Тем более отладочные регистры это универсальый способ.
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    "Официальный способ" - это по-видимуму, то, что делает portmon - фильтр IRP. Но это работает для прог общающихся с COM/LPT портами из юзерленда, а для таймера врядли подойдёт :)
     
  6. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Да есть вполне официальный способ, по крайней мере в 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 недавно была тема.
     
  7. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    Всем спасибо... Буду пробовать