Регистры сетевой платы

Тема в разделе "WASM.NETWORKS", создана пользователем Mur, 6 июл 2006.

  1. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Добрый день,
    необходимо достучаться до содержимого регистров сетевой платы, в частности на чипе RTL8139 хотя бы, скачал DataSheet, посмотрел какие бывают регистры по какому адресу, а как до них добраться?
     
  2. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    PCI configuration space, сперва надо найти девайс, потом уже в space девайса соответственно юзать регистры. Только имхо в чистом виде работать через регистры гимор полнейший. Гораздо проще драйвер интерфейса хучить. Т.к. если ты напрямую скажем, пакет передашь, ты рано или поздно заведешь драйвер в бесконечный цикл и уронишь систему.
     
  3. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Много перелопатил, никак не могу найти как в win32 хотя бы с PCI работать, не то чтобы достучаться до регистров сетевой карты :dntknw: может у кого ссылка или пример какой есть?
     
  4. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Работа с PCI делается следующим образом:
    1. В порт 0xCF8 пишется адрес устройства (шина, устройство, функция)
    подробнее:
    31-31 бит - всегда 1
    30-24 бит - reserved
    23-16 бит - шина (0 to 255)
    15-11 бит - устройство (0 to 31)
    10-8 бит - функция (0 to 7)
    7-2 бит - номер регистра (0 to 64) - номер регистра для считывания сдвинутый вправо 2
    1-0 бит - всегда 0
    2. В/из порта 0xCFC записывается/считывается значение
    Вообще, почитай статью http://wasm.ru/article.php?article=hardzen
     
  5. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    работаю с PCI, получаю для сетевухи вот такое:
    Address 0 is an I/O Port : 0000C000h
    1) Это означает что ее регистры начинаются с этого адреса?
    2) Как мне в винде читать данные с этого адреса?
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Mur
    Да ее регистры начинаются с этого адреса. Ты же DataSheet скачал там это описано, мне предо он не очень нравится.
    И еще скачай Programming guide.
    А зачем это тебе? Во-первых, доступ к портам в 3 кольце закрыт. Либо использовать драйвер для доступа к порам ввода вывода в виндоусе, но это не коректно очем писал ECK. Либо писать драйвер.
     
  7. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Да надо контролировать значения регистров сетевухи. Значит придется писать драйвер, чтобы получить доступ к памяти.
    Если кто может дать несколько советов новичку в этом деле, спасибо за помощь.
     
  8. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Не парься с драйвером - если ты просто хочешь понять принципы работы с устройствами через PCI - заюзай функцию ZwSystemDebugControl - с ее помощью можно из юзерланда писать-читать в порты (неоднократно мной юзается именно для обращений в порты). Или функцией ZwSetInformationProcess (UserModeIOPL).
    Правда тебе предварительно надо будет выставить у своей учетной записи привилегию SE_TCB_NAME (иначе не даст поставить IOPL=0 для твоей программы).
    Для ее установки можешь либо программно это сделать, или же через secpol.msc (Act as part of OS).
    После установки UserModeIOPL надо перегрузить контекст, чтобы данное изменение возымело действие.
    Например, в сишном синтаксисе:
    try
    {
    int 1;
    }
    except
    {
    }
    ПОсле такой перегрузки контекста все работает нормально и ты можешь писать в порты прямо из юзерланда.
     
  9. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    ProcessUserModeIOPL
    UserModeIOPL; // Information Class 16
    This information class can only be set and no information is required.Therefore,
    ProcessInformation may be null and ProcessInformationLength should be zero.
    SeTcbPrivilege is required to set this information class.
    This information class is only meaningful for Intel processors; it modifies the I/O
    Privilege Level for the process so that the process may directly access the I/O ports
    and execute other instructions that are sensitive to IOPL.
     
  10. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Поставил группу админы на параметр "Работа в режиме операционной системы", вроде как этот?
    Вот такой код мейна нашел/модифицировал. Но в Status возвращает не ноль. :dntknw: Считать-то 100h байт с адреса С000h :)
    Спасибо за подсказки и что не оставляете, код могу выслать.
    ЗЫ Ось WinXP, SP2
    Код (Text):
    1. HINSTANCE NtDll;
    2.    NtDll=LoadLibrary("ntdll.dll");
    3.    if ( !NtDll)
    4.       return -1;
    5.  
    6.    NTDLL_ZwSetInformationProcess   ZwSetInformationProcess =
    7.       (NTDLL_ZwSetInformationProcess)GetProcAddress(NtDll, "ZwSetInformationProcess");
    8.  
    9.    if ( !ZwSetInformationProcess )
    10.       return -1;
    11.    
    12.    NTSTATUS Status = ZwSetInformationProcess( GetCurrentProcess(), ProcessUserModeIOPL,
    13.       NULL, 0 );    
    14. if (Status!=0)
    15.    return -1;
     
  11. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Тебе надо после "действовать как операционная система" перезагрузиться (т.к. lsass при логоффе не перезагружается).
     
  12. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Да перезагружал/выключал :)
    Все заработало, когда добавил кусок - добавление привелегий :)
    Но...теперь надо читать. И вот тут я опять в тупике :dntknw: на асме я писал только что-то маленькое и для доса, в общем. Допустим такая у меня ситуация конкретная
    Диапазон ввода вывода С000h-C0FFh это оно? Вроде бы 100h байт
    Оттуда читать с помощью in? in ax, C000h в таком стиле?
    Или из памяти по этим адресам?

    Еще почему то в асме под студию 6, он ругается когда я адрес беру с помощью @. Раньше вроде так брали всегда.
    mov ax,@адрес

    Или есть диапазон памяти
    D9021000-D90210FF? те же 256 байт..вот, но вроде решение близко.
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Mur
    Диапазон ввода вывода С000h-C0FFh это 100h байт.
    Читать надо из портов I/O
    mov dx,0C000h
    in al,dx ; al- один байт
    Или же ты можешь читать теже самые регистры из памяти
    D9021000-D90210FF - адресса физические.
     
  14. Mur

    Mur New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2006
    Сообщения:
    9
    Большое всем спасибо. Выложу полный пример кода скоро, может кому пригодится. Все вроде как пашет :)