国产肉体XXXX裸体137大胆,国产成人久久精品流白浆,国产乱子伦视频在线观看,无码中文字幕免费一区二区三区 国产成人手机在线-午夜国产精品无套-swag国产精品-国产毛片久久国产

新聞中心

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

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

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

摘要: 介紹了Windows NT4.0內(nèi)核模式設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)中的一般性過(guò)程。通過(guò)提供一個(gè)最小化驅(qū)動(dòng)程序的核心代碼,解釋各組成部分的結(jié)構(gòu)功能和使用方法。在實(shí)踐中,結(jié)合自身的開(kāi)發(fā)需要,可編寫(xiě)出具有實(shí)用價(jià)值的驅(qū)動(dòng)程序。

本文引用地址:http://m.ptau.cn/article/201609/304725.htm

關(guān)鍵詞:Win32子系統(tǒng) 設(shè)備驅(qū)動(dòng) 系統(tǒng)注冊(cè)表 I/O請(qǐng)求包

Windows NT 以其安全、穩(wěn)定及界面友好等特性逐漸成為工業(yè)控制領(lǐng)域的前臺(tái)操作系統(tǒng)。面對(duì)工業(yè)控制中大量采用的串/并行通信及總線(xiàn)控制等技術(shù),要求用戶(hù)不斷開(kāi)發(fā)出滿(mǎn)足自身需要的硬件設(shè)備,同時(shí)又要求用戶(hù)應(yīng)用程序與這些硬件設(shè)備進(jìn)行通信,發(fā)送控制命令,讀取狀態(tài)信息等等。Windows NT出于安全性、穩(wěn)定性等考慮,不允許用戶(hù)應(yīng)用程序?qū)ξ锢碛布M(jìn)行直接訪(fǎng)問(wèn),這就需要使用設(shè)備驅(qū)動(dòng)程序跨越操作系統(tǒng)邊界對(duì)物理硬件進(jìn)行操作,并向上提供客戶(hù)應(yīng)用程序控制接口以供調(diào)用。

1 分層結(jié)構(gòu)與設(shè)備驅(qū)動(dòng)程序

Windows NT分層結(jié)構(gòu)(如圖1所示)包括運(yùn)行于用戶(hù)模式及內(nèi)核模式的各種部件,設(shè)備驅(qū)動(dòng)程序在圖1的左下角,處于內(nèi)核模式下I/O管理器之中。

2 驅(qū)動(dòng)程序工作方式

內(nèi)核模式驅(qū)動(dòng)程序與應(yīng)用程序之間的最大差別之一是驅(qū)動(dòng)程序的控制結(jié)構(gòu)。內(nèi)核模式驅(qū)動(dòng)程序沒(méi)有main或WinMain,而是由I/O管理器根據(jù)需要調(diào)用一個(gè)驅(qū)動(dòng)程序例程:

· 驅(qū)動(dòng)程序被裝入時(shí);

· 驅(qū)動(dòng)程序被卸出或系統(tǒng)關(guān)閉時(shí);

· 用戶(hù)程序發(fā)出I/O系統(tǒng)服務(wù)調(diào)用時(shí);

· 共享硬件資源對(duì)驅(qū)動(dòng)程序可用時(shí);

· 設(shè)備操作過(guò)程中的任何時(shí)候。

3 初始化過(guò)程

3.1 系統(tǒng)注冊(cè)表中有關(guān)設(shè)備驅(qū)動(dòng)程序的項(xiàng)目是系統(tǒng)加載設(shè)備驅(qū)動(dòng)程序的入口點(diǎn)

系統(tǒng)注冊(cè)表中用于系統(tǒng)加載設(shè)備驅(qū)動(dòng)程序的項(xiàng)目如下:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDriverName]

″Type″ = dword00000001

″Start″ = dword00000002

″Group″ = ″Extended Base″

″ErrorControl″ = dword∶00000001

其中Start含義如下:

SERVICE_BOOT_START (0×0) 操作系統(tǒng)裝入時(shí)

SERVICE_SYSTEM_START (0×01) 操作系統(tǒng)初始化時(shí)

SERVICE_AUTO_START (0×02) 服務(wù)控制管理器啟動(dòng)時(shí)

