2014年10月26日
Win2000でXPのネットワークドライバを改造して動かない理由が判明
Windows XP用のドライバを改造してもどうやっても Windows 2000で動作しなくて悩んでいたのですが、原因が分かりました ・ω・
まず、XP用のドライバ
さて、ここで、NDIS.SYSの中身を見てみましょう
というわけで、 NdisMRegisterMiniport を呼ぶときに Version 5.0を指定すれば動作する可能性が出てきました|・ω・) ドキドキ
以前作った Atheros ドライバを修正してみたのがこちら
l1c50x86v3.cab
2015/1/25更新
まず、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更新
Twitter Feedback
トラックバックURL
この記事へのコメント
1. Posted by ゐふゆさ 2014年10月28日 21:12
うれしいです!
毎日おつかれさまです。
毎日おつかれさまです。
2. Posted by Izumi 2014年11月01日 16:46
>> Atheros ドライバを修正
黒翼猫さん、ありがとうございます。m(__)m
私のマザーはAtherosのLANチップ
(8151)ですが、IntelPRO1000を挿しています。
貴ドライバ試しましたが私の環境
(ギガバイト社:G-41M/COMBOマザー)
では何故か動きませんでした。
黒翼猫さん、ありがとうございます。m(__)m
私のマザーはAtherosのLANチップ
(8151)ですが、IntelPRO1000を挿しています。
貴ドライバ試しましたが私の環境
(ギガバイト社:G-41M/COMBOマザー)
では何故か動きませんでした。
3. Posted by AR8151 2015年01月20日 17:36
上の方と同じマザーですが、試した結果を報告しておきます。
Atheros:AR8151 −> 動きません。
内容:
1.ドライバ(l1c50x86.sys)のチェックサムが不正になってるんで、
ロードの段階ではじかれるてる模様・・・
2.チェックサムを修正 −> LANのLED点灯
おっ! と思ったが、残念ながら動かず。
デバイスマネージャで見ると、黄色!がついています。
惜しいところまで行ってるのかも?
Atheros:AR8151 −> 動きません。
内容:
1.ドライバ(l1c50x86.sys)のチェックサムが不正になってるんで、
ロードの段階ではじかれるてる模様・・・
2.チェックサムを修正 −> LANのLED点灯
おっ! と思ったが、残念ながら動かず。
デバイスマネージャで見ると、黄色!がついています。
惜しいところまで行ってるのかも?
4. Posted by AR8151 2015年01月24日 11:47
弄くって動くようになったんで報告しておきます
NdisWriteConfigurationで
NDIS_PARAMETER_TYPE::NdisParameterHexInteger
を使ってる処があって、そこでアウト。
どうもWin2kのNDIS.sysはこのタイプの値には未対応の模様。
WinDbgで詳細に追ってみると、
アウトしてる箇所は、無くても問題なさそうな処だったんで該当箇所をパス
したら、上手く動きました。
NdisWriteConfigurationで
NDIS_PARAMETER_TYPE::NdisParameterHexInteger
を使ってる処があって、そこでアウト。
どうもWin2kのNDIS.sysはこのタイプの値には未対応の模様。
WinDbgで詳細に追ってみると、
アウトしてる箇所は、無くても問題なさそうな処だったんで該当箇所をパス
したら、上手く動きました。
5. Posted by 黒翼猫 2015年01月24日 12:33
おお、ありがとうございます。ちょっと調べてみます
6. Posted by AR8151 2015年01月24日 17:34
おっ、見ててくれたんだ。
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は有効になるよ
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は有効になるよ