<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > windowsNT4.0下設備驅動(dòng)程序的開(kāi)發(fā)與應用

windowsNT4.0下設備驅動(dòng)程序的開(kāi)發(fā)與應用

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò ) 收藏

RtlInitUnicodeString(Win32DeviceName, SelfWin32Name);

//聯(lián)接內部設備名與Win32子系統下的設備名

Status = IoCreateSymbolicLink( Win32DeviceName, NtDeviceName);

//利用RtlQueryRegistryValues函數讀出注冊表中Parameters下的參數值,初始化自己的硬件

...

4 驅動(dòng)程序服務(wù)例程

驅動(dòng)程序初始化之后,始終等待發(fā)自用戶(hù)的命令或由其它事件源引起的事件。一旦命令或事件發(fā)生,I/O管理器就調用相應的服務(wù)例程提供服務(wù)。而幾乎所有的I/O都是通過(guò)I/O請求包IRP驅動(dòng)的。所謂IRP驅動(dòng),就是I/O管理器負責在非分頁(yè)的系統內存中分配一定空間,當接受用戶(hù)發(fā)出的命令或由事件引發(fā)后,將工作指令按一定的數據結構置于其中,傳遞到驅動(dòng)程序服務(wù)例程。換言之,IRP包含了驅動(dòng)程序服務(wù)例程所需要的信息指令。表2、表3為IRP的一些數據結構。

同時(shí),I/O管理器和驅動(dòng)程序都需要在所有時(shí)候知道一個(gè)I/O設備所進(jìn)行的情況。系統提供Device對象以滿(mǎn)足此要求。該對象在DriverEntry例程中生成設備時(shí)由系統創(chuàng )建后,分配給驅動(dòng)程序,并在整個(gè)驅動(dòng)程序生存期內有效。當I/O管理器調用驅動(dòng)程序服務(wù)例程時(shí),傳遞該對象。表4為Device對象的外部可見(jiàn)域。

表2 IRP標頭中外部可見(jiàn)的域

2.jpg

表3 IRP堆棧單元的一些內容

3.jpg

表4 Device 對象的外部可見(jiàn)域

4.jpg

其中,DeviceExtension域是一個(gè)重要的數據結構。它是由I/O管理器創(chuàng )建并自動(dòng)掛接到Device對象的非分頁(yè)池,是保存驅動(dòng)程序任意全局變量的最好辦法。因為DeviceExtension是驅動(dòng)程序特定的,要自定義它的數據結構。

下面是一個(gè)驅動(dòng)程序服務(wù)例程利用Device對象和IRP的片段:

NTSTATUS XxSelfDispatch(IN PDEVICE_OBJECT pDO IN PIRP pIrp);

{

PLOCAL_DEVICE_INFO pLDI;

PIO_STACK_LOCATION pIrpStack;

PULONG pIOBuffer;

//得到全局信息

pLDI = (PSELF_DEVICE_INFO)pDO->DeviceExtension;

pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

//得到由用戶(hù)應用程序發(fā)來(lái)的用戶(hù)數據,并在需要時(shí),將結果通過(guò)此變量返回給用戶(hù)

pIOBuffer=PULONGpIrp->AssociatedIrp.System

Buffer;

// 由IRP攜帶的信息決定驅動(dòng)程序的執行

switch (pIrpStack->MajorFunction)

{

case IRP_MJ_CREATE:

case IRP_MJ_CLOSE:

Status = STATUS_SUCCESS;

break;

case IRP_MJ_DEVICE_CONTROL:

//由Parameters進(jìn)一步解釋控制代碼含義

switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)

{

case IOCTL_Function1:

//執行功能代碼

Field1 = pLDI->SelfField1;

...

break;

case IOCTL_Function2:

//執行功能代碼

...

break;

break

// 返回I/O操作的狀態(tài)

pIrp->IoStatus.Status = Status;

IoCompleteRequest(pIrp IO_NO_INCREMENT);

return Status;

5 驅動(dòng)程序終止例程

Unload例程負責取消由DriverEntry例程所做的任何事情,包括解除屬于該驅動(dòng)程序的任何硬件資源的分配,以及刪除屬于驅動(dòng)程序的任何內核對象。通常這僅在系統關(guān)閉時(shí)需要。

VOID XxUnload(PDRIVER_OBJECT DriverObject)

{

PLOCAL_DEVICE_INFO pLDI;

UNICODE_STRING Win32DeviceName;

// 得到全局數據,根據全局數據進(jìn)行清理工作

pLDI=PLOCAL_DEVICE_INFODriverObject->Device

Object->DeviceExtension

if (pLDI->Field2 == TRUE)

{

...

// 刪除分配的設備名及設備

RtlInitUnicodeString(Win32DeviceName, SelfWin32 Name);

IoDeleteSymbolicLink(Win32DeviceName);

IoDeleteDevice(pLDI->DeviceObject);

6 用戶(hù)層應用程序與驅動(dòng)程序間的接口

驅動(dòng)程序完成后,將在系統重新引導時(shí)裝入并初始化(由DriverEntry例程完成)。此時(shí),驅動(dòng)程序處于可用狀態(tài),等待用戶(hù)層應用程序使用。用戶(hù)層應用程序可以:

·打開(kāi)該設備文件(由IRP_MJ_CREATE功能代碼完成)

·讀出數據(由IRP_MJ_READ功能代碼完成)

·寫(xiě)入數據(由IRP_MJ_WRITE功能代碼完成)

·執行用戶(hù)自定義的功能代碼(由IRP_MJ_DEVICE_CONTROL功能代碼完成)

·關(guān)閉該設備文件(由IRP_MJ_CLOSE功能代碼完成)

以下是部分實(shí)現代碼:

void main()

{

HANDLE hndFile; // 由CreateFile得到

union {

ULONG LongData;

USHORT ShortData;

UCHAR CharData;

}DataBuffer; //從設備驅動(dòng)程序中得到的數據

LONG IoctlCode; //功能代碼

ULONG DataLength;

LONG Parameter1;

//調用IRP中的IRP _MJ_CREATE功能

hndFile = CreateFile(

″\\.\SelfWin32Name″, // 打開(kāi)設備文件″ SelfWin32Name″



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>