在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > windowsNT4.0下設(shè)備驅(qū)動(dòng)程序的開發(fā)與應(yīng)用

            windowsNT4.0下設(shè)備驅(qū)動(dòng)程序的開發(fā)與應(yīng)用

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

            RtlInitUnicodeString(Win32DeviceName, SelfWin32Name);

            //聯(lián)接內(nèi)部設(shè)備名與Win32子系統(tǒng)下的設(shè)備名

            Status = IoCreateSymbolicLink( Win32DeviceName, NtDeviceName);

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

            ...

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

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

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

            表2 IRP標(biāo)頭中外部可見的域

            2.jpg

            表3 IRP堆棧單元的一些內(nèi)容

            3.jpg

            表4 Device 對(duì)象的外部可見域

            4.jpg

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

            下面是一個(gè)驅(qū)動(dòng)程序服務(wù)例程利用Device對(duì)象和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);

            //得到由用戶應(yīng)用程序發(fā)來的用戶數(shù)據(jù),并在需要時(shí),將結(jié)果通過此變量返回給用戶

            pIOBuffer=PULONGpIrp->AssociatedIrp.System

            Buffer;

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

            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:

            //執(zhí)行功能代碼

            Field1 = pLDI->SelfField1;

            ...

            break;

            case IOCTL_Function2:

            //執(zhí)行功能代碼

            ...

            break;

            break

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

            pIrp->IoStatus.Status = Status;

            IoCompleteRequest(pIrp IO_NO_INCREMENT);

            return Status;

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

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

            VOID XxUnload(PDRIVER_OBJECT DriverObject)

            {

            PLOCAL_DEVICE_INFO pLDI;

            UNICODE_STRING Win32DeviceName;

            // 得到全局?jǐn)?shù)據(jù),根據(jù)全局?jǐn)?shù)據(jù)進(jìn)行清理工作

            pLDI=PLOCAL_DEVICE_INFODriverObject->Device

            Object->DeviceExtension

            if (pLDI->Field2 == TRUE)

            {

            ...

            // 刪除分配的設(shè)備名及設(shè)備

            RtlInitUnicodeString(Win32DeviceName, SelfWin32 Name);

            IoDeleteSymbolicLink(Win32DeviceName);

            IoDeleteDevice(pLDI->DeviceObject);

            6 用戶層應(yīng)用程序與驅(qū)動(dòng)程序間的接口

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

            ·打開該設(shè)備文件(由IRP_MJ_CREATE功能代碼完成)

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

            ·寫入數(shù)據(jù)(由IRP_MJ_WRITE功能代碼完成)

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

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

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

            void main()

            {

            HANDLE hndFile; // 由CreateFile得到

            union {

            ULONG LongData;

            USHORT ShortData;

            UCHAR CharData;

            }DataBuffer; //從設(shè)備驅(qū)動(dòng)程序中得到的數(shù)據(jù)

            LONG IoctlCode; //功能代碼

            ULONG DataLength;

            LONG Parameter1;

            //調(diào)用IRP中的IRP _MJ_CREATE功能

            hndFile = CreateFile(

            ″\\.\SelfWin32Name″, // 打開設(shè)備文件″ SelfWin32Name″



            關(guān)鍵詞:

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