NdisRegisterProtocol возвращает EAX = 1 Status = NDIS_STATUS_BAD_VERSION = 0C0010004h В окне с отлладочной информацией такая строка: ndis: NdisRegisterProtocol protocol does not have Bind/UnbindAdapterHandler and it is not supported Вот код: mov NPC.MajorNdisVersion,5 mov NPC.MinorNdisVersion,0 mov NPC.Reserved,0 mov NPC.OpenAdapterCompleteHandler,offset ProtocolOpenAdapterComplete mov NPC.CloseAdapterCompleteHandler,offset ProtocolCloseAdapterComplete mov NPC.SendCompleteHandler,offset ProtocolSendComplete mov NPC.TransferDataCompleteHandler,offset ProtocolTransferDataComplete mov NPC.ResetCompleteHandler,offset ProtocolResetComplete mov NPC.RequestCompleteHandler,offset ProtocolRequestComplete mov NPC.ReceiveHandler,offset ProtocolReceive mov NPC.ReceiveCompleteHandler,offset ProtocolReceiveComplete mov NPC.StatusHandler,offset ProtocolStatus mov NPC.StatusCompleteHandler,offset ProtocolStatusComplete mov NPC._Name,offset ProtocolName mov NPC.ReceivePacketHandler,0 mov NPC.BindAdapterHandler,offset ProtocolBindAdapter mov NPC.UnbindAdapterHandler,offset ProtocolUnbindAdapter ;mov NPC.PnPEventHandler,offset ProtocolPnPEvent ;mov NPC.UnloadHandler,offset ProtocolUnload ;mov NPC.CoSendCompleteHandler,offset ProtocolCoSendComplete ;mov NPC.CoStatusHandler,offset ProtocolCoStatus ;mov NPC.CoReceivePacketHandler,offset ProtocolCoReceivePacket ;mov NPC.CoAfRegisterNotifyHandler,offset ProtocolCoAfRegisterNotify push sizeof NPC ;[in] UINT CharacteristicsLength push offset NPC ;[in] PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics push offset NdisProtocolHandle ;[out] PNDIS_HANDLE NdisProtocolHandle push offset NdisStatus ;[out] PNDIS_STATUS Status call NdisRegisterProtocol data. NPC NDIS_PROTOCOL_CHARACTERISTICS <> NDIS_PROTOCOL_CHARACTERISTICS struct MajorNdisVersion db 0 MinorNdisVersion db 0 Reserved dd 0 OpenAdapterCompleteHandler dd 0 CloseAdapterCompleteHandler dd 0 SendCompleteHandler dd 0 TransferDataCompleteHandler dd 0 ResetCompleteHandler dd 0 RequestCompleteHandler dd 0 ReceiveHandler dd 0 ReceiveCompleteHandler dd 0 StatusHandler dd 0 StatusCompleteHandler dd 0 _Name dd 0 ReceivePacketHandler dd 0 BindAdapterHandler dd 0 UnbindAdapterHandler dd 0 PnPEventHandler dd 0 UnloadHandler dd 0 CoSendCompleteHandler dd 0 CoStatusHandler dd 0 CoReceivePacketHandler dd 0 CoAfRegisterNotifyHandler dd 0 NDIS_PROTOCOL_CHARACTERISTICS ends Не знаю что делыть...
явные бока со структурой, скачай символы и сделай нормальное объявление у тебя не регаются Bind/UnbindAdapterHandler потому как их адреса расположены не там где нужно в ndis 5.1 точно не выйдет зарегать такой протокол, про 5.0 не в курсе, нужен драйвер
o14189 пасиба за помощь, это действительно я не ту структуру нарыл. Но вот незадача следующий шаг оказалси ещё драматичнее, NdisOpenAdapter вызывает синий экран без указания типа ошибки... Code (Text): code. push sizeof NPC ;[in] UINT CharacteristicsLength push offset NPC ;[in] PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics push offset NdisProtocolHandle ;[out] PNDIS_HANDLE NdisProtocolHandle push offset NdisStatus ;[out] PNDIS_STATUS Status call NdisRegisterProtocol mov ebx,NdisStatus cmp ebx,NDIS_STATUS_SUCCESS jnz @ExitErrorPCIService mov eax,NdisMedium802_3 mov MediumArray,eax mov eax,0 mov SelectedMediumIndex,eax push 0 ;[in] PSTRING AddressingInformation push 0 ;[in] UINT OpenOptions push offset AdapterName ;[in] PNDIS_STRING AdapterName push ProtocolBindingContext ;[in] NDIS_HANDLE ProtocolBindingContext push NdisProtocolHandle ;[in] NDIS_HANDLE NdisProtocolHandle push 4 ;[in] UINT MediumArraySize push offset MediumArray ;[in] PNDIS_MEDIUM MediumArray push offset SelectedMediumIndex ;[in] PUINT SelectedMediumIndex push offset NdisBindingHandle ;[out] PNDIS_HANDLE NdisBindingHandle push offset OpenErrorStatus ;[out] PNdisStatus OpenErrorStatus push offset NdisStatus ;[out] PNdisStatus Status call NdisOpenAdapter mov ebx,NdisStatus cmp ebx,NDIS_STATUS_SUCCESS jnz @ExitErrorPCIService data. AdapterName dw "A","S","U","S"," ","N","X","1","0","0","1"," ","N","e","t","w","o","r","k" dw " ","A","d","a","p","t","e","r",0 MediumArray dd 0 ProtocolBindingContext dd 0 NdisProtocolHandle dd 0 NdisBindingHandle dd 0 OpenErrorStatus dd 0 SelectedMediumIndex dd 0 hAdapter dd 0 NdisStatus dd 0 что надо засунуть в ProtocolBindingContext что не так?
Это от какой ОС NDIS? 5.0/5.1/5.2? Вобщем обычный контекст пользователя, который позже будет передан, зарегистрированным тобой, колбекам. Нужен анализ минидампа
ну а по коду UNICODE_STRING* != WCHAR* MediumArraySize это не размер, а количество элементов мож еще какие то бока лучше wdk поставить все-таки и посмотреть исходники, там есть пример драйвера протокола
если он тебе сейчас не нужен, а судя по всему ведь не нужен, то передавай NULL когда станет нужен, а это точно случится) если писать не хелоуворлд, то уже передашь то что будет нужно, указатель на какие-то глобальные данные к примеру, или еще чего это уже в поиск Code (Text): @set minidump=%1 @call cmd.exe /K kd.exe -z %minidump% + Code (Text): !analyze -v
количество элементов исправил на 1 результат тот же AdapterName dw "A","S","U","S",0 это тоже что и AdapterName db "A",0,"S",0,"U",0,"S",0,0,0 в любом случае сомниваюсь что не корректрое имя бызвало бы крушение системы.
skyproc это указатель если сомневаешься берешь и отлаживаешь NdisRegisterProtocol либо можешь просто показать где в ndis.sys упало (нужен анализ минидампа), иначе помогать никто не будет
При помощи Sysera я получил следующее: call NdisOpenAdapter NdisOpenAdapter proc .... mov eax,[esp+34h] push ecx mov ecx,[esp+34h] push edx mov edx,[esp+34h] push eax push ecx push edx call [F70EBFE4h] ;EIP=F70DE940h .... NdisOpenAdapter endp F70EBFE4h proc .... mov eax,[ebx+18h] shr eax,1Dh and eax,0FFFFFF01h push eax push [ebp+28h] call F70B9BA3h ;EIP=F70B9B62h .... F70EBFE4h endp F70B9BA3 proc .... push ebx push edi push esi lea eax,[ebp,-1Ch] push eax call RtlUpcaseUnicodeString ;EIP=F70B9C04h .... F70B9BA3 endp RtlUpcaseUnicodeString proc .... mov eax,[esi+04h] ;ESI= Addres UnicodeString ="ASUS NX1001 Network Adapter" mov ax,[eax+ecx*2] .... RtlUpcaseUnicodeString endp от суда видно что к моменту mov ax,[eax+ecx*2] в EAX не адрес строки, что и генерирует исключение push 0 ;[in] PSTRING AddressingInformation push 0 ;[in] UINT OpenOptions push offset AdapterName ;[in] PNDIS_STRING AdapterName push offset ProtocolBindingContext ;[in] NDIS_HANDLE ProtocolBindingContext push NdisProtocolHandle ;[in] NDIS_HANDLE NdisProtocolHandle push 1 ;[in] UINT MediumArraySize push offset MediumArray ;[in] PNDIS_MEDIUM MediumArray push offset SelectedMediumIndex ;[in] PUINT SelectedMediumIndex push offset NdisBindingHandle ;[out] PNDIS_HANDLE NdisBindingHandle push offset OpenErrorStatus ;[out] PNdisStatus OpenErrorStatus push offset NdisStatus ;[out] PNdisStatus Status call NdisOpenAdapter offset AdapterName -> ни что иное как адре юникод строки так что не так?
Code (Text): NdisOpenAdapter(...) { //... ndisFindRootDevice( AdapterName,... ); //... } ndisFindRootDevice( PUNICODE_STRING AdapterName,... ) { //... RtlUpcaseUnicodeString(&AdapterNameUpcased, AdapterName, 0); //... } внутри последней функции произойдет доступ к AdapterName->Buffer, тут и исключение
Да уже дапёр, как то пропусти мимо ушей твой комментарий mov UsAdapterName._Length,36h mov UsAdapterName._MaximumLength,36h mov UsAdapterName._Buffer,offset AdapterName Усё работает и возвращает NDIS_STATUS_ADAPTER_NOT_FOUND, мда час от часу не легче