解决ndis协议驱动描写春天的片段ndisprot“发生系统错误 31”问题
/s/blog_541329b40100exoy.html
粗犷拼音(2009-08-27 19:26:23)
转载
标签: ndis 协议驱动 系统错误 31 杂谈 冬天手脚出汗 | 分类:好好工作 |
| |
坚定的理想信念
解决函谷关之战ndis协议驱动ndisprot“发生系统错误 31”问题
用WDK的ndisprot编译后,安装为网络协议,然后net start ndisprot。
结果显示:发生系统错误 31 连到系统上的设备没有发挥作用
没办法,准备用WinDbg追踪。
现在 DriverEntry里面的变量定义下加上:
#if DBG
_asm int 3
#endif
然后重新进入vmware中的XP,运行net start ndisprot,中断下来。
一直跟踪到NdisRegisterProtocol,显示出错:"Failed to register protocol with NDIS\n"
用ufmovie怎么读反编译,大概看了下NdisRegisterProtocol:
kd> uf NDIS!NdisRegisterProtocol
NDIS!NdisRegisterProtocol:
f7ba817f 8bff mov edi,edi
f7ba8181 55 push ebp
f7ba8182 8bec mov ebp,esp
f7ba8184 51 push ecx
f7ba8185 53 push ebx
f7ba8186 56 push esi
f7ba8187 57 push edi
f7ba8188 b93861baf7 mov ecx,offt NDIS!ndisPkgs+0x20 (f7ba6138)
f7ba818d e88c8bffff call NDIS!ndisReferencePackage (f7ba0d1e)
f7ba8192 b91861baf7 mov ecx,offt NDIS!ndisPkgs (f7ba6118)
f7ba8197 e8828bffff call NDIS!ndisReferencePackage (f7ba0d1e)
f7ba819c 8b7d10 mov edi,dword ptr [ebp+10h]
f7ba819f 8a07 mov al,byte ptr [edi]
f7ba81a1 3c04 cmp al,4
f7ba81a3 0f824b5b0000 jb NDIS!NdisRegisterProtocol+0x26 (f7badcf4)
NDIS!NdisRegisterProtocol+0x30:
f7ba81a9 0f8471180000 je NDIS!NdisRegisterProtocol+0x32 (f7ba9a20)
NDIS!NdisRegisterProtocol+0x3c:
f7ba81af 3c05 cmp al,5
f7ba81b1 0f8584180000 jne NDIS!NdisRegisterProtocol+0x191 (f7ba9a3b)
NDIS!NdisRegisterProtocol+0x44:
f7ba81b7 807f0101 cmp byte ptr [edi+1],1
f7ba81bb 0f877a180000 ja NDIS!NdisRegisterProtocol+0x191 (f7ba9a3b)
NDIS!NdisRegisterProtocol+0x4e:
f7ba81c1 6a6c push 6Ch
NDIS!NdisRegisterProtocol+0x50:
f7ba81c3 33c9 xor ecx,ecx
f7ba81c5 394f3c cmp dword ptr [edi+3Ch],ecx
f7ba81c8 58 pop eax
f7ba81c9 0f8462180000 je NDIS!NdisRegisterProtocol+0x186 (f7ba9a31)
NDIS!NdisRegisterProtocol+0x5c:
f7ba81cf 394f40 cmp dword ptr [edi+40h],ecx
f7ba81d2 0f8459180000 je NDIS!NdisRegisterProtocol+0x186 (f7ba9a31)
NDIS!NdisRegisterProtocol+0x65:
f7ba81d8 0fb7c0 movzx eax,ax
f7ba81db 394514 cmp dword ptr [ebp+14h],eax
f7ba81de 8945fc mov dword ptr [ebp-4],eax
f7ba81e1 0f82145b0000 jb NDIS!NdisRegisterProtocol+0x70 (f7badcfb)
NDIS!NdisRegisterProtocol+0x7c:
f7ba81e7 83c730 add edi,30h
f7ba81ea 0fb707 movzx eax,word ptr [edi]
f7ba81ed 684e447062 push 6270444Eh
f7ba81f2 bec6000000 mov esi,0C6h
f7ba81f7 03c6 add eax,esi
f7ba81f9 50 push eax
f7ba81fa 51 push ecx
f7ba81fb 897d14 mov dword ptr [ebp+14h],edi
f7ba81fe ff15505ebaf7 call dword ptr [NDIS!_imp__ExAllocatePoolWithTag (f7ba5e50)]
f7ba8204 8bd8 mov ebx,eax
f7ba8206 85db test ebx,ebx
f7ba8208 0f84f95a0000 je NDIS!NdisRegisterProtocol+0x9f (f7badd07)
。。。。
重新进入,中断后,到NdisRegisterProtocol F11 STEP IN
到:
f5bd00cb 837d8c00 cmp dword ptr [ebp-74h],0
kd> dd ebp-74h
f5a96c08 c0010005 00000005 00000000 f5bc8280
开工大吉祝福语
返回值c0010005,到ndis.h查看对应:
#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L)
从上面代码看,是将获得NDIS版本作为依据,将NDIS50_PROTOCOL_CHARACTERISTICS 和 CharacteristicsLength比较
由于不知道NdisRegisterProtocol源码在哪个文件,在这里纠结了一番。不过后来在网上找到了。
既然是尺寸问题,把NdisRegisterProtocol的最后一个参数骚气十足的网名sizeof(NDIS_PROTOCOL_CHARACTERISTICS)改掉
暂时先把sizeof(NDIS50_PROTOCOL_CHARACTERISTICS)放进去用。
编译后安装协议,net start ,显示启动成功。
具体如何合理改,暂时还没考虑,先解决能用问题。不过ndisprot和passthru在协议驱动使用的注册函数都是一样的,passthru一点问题都没有,等空了再看看。