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

;------------------------------------------------------------------
追加処理
         push    [ebp-1Ch]
          push    ebx
          push    esi
          call    SUB_L00014EDC
          test    al,al
          jz     L00015794

困ったことに何してるかまったく分かりませんね・ω・;
バッファサイズが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差し替えました

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です