Atheros の NIC ドライバを元に解析してみたNDIS 5.1と5.0の違い
1. CacheFillSize の取得方法の違い
#if (DNDIS51_MINIPORT) Adapter->CacheFillSize = NdisMGetDmaAlignment(Adapter->AdapterHandle); #else Adapter->CacheFillSize = NdisGetCacheFillSize(); #endif |
使う関数が異なるようだ・ω・
ちなみに、Atheros の NDIS 5.0のドライバでは固定値になっていて NdisGetCacheFillSize() は呼ばれていない
*どうやら、Windows 2000にはNdisGetCacheFillSize もないらしい!?
DDKには HalGetDmaAlignmentRequirement と定義されているものの、それも無い!
逆算してみたら、0x40 確保してるようだ・ω・ キラリ
2. NdisMRegisterAdapterShutdownHandler / NdisMDeregisterAdapterShutdownHandler がある
NdisMRegisterAdapterShutdownHandler function (Windows Drivers)
Every NDIS 5.0 NIC driver should register a MiniportShutdown function when it initializes. MiniportShutdown is responsible for restoring the NIC to its initial state before the system is shut down. |
ドキュメントによれば、 MiniportShutdown関数を 初期化時にNDIS 5.0ドライバは登録すべきだって書いてますね
3. NdisMRegisterMiniport の オフセット 0x18 (DWORD +3) よびだしで以下の追加処理がある
SUB_L00014EDC: mov edi,edi push ebp mov ebp,esp mov edx,[ebp+10h] movzx eax,[edx+1Eh] and dword ptr [eax+edx+38h],00000000h mov eax,[ebp+0Ch] mov cx,[eax+0Eh] and cx,0001h push esi mov esi,[ebp+08h] jnz L00014F0C cmp word ptr [esi+00000F30h],0000h jnz L00014F0C mov al,01h jmp L00014F7F L00014F0C: test cx,cx push edi jz L00014F6F movzx ecx,[eax+08h] movzx edi,[esi+00000F30h] push ebx movzx ebx,[eax+09h] and ecx,0000000Fh shl ecx,08h or ecx,ebx movzx ebx,di cmp ebx,ecx pop ebx jz L00014F37 test di,di jnz L00014F6F L00014F37: movzx ecx,[eax+08h] movzx eax,[eax+09h] mov esi,ecx shl esi,08h or esi,eax mov edi,ecx and esi,00000FFFh xor eax,eax shr edi,04h inc eax add esi,esi and edi,eax shr ecx,05h or esi,edi and ecx,00000007h shl esi,03h or esi,ecx movzx ecx,[edx+1Eh] mov [ecx+edx+38h],esi jmp L00014F7E L00014F6F: lea eax,[esi+000001D8h] add dword ptr [eax],00000001h adc dword ptr [eax+04h],00000000h xor al,al L00014F7E: pop edi L00014F7F: pop esi pop ebp retn 000Ch ;------------------------------------------------------------------ |
困ったことに何してるかまったく分かりませんね・ω・;
バッファサイズがNDIS 5.1では可変なので、その辺りの処理をしてる可能性もあるのですが
4. _vsnwprintf がWindows 2000では 自前の処理になっている
なんか、 RtlAnsiCharToUnicodeChar と DbgPrint を駆使してでっかい関数になってました・ω・
Win2000版のほうがドライバがでっかい理由はこれでした
ためしに作ってみたドライバがこちら
l1c50x86.cab
l1c50x86a.sys を l1c50x86.sys にリネームして動けば実験は成功 ・ω・
元の l1c50x86.sysはたぶん Windows 2000最終版の 1.0.0.32
1/7 20:20差し替えました
Comments