Win2000でXPのネットワークドライバを改造して動かない理由が判明

Windows XP用のドライバを改造してもどうやっても Windows 2000で動作しなくて悩んでいたのですが、原因が分かりました ・ω・

まず、XP用のドライバ

          push    0000007Ch <- NDIS50_MINIPORT_CHARACTERISTICSのサイズ
          lea    eax,[ebp-7Ch]
          push    eax
          push    [ebp+0Ch]
          mov    byte ptr [ebp-7Ch],05h
          mov    byte ptr [ebp-7Bh],01h  <- NDIS Version 5.1を指定
          mov    dword ptr [ebp-1Ch],L0001A628
          mov    dword ptr [ebp-18h],L0001C9FC
          mov    dword ptr [ebp-14h],L0001347A
          mov    dword ptr [ebp-74h],L0001919C
          mov    dword ptr [ebp-68h],L000134AE
          mov    dword ptr [ebp-64h],L00018E46
          mov    dword ptr [ebp-60h],L000137B4
          mov    dword ptr [ebp-5Ch],L00018D54
          mov    dword ptr [ebp-58h],L0001BAF8
          mov    dword ptr [ebp-50h],L00013B08
          mov    dword ptr [ebp-40h],SUB_L00019506
          mov    dword ptr [ebp-48h],L0001B2D0
          mov    dword ptr [ebp-3Ch],L0001AD7A
          call    [NDIS.SYS!NdisMRegisterMiniport]

さて、ここで、NDIS.SYSの中身を見てみましょう

 NdisMRegisterMiniport:
          push    ebp
          mov    ebp,esp
          lea    eax,[ebp+10h]
          push    eax
          push    [ebp+10h]
          push    [ebp+0Ch]
          push    [ebp+08h]
          call    SUB_L00022C10
          pop    ebp
          retn    000Ch

 SUB_L00022C10:
          push    ebp
          mov    ebp,esp
          push    ecx
          push    ebx
          push    esi
          push    edi
          mov    ecx,L00013B50
          call    SUB_L00011858
          mov    ebx,[ebp+08h]
          test    ebx,ebx
          jz     L00022DBF
          mov    esi,[ebp+0Ch]
          xor    ecx,ecx
          cmp    [esi+01h],cl <- NDIS Version 下位が 0以外の場合C0010004
          jnz    L00022C4F
          mov    al,[esi]
          cmp    al,03h
          jnz    L00022C40
          push    0000003Ch
          jmp    L00022C4E
 L00022C40:
          cmp    al,04h
          jnz    L00022C48
          push    00000048h
          jmp    L00022C4E
 L00022C48:
          cmp    al,05h   <- NDIS Version 上位が 5より大きい場合C0010004
          jnz    L00022C4F
          push    00000060h <- NDIS 5.0向けの構造体サイズ
 L00022C4E:
          pop    ecx
 L00022C4F:
          test    cx,cx
          jz     L00022DC6
          movzx    eax,cx
          cmp    [ebp+10h],eax <- 構造体サイズの確認
          mov    [ebp+08h],eax
          jc     L00022DCD       <- 対応してるバージョンの構造サイズよりでかい分には構わないらしい
          cmp    byte ptr [esi],05h
          jnz    L00022C7C
          cmp    dword ptr [esi+58h],00000000h
          jz     L00022C7C
          cmp    dword ptr [esi+5Ch],00000000h
          jz     L00022DCD
               :
 L00022DC6:
          mov    edi,C0010004h
          jmp    L00022DD9

というわけで、 NdisMRegisterMiniport を呼ぶときに Version 5.0を指定すれば動作する可能性が出てきました|・ω・) ドキドキ

以前作った Atheros ドライバを修正してみたのがこちら

l1c50x86v3.cab
2015/1/25更新

おすすめ

6件のフィードバック

  1. ゐふゆさ より:

    うれしいです!
    毎日おつかれさまです。

  2. Izumi より:

    >> Atheros ドライバを修正
    黒翼猫さん、ありがとうございます。m(__)m
    私のマザーはAtherosのLANチップ
    (8151)ですが、IntelPRO1000を挿しています。
    貴ドライバ試しましたが私の環境
    (ギガバイト社:G-41M/COMBOマザー)
    では何故か動きませんでした。

  3. AR8151 より:

    上の方と同じマザーですが、試した結果を報告しておきます。
    Atheros:AR8151 -> 動きません。
    内容:
    1.ドライバ(l1c50x86.sys)のチェックサムが不正になってるんで、
      ロードの段階ではじかれるてる模様・・・
    2.チェックサムを修正 -> LANのLED点灯
      おっ! と思ったが、残念ながら動かず。
      デバイスマネージャで見ると、黄色!がついています。
      惜しいところまで行ってるのかも?

  4. AR8151 より:

    弄くって動くようになったんで報告しておきます
    NdisWriteConfigurationで
    NDIS_PARAMETER_TYPE::NdisParameterHexInteger
    を使ってる処があって、そこでアウト。
    どうもWin2kのNDIS.sysはこのタイプの値には未対応の模様。
    WinDbgで詳細に追ってみると、
    アウトしてる箇所は、無くても問題なさそうな処だったんで該当箇所をパス
    したら、上手く動きました。

  5. 黒翼猫 より:

    おお、ありがとうございます。ちょっと調べてみます

  6. AR8151 より:

    おっ、見ててくれたんだ。
    2012年12月30日 nVIDIA 310.70 for Windows 2000 Beta
    で報告しておいた、GetModuleHandleExA()も確認して下さいな。
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x00000004)
    The lpModuleName parameter is an address in the module.
    —-
    CUDAとPhysXが有効にならないのはなんでだろう・ω・ <- 少なくともCUDAは有効になるよ

コメントを残す

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