本文介紹了Windows 2000 WDM驅動程式結構及其編寫的注意事項,最後給出了一個簡單的WDM驅動程式及用戶端程式的源碼,希望能對大家有所協助。
1. 簡介:
Windows 2000原名Windows NT 5.0是繼Windows NT 4.0的新一代作業系統,它不但繼承了Windows NT 4.0的種種優點,而且在技術上又有了許多的突破,其中一項就是對驅動程式結構的變化,即引入了全新的WDM (Win32 Driver Model)的驅動程式構架。說是新技術,其實早在1997年Microsoft就提出了該項技術並在Windows 98中得到了充分的應用,換句話說,Windows 98也支援WDM。這樣WDM就成為了一個跨平台的驅動程式模型,不僅如此WDM驅動程式還可以在不修改原始碼的情況下經過重新編譯後在非Intel平台上運行,可以不誇張的講WDM算得上是21世紀的驅動程式構架。
2.WDM的工作原理:
WDM是在NT 4.0驅動程式結構上發展起來的,所以它與NT 4.0的驅動程式極為相似,但是它卻有了本質上的提高,比如它支援USB、IEEE 1394、ACPI等全新的硬體標準。雖然Windows 98與Windows 2000都支援WDM,可是並不意味著Windows 98下的VxD可以在Windows 2000下運行,而NT下的VDD卻可以在Windows 98下運行。不過原先準備在兩個平台上同時運行需要編寫兩個截然不同的驅動程式,而現在只需要編寫一個WDM驅動程式就可以了。同NT 4.0驅動程式一樣,WDM驅動程式也是分層的,即不同層上的驅動程式有著不同的優先權,而Windows 9x下的VxD則沒有此結構。另外,WDM還引入了功能裝置對象FDO(functional device object)與物理裝置對象PDO(physical device object)兩個新概念來描述硬體,一個PDO代表一個真實硬體,在驅動程式看來則是一個FDO,見圖1。另外值得注意的是,一個硬體只允許有一個PDO,但卻可以擁有多個FDO,而在驅動程式中我們不是直接操作硬體而是操作相應的PDO與FDO。在Ring-3與Ring-0通訊方面,作業系統為每一個使用者請求打包成一個IRP(IO Request Packet)結構,將其發送至驅動程式並通過識別IRP中的PDO來識別是發送給哪一個裝置的。另外,在驅動程式的載入方面WDM既不靠驅動程式名稱也不靠一個具有某種特殊意義的ID,而是依靠一個128位的GUID來識別驅動程式(Windows下許多東西都是靠此進行識別的)。
3.具體實現:
同許多應用程式一樣,WDM驅動程式是PE格式的,但是它卻沒有WinMain或main這樣的入口,取而代之的是DriverEntry:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
//不同於前面的PDO
IN PUNICODE_STRING RegistryPath)
{
DriverObject- >DriverExtension- >AddDevice =
AddDevice; // DriverExtension 中存放著驅動程式擴充資訊,包括裝置所需要的硬體資源等。
DriverObject- >MajorFunction[IRP_MJ_CREATE]
= RequestCreate;
DriverObject- >MajorFunction[IRP_MJ_CLOSE]
= RequestClose;
DriverObject- >MajorFunction[IRP_MJ_DEVICE_CONTROL]
= RequestControl;
DriverObject- >MajorFunction[IRP_MJ_PNP]
= RequestPnp;
return STATUS_SUCCESS;
}