WDMとACPIによるPnP機能と
電源管理機能について

 本誌1998年秋号〔参考文献(1)〕でNTKERN.VXDの内部情報について述べましたが,前回触れられなかった詳細を紹介します.

山下 直彦

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 山下 直彦