WDMとACPIによるPnP機能と 電源管理機能について
山下 直彦 |
NTKERN.VXDの先行技術
Windows9xとWindowsNT間のドライバの共用化との観点から,Windows98で導入されたWDMのミニドライバモデルの雛型として,Windows95でNDIS(Network
Device Interface Specification)のネットワークドライバやSCSI(Small Computer
System Interface)のミニポートドライバがあることは既に述べました.
また,NTKERN.VXDはNTのカーネルの機能をntoskrnl.exe,hal.dllおよびntpnp.sysを僭称して代行処理するトリックについてもふれました(つまり,NTKERN.VXD内の処理ルーチンをNTのシステムファイルのAPIとして_PELDR_AddExportTableを用いて登録する).
それでは,NDISのネットワークドライブはどのように処理されるのでしょうか?NTの場合はNDIS.SYS〔32ビットPE型(注1)〕のファイルが中心として働きます.これらの機構がWindows9xでどのように処理されるか?との疑問です.
結論から言うと,Windows9xでは仮想ドライバNDIS.VXDが中心となります.
まず,Windows95の場合について見ておきます.NDIS.VXDをSourcer97で解析すると,この場合にもVXDLDR.VXDの_PELDR_AddExportTableのAPIが使用されていることがわかります.
リスト1に実質的呼び出し部分を示します.これより,NDIS.VXDはNDIS.SYS,HAL.DLLおよびNTOSKRNL.EXEを僭称して,それぞれ0BCh,0Dh,17h個のAPIを登録していることがわかります.
Windows98の場合は,NDIS.VXDで同様の方法が使われていますが,こんどは,NDIS.SYSおよびTCPIP.SYSのAPIが登録されます.HAL.DLLおよびNTOSKRNL.EXEのAPI登録は,NTKERN.VXDに譲った格好になっています.
SCSIの場合も同様の方法が使われていますが,よりシンプルで,NTでのSCSIPORT.SYSの代わりにWindows95あるいはWindows98で,SCSIPORT.PDR
(拡張子がVXDでないがこれもLE型のファイル)でSCSIPORT.SYSのAPIが登録されます.
以上より,NTKERN.VXDで利用されたトリックはこのNDIS.VXDやSCSIPORT.PDRでの処理の応用であったことがわかります.
さらにAddExportTableを調べる
Windows98ではこれら以外にVXDLDR.VXDの_PELDR_AddExportTableのAPIが多用されています.
まず,VXDLDR.VXD自体を見ておきましょう.VXDLDRでは,ntoskrnl.exeの4個のAPIが登録されています(Windows95のVXDLDRでは_PELDR_
AddExportTableの呼び出しは利用されていない).これはVXDLDRに対するシステムイベント呼び出しのDevice_Initで実行されます.
また,VXDLDRのAPIの_PELDR_LoadModuleから同_PELDR_LoadModuleExが,さらに,VXDLDR_LoadModule2が呼ばれますが,これをさかのぼっていくと_PELDR_AddExportTableが利用されています.これは,後述のPE型ファイルのExportAPIの登録に使われているのでしょう(これらもWindows
95のVXDLDRでは見られない機能である).
また,VTD.VXDでは,ntoskrnl.exeとして4個のAPIが,hal.dllとして1個のAPIが登録されています(Windows95のVTDでは_PELDR_AddExportTableの呼び出しは利用されていない).これもVTDに対するシステムイベント呼び出しのDevice_Initで実行されます.
さらに,PCI.VXDでもNTにおけるPCI.DLLのAPIが登録されています(Windows95のPCI.VXDではこの機能は使われていない).PCIバスについては後述します.
以上のように,_PELDR_AddExportTableはWindows98の環境をNTのそれに近づけるために必須のAPIとして,各所で使われています.
USB・HIDのPE型ドライバ
参考文献(1)では,KBDHID.VXDの解析より,VXDLDR.VXDの_PELDR_GetProcAddress APIを使って,HIDPARSE.SYSおよびNTPNP.SYSのAPIアドレスが調べられることを示しました.
HIDPARSE.SYSは32ビットPE型のファイルです.Sourcer97に付属しているユーティリティのDUMPPE.EXEで調べると,リスト2に示すようにHIDPARSE.SYSのExportAPI名とアドレスおよびImportAPI名とアドレスを得ることができます.
USB,HIDに関連するPE型ファイルのImport関係を同様に調べると表1のような情報が得られました.
ここにHID.DLLはC:\Windows\Systemに,その他はC:\Windows\System32\driversにインストールされるファイルです.これ以外にNE型のHIDCI.
DLL(HID Class Installer), SYSCLASS.DLL(System
以下略
copyright 1999 山下 直彦