возник такой вопрос возможно ли считать MAC адрес прямо с железки минуя драйвер? если я меняю MAC в свойствах драйвера, то считывание непостедственно с самой карты даст оригинальный MAC ? PS нужно под Win32, желательно asm вставку в Си
То есть ты думаешь , что у сетевухи есть 2 МАС адреса ? - Один настоящий, другой левый ? Нет . Такого небывает. Драйвер считывает \ записывает МАС адрес на сетевухе. Просто минуя драйвер тебе надо залезть в нулевое кольцо, остановить сетевуху , обратиться к ее портам. Не гемор ли ? Не проще попросить драйвер ?
В обход winsock на пользовательском уровне ничего нельзя сделать, AFAIK. Я как-то хотел отключить поле чексум в пакетах UDP. Пришлось писать драйвер.
Посмотри даташиты вендоров (такой распространенный как Realtek 839, например, или Intel) - судя по документации, там есть способы для таких задач. Потом, кратковременно остановить девайс можно опять же путем обращений в те же порты девайса и конфиг пространство (бит запрета прерываний от девайса). Конечно не факт, что все вендоры имеют такие возможности, но тебе видимо все и не нужны? Это в некотором роде вендорозависимый метод, но если ты опознаешь девайс и вендора перед изменением MAC и используешь соответствующие bitmap данного вендора - все возможно. А если тебе это надо сделать из юзера - используй ZwSystemDebugControl (>=ХР)
Если хочешь геморроя - работай прямо с железом. Хочешь универсальности - работай через NDIS. В любом случае придется использовать драйвер.
Если послать запрос OID_802_3_PERMANENT_ADDRESS с помощью NdisRequest, то вернется MAC прошитый в сетевуху, если OID_802_3_CURRENT_ADDRESS - то текущий используемый MAC. Только для начала тебе надо зарегистировать свой протокол и открыть нужные адаптеры. Примеры смотри в сорцах winpcap.
Ой, а если кто-то это перехватит? Или если прошили и перед запросом и после тоже? /me так и думает, как бы гемороя кому-нить добавить
скачал http://www.winpcap.org/install/bin/WpdPack_3_1.zip нашел там как раз то что надо WpdPack\Examples-remote\PacketDriver\GetMacAddress\getmacaddress.c но скомпилировать не получается... packet32.h(208) : error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage' packet32.h(209) : error C2079: 'SubnetMask' uses undefined struct 'sockaddr_storage' packet32.h(210) : error C2079: 'Broadcast' uses undefined struct 'sockaddr_storage' Error executing cl.exe.