всем привет, пишу первый NDIS драйвер. но система не вызывает функцию protocolbindadapter. пример из ddk(ndisprot) работает, а мой драйвер(я назвал его тоже NDISPROT, чтобы не сомневаться в правильной инсталляции, и при тестировании просто заменяю пример из ддк своим в системной дирректории system32\drivers) всплывает только на driverentry & pnpeventproc. две недели уже ломаю голову. в ддк написано, что система вызывает все нужные (как я понял без дополнительных действий)функции при успешной регистрации with ndisregisterprotocol .как я понял - как обічніе диспетчерские функции обічного драйвера. помогите пожалуйста найти ошибку... думаю, что ошибка в driverentry or pnpeventproc тк другие ф-ции не вызываются до бинда
Поиск по форуму, было уже (или в DDK ищи). Имя протокола нужно в уже не помню какой ключ реестра добавить.
Вы установили драйвер через сетевое окружение? Просто вызвать NdisRegsiterProtocol - мало, такой протокол не будет привязан ни к одному адаптеру. При установке через сетевое окружение работает специальный коинсталлер, который правильно настраивает привязку протокола к минипортам. Можно тоже самое сделать программно, через Network Configuration Interface
http://www.wasm.ru/forum/viewtopic.php?id=12161 Когда то и сам напарывался ) Кучу времени убил... Сочувствую А ддк кстати не верь - там много ошибок.
переименовал протокол в ндиспрот - щас работает. но теперь не перевести адаптер в promiscuous mode. requestcomplete вызывается со статусом завершения NDIS_STATUS_NOT_SUPPORTED . причем и wi-fi и ethernet адаптер: Код (Text): **************************************************************************************** ; definitions ;------------------------------------------------------------------------ ; prototypes ;------------------------------------------------------------------------ OpenAdapterComplete proto stdcall :dword, :dword, :dword CloseAdapterComplete proto stdcall :dword, :dword SetPromiscuousMode proto stdcall :dword, :dword ;------------------------------------------------------------------------ ; constants ;------------------------------------------------------------------------ NDIS_BINDING_STATE equ 1 NDIS_UNBINDING_STATE equ 2 NDIS_BINDING_END equ 0FFFFFFFEh NDIS_UNBINDING_END equ 0FFFFFFFDh MEDIUM_SUPPORTED_NUM equ 1 ;------------------------------------------------------------------------ ; ctlcodes ;------------------------------------------------------------------------ CTL_DEVICE_ENUM equ CTL_CODE(FILE_DEVICE_NETWORK, 800h, METHOD_NEITHER, FILE_ANY_ACCESS) CTL_SET_PROMISCUOUS equ CTL_CODE(FILE_DEVICE_NETWORK, 801h, METHOD_NEITHER, FILE_ANY_ACCESS) CTL_DEST_IP equ CTL_CODE(FILE_DEVICE_NETWORK, 802h, METHOD_NEITHER, FILE_ANY_ACCESS) CTL_SORC_IP equ CTL_CODE(FILE_DEVICE_NETWORK, 803h, METHOD_NEITHER, FILE_ANY_ACCESS) ;------------------------------------------------------------------------ ; structs ;------------------------------------------------------------------------ NDIS_OPEN_CONTEXT STRUCT AdapterContext dd ? BindingHandle dd ? AdapterHandle dd ? StateFlags dd ? ;reserved DevNameBound dd ? ;UNICODE_STRING <> dd ? UnbindContext dd ? NextContext dd ? ;Flink PrevContext dd ? ;Blink NDIS_OPEN_CONTEXT ENDS ;------------------------------------------------------- ;******************************************************* _QUERY_SET_INFO STRUCT Oid DWORD ? InformationBuffer DWORD ? InformationBufferLength DWORD ? BytesWritten DWORD ? BytesNeeded DWORD ? _QUERY_SET_INFO ENDS NDIS_REQUEST STRUCT ; size 28h MacReserved DD 4 DUP(?) RequestType DWORD ? QuerySetInformation _QUERY_SET_INFO <> NDIS_REQUEST ENDS ;******************************************************* ;------------------------------------------------------- SetPromiscuousMode proc uses esi ebx IoStackLocation:DWORD, pStatus:DWORD ; sets to promiscuous mode of selected adapter local Mode:DWORD xor ecx,ecx mov eax,FirstContext ; pointer to the first bound adapter NDIS_OPEN_CONTEXT struct test eax,eax jz err_no_adapter @@: inc ecx assume eax:ptr NDIS_OPEN_CONTEXT mov eax,[eax].NextContext ; pointer to next bound adapter context assume eax:nothing test eax,eax jnz @b mov eax,IoStackLocation ; parameter passed to the DispatchIo routine because it is called from DispatchIo assume eax:ptr IO_STACK_LOCATION mov edx,[eax].Parameters.DeviceIoControl.Type3InputBuffer ; size of this buffer is 4 bytes always assume eax:nothing mov eax,[edx] ; get adapter number which to set promiscuous mode test eax,eax jz err_no_adapter ; STATUS_UNSUCCESSFUL cmp eax,ecx jg err_no_adapter ; no adapter needed mov ecx,FirstContext assume ecx:ptr NDIS_OPEN_CONTEXT nextadapter: dec eax mov edx,ecx mov ecx,[ecx].NextContext assume ecx:nothing jnz nextadapter setpromisc: assume edx:ptr NDIS_OPEN_CONTEXT lea ecx,request ; request is a struct like NDIS_REQUEST and is located in section '.data' assume ecx:ptr NDIS_REQUEST mov eax,[edx].BindingHandle push edx ; save pOpenAdapter assume edx:nothing mov Mode,NDIS_PACKET_TYPE_PROMISCUOUS mov [ecx].RequestType,NdisRequestSetInformation mov [ecx].QuerySetInformation.Oid,OID_GEN_CURRENT_PACKET_FILTER lea edx,Mode mov [ecx].QuerySetInformation.InformationBuffer,edx mov [ecx].QuerySetInformation.InformationBufferLength,4 assume ecx:nothing mov ebx,pStatus ; ebx!!!!!!!!!!!!!!!!!!! (for myself) invoke NdisRequest, ebx, eax, ecx mov ecx,pStatus pop edx ; edx = pOpenContext mov eax,[ecx] test eax,eax jz success cmp eax,STATUS_PENDING jz success jmp @f success: and dword ptr[ecx],STATUS_SUCCESS ; this status will be returned by DispatchIo routine jmp @f err_no_adapter: mov eax,pStatus mov ecx,STATUS_UNSUCCESSFUL ; see previous comment mov dword ptr[eax],ecx @@: ret SetPromiscuousMode endp ;------------------------------------------------------- подскажите пожалста что не так...
можно ли как-нибудь перевести адаптер, не поддерживающий OID_GEN_CURRENT_PAcKET_FILTER , в прослушивающий режим?
Windows Driver Kit: Network Devices and Protocols OID_GEN_PROMISCUOUS_MODE As a query, NDIS and overlying drivers use the OID_GEN_PROMISCUOUS_MODE OID to determine whether a network interface is promiscuous or not (ifPromiscuousMode from RFC 2863). Version Information Windows Vista Supported. NDIS 6.0 drivers Supported. Comments NDIS handles this OID for miniport adapters and filter modules, and only NDIS interface providers receive this OID query. If the interface provider returns NDIS_STATUS_SUCCESS and if the interface accepts only packets that are addressed to that interface, the result value should be FALSE. This value should be TRUE if the interface accepts all network packets ...да, если нам нужно узнать в promiscuous ли наш адаптер. те это только c NdisRequestQueryInformation в поле RequestType. а мне надо УСТАНОВИТЬ этот ружим. в ддк написано что он устанавливается OID'om OID_GEN_CURRENT_PACKET_FILTER, и в поле NDIS_REQUEST.SET_INFORMATION.InformationBuffer должен лежать указатель на буфер размером 4 байта , в котором лежит NDIS_PACKET_TYPE_PROMISCUOUS... но как я писал выше, минипорт возвращает в RequestComplete в параметре статуса NDIS_STATUS_NOT_SUPPORTED... мож есть еще какиенть способы установки promiscuous mode???