SERVICE_DEMAND_START (0×03) 服務(wù)控制管理器手工啟動(dòng)

SERVICE_DISABLED (0×04) 不啟動(dòng)

Type含義如下:

SERVICE_KERNEL_DRIVER (0×1)

SERVICE_FILE_SYSTEM_DRIVER (0×2)

SERVICE_ADAPTER (0×4)

系統(tǒng)注冊(cè)表中用于設(shè)備驅(qū)動(dòng)程序加載后讀取的項(xiàng)目如下:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDriverNameParameters]

″Parameter1″ = dword∶00000001

″Parameter2″ = dword∶00000004

3.2 加載驅(qū)動(dòng)程序的裝入例程

I/O管理器調(diào)用驅(qū)動(dòng)程序的DriverEntry例程,執(zhí)行初始化。該例程完成:

· 初始化其它例程的入口;

· 創(chuàng)建命名設(shè)備對(duì)象;

· 讀取系統(tǒng)注冊(cè)表中相關(guān)項(xiàng)目并聲明必要的資源;

· 設(shè)置內(nèi)核驅(qū)動(dòng)程序名與Win32子系統(tǒng)名的聯(lián)接;

· 創(chuàng)建或初始化任意驅(qū)動(dòng)程序使用的對(duì)象、類(lèi)型和資源;

· 返回狀態(tài)值。

I/O管理器建立與設(shè)備關(guān)聯(lián)的Driver對(duì)象,并將其傳遞給DriverEntry例程。實(shí)際上Driver對(duì)象基本上是一個(gè)目錄,含有指向各個(gè)驅(qū)動(dòng)程序服務(wù)例程函數(shù)的指針,其結(jié)構(gòu)如表1所示。

表1 Driver對(duì)象域說(shuō)明

1.jpg

I/O管理器能夠找到DriverEntry例程,是因?yàn)樗幸粋€(gè)公認(rèn)的名字,而其他的例程則通過(guò)下列兩種方法查找:

·在Driver對(duì)象中有明確槽的函數(shù)如DirverObject->DriverUnload;

·在Driver對(duì)象的MajorFunction數(shù)組中——Driver對(duì)象的MajorFunction支持兩種類(lèi)型的功能代碼。一種為標(biāo)準(zhǔn)的功能代碼,如IRP_MJ_CREATE。另一種是用戶(hù)自定義的功能代碼,如IRP_MJ_DEVICE_CONTROL。

所有驅(qū)動(dòng)程序必須支持IRP_MJ_CREATE功能代碼,這是因?yàn)閃in32子系統(tǒng)下的用戶(hù)程序調(diào)用CreateFile函數(shù)創(chuàng)建設(shè)備時(shí),產(chǎn)生該功能代碼。如果不處理這個(gè)功能代碼,Win32程序就不能得到設(shè)備句柄。

用戶(hù)自定義的功能代碼IRP_MJ_DEVICE_CONTROL只有在用戶(hù)模式下的客戶(hù)程序執(zhí)行自定義的功能時(shí)可用。

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)

{

//聲明設(shè)備對(duì)象

PDEVICE_OBJECT DeviceObject,

//生成函數(shù)接口指針

DriverObject->MajorFunction[IRP_MJ_CREATE]=XxSelfDispatch;

DriverObject->MajorFunction[IRP_MJ_CLOSE]=

XxSelfDispatch;

DriverObject->MajorFunction[IRP_MJ_READ]=

XxReadDispatch;

DriverObject->MajorFunction[IRP_MJ_WRITE]=

XxWriteDispatch

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=XxSelfDispatch

DriverObject->DriverUnload=XxUnload

//生成Windows NT Executive知道的設(shè)備名

RtlInitUnicodeString(NtDeviceName, SelfDeviceName);

//生成自己的設(shè)備

Status=IoCreateDevice(

DriverObject, // Driver對(duì)象

sizeof(SELF_DEVICE_INFO), // Device對(duì)象

Extension結(jié)構(gòu)大小

NtDeviceName,

DeviceType,

0,

FALSE, // 不執(zhí)行

DeviceObject //Device對(duì)象指針

);

//生成Win32子系統(tǒng)下的用戶(hù)程序可識(shí)別的設(shè)備名


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評(píng)論


相關(guān)推薦

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

關(guān)閉