Добрый день, необходимо достучаться до содержимого регистров сетевой платы, в частности на чипе RTL8139 хотя бы, скачал DataSheet, посмотрел какие бывают регистры по какому адресу, а как до них добраться?
PCI configuration space, сперва надо найти девайс, потом уже в space девайса соответственно юзать регистры. Только имхо в чистом виде работать через регистры гимор полнейший. Гораздо проще драйвер интерфейса хучить. Т.к. если ты напрямую скажем, пакет передашь, ты рано или поздно заведешь драйвер в бесконечный цикл и уронишь систему.
Много перелопатил, никак не могу найти как в win32 хотя бы с PCI работать, не то чтобы достучаться до регистров сетевой карты может у кого ссылка или пример какой есть?
Работа с 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
работаю с PCI, получаю для сетевухи вот такое: Address 0 is an I/O Port : 0000C000h 1) Это означает что ее регистры начинаются с этого адреса? 2) Как мне в винде читать данные с этого адреса?
Mur Да ее регистры начинаются с этого адреса. Ты же DataSheet скачал там это описано, мне предо он не очень нравится. И еще скачай Programming guide. А зачем это тебе? Во-первых, доступ к портам в 3 кольце закрыт. Либо использовать драйвер для доступа к порам ввода вывода в виндоусе, но это не коректно очем писал ECK. Либо писать драйвер.
Да надо контролировать значения регистров сетевухи. Значит придется писать драйвер, чтобы получить доступ к памяти. Если кто может дать несколько советов новичку в этом деле, спасибо за помощь.
Не парься с драйвером - если ты просто хочешь понять принципы работы с устройствами через PCI - заюзай функцию ZwSystemDebugControl - с ее помощью можно из юзерланда писать-читать в порты (неоднократно мной юзается именно для обращений в порты). Или функцией ZwSetInformationProcess (UserModeIOPL). Правда тебе предварительно надо будет выставить у своей учетной записи привилегию SE_TCB_NAME (иначе не даст поставить IOPL=0 для твоей программы). Для ее установки можешь либо программно это сделать, или же через secpol.msc (Act as part of OS). После установки UserModeIOPL надо перегрузить контекст, чтобы данное изменение возымело действие. Например, в сишном синтаксисе: try { int 1; } except { } ПОсле такой перегрузки контекста все работает нормально и ты можешь писать в порты прямо из юзерланда.
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.
Поставил группу админы на параметр "Работа в режиме операционной системы", вроде как этот? Вот такой код мейна нашел/модифицировал. Но в Status возвращает не ноль. Считать-то 100h байт с адреса С000h Спасибо за подсказки и что не оставляете, код могу выслать. ЗЫ Ось WinXP, SP2 Код (Text): HINSTANCE NtDll; NtDll=LoadLibrary("ntdll.dll"); if ( !NtDll) return -1; NTDLL_ZwSetInformationProcess ZwSetInformationProcess = (NTDLL_ZwSetInformationProcess)GetProcAddress(NtDll, "ZwSetInformationProcess"); if ( !ZwSetInformationProcess ) return -1; NTSTATUS Status = ZwSetInformationProcess( GetCurrentProcess(), ProcessUserModeIOPL, NULL, 0 ); if (Status!=0) return -1;
Тебе надо после "действовать как операционная система" перезагрузиться (т.к. lsass при логоффе не перезагружается).
Да перезагружал/выключал Все заработало, когда добавил кусок - добавление привелегий Но...теперь надо читать. И вот тут я опять в тупике на асме я писал только что-то маленькое и для доса, в общем. Допустим такая у меня ситуация конкретная Диапазон ввода вывода С000h-C0FFh это оно? Вроде бы 100h байт Оттуда читать с помощью in? in ax, C000h в таком стиле? Или из памяти по этим адресам? Еще почему то в асме под студию 6, он ругается когда я адрес беру с помощью @. Раньше вроде так брали всегда. mov ax,@адрес Или есть диапазон памяти D9021000-D90210FF? те же 256 байт..вот, но вроде решение близко.
Mur Диапазон ввода вывода С000h-C0FFh это 100h байт. Читать надо из портов I/O mov dx,0C000h in al,dx ; al- один байт Или же ты можешь читать теже самые регистры из памяти D9021000-D90210FF - адресса физические.