在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>單片機>驅動程序與應用程序的接口

驅動程序與應用程序的接口

2009-03-25 | rar | 444 | 次下載 | 5積分

資料介紹

有兩種方式可以讓設備和應用程序之間聯系:
1.?通過為設備創建的一個符號鏈;
2.?通過輸出到一個接口
WDM驅動程序建議使用輸出到一個接口而不推薦使用創建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創建一個惟一的、獨立于語言的訪問設備的方法。
一個應用程序使用Win32APIs來調用設備。在某個Win32 APIs和設備對象的分發函數之間存在一個映射關系。
獲得對設備對象訪問的第一步就是打開一個設備對象的句柄。

用符號鏈打開一個設備的句柄
為了打開一個設備,應用程序需要使用CreateFile。如果該設備有一個符號鏈出口,應用程序可以用下面這個例子的形式打開句柄:
hDevice = CreateFile("\\\\.\\OMNIPORT3",
? GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,
? NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL
);
文件路徑名的前綴“\\.\”告訴系統本調用希望打開一個設備。這個設備必須有一個符號鏈,以便應用程序能夠打開它。有關細節查看有關Kdevice和CreateLink的內容。在上述調用中第一個參數中前綴后的部分就是這個符號鏈的名字。
注意:CreatFile中的第一個參數不是Windows 98/2000中驅動程序(.sys文件)的路徑。是到設備對象的符號鏈。
如果使用DriverWizard產生驅動程序,它通常使用類KunitizedName來構成設備的符號鏈。這意味著符號鏈名有一個附加的數字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。
如果應用程序需要被覆蓋的I/O,第六個參數(Flags)必須或上FILE_FLAG_OVERLAPPED。

使用一個輸出接口打開句柄
用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。
CdeviceInterfaceClass類封裝了一個設備信息集,該信息集包含了特殊類中的所有設備接口信息。
應用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設備接口的抽象。它的成員函數DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設備。
下面用一個小例子來顯示這些類最基本的使用方法:
extern GUID TestGuid;
HANDLE OpenByInterface(
? GUID* pClassGuid,
? DWORD instance,
? PDWORD pError
)
{
? CDeviceInterfaceClass DevClass(pClassGuid, pError);
? if (*pError != ERROR_SUCCESS)
??? return INVALID_HANDLE_VALUE;
? CDeviceInterface DevInterface(&DevClass, instance, pError);
? if (*pError != ERROR_SUCCESS)
??? return INVALID_HANDLE_VALUE;
? cout << "The device path is "
??? << DevInterface.DevicePath()
??? << endl;

? HANDLE hDev;
? hDev = CreateFile(
?? DevInterface.DevicePath(),
??? GENERIC_READ | GENERIC_WRITE,
??? FILE_SHARE_READ | FILE_SHARE_WRITE,
??? NULL,
??? OPEN_EXISTING,
??? FILE_ATTRIBUTE_NORMAL,
??? NULL
? );
? if (hDev == INVALID_HANDLE_VALUE)
??? *pError = GetLastError();
? return hDev;
}

在設備中執行I/O操作
一旦應用程序獲得一個有效的設備句柄,它就能使用Win32 APIs來產生到設備對象的IRPs。下面的表顯示了這種對應關系。
Win32 API ?DRIVER_FUNCTION_xxx
IRP_MJ_xxx ?KDevice subclass member function
CreateFile ?CREATE ?Create
ReadFile ?READ ?Read
WriteFile ?WRITE ?Write
DeviceIoControl ?DEVICE_CONTROL ?DeviceControl
CloseHandle ?CLOSE
CLEANUP ?Close
CleanUp
需要解釋一下設備類成員的Close和CleanUp:CreateFile使內核為設備創建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調用Close。
如果被打開的設備不支持指定的功能,則調用相應的Win32將引起錯誤(無效功能)。
以前為Windows95編寫的VxD的應用程序代碼中可能會在打開設備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權的用戶企圖打開這個設備,這是不可能成功的。
I/O管理器將ReadFile和WriteFile的buff參數轉換成IRP域的方法依賴于設備對象的屬性。當設備設置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創建了一個存儲在IRP中的MDL域。一個設備可以通過調用Kirp::Mdl來存取MDL。
當設備設置DO_BUFFERED_IO標志,設備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或寫操作獲得buff地址。
當設備不設置DO_BUFFERED_IO標志也不設置DO_DIRECT_IO,內核設置IRP 的UserBuffer域來對應ReadFile或WriteFile中的buff參數。然而,存儲區并沒有被鎖住而且地址只對調用進程有效。驅動程序可以使用KIrp::UserBuffer來存取IRP域。
對于DeviceIoControl調用,buffer參數的轉換依賴于特殊的I/O控制代碼,它不在設備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構造控制代碼。這個宏的其中一個參數指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數:
Method ?Input Buffer Parameter ?Output Buffer Parameter
METHOD_BUFFERED ?KIrp::IoctlBuffer
KIrp::IoctlBuffer

METHOD_IN_DIRECT ?KIrp::IoctlBuffer
KIrp::Mdl

METHOD_OUT_DIRECT ?KIrp::IoctlBuffer
KIrp::Mdl

METHOD_NEITHER ?KIrp::IoctlType3InputBuffer
KIrp::UserBuffer

如果控制代碼指明METHOD_BUFFERED,系統分配一個單一的緩沖來作為輸入與輸出。驅動程序必須在向輸出緩沖放數據之前拷貝輸入數據。驅動程序通過調用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統緩沖拷貝數據到提供給Ring 3級調用者使用的緩沖中。驅動程序必須在結束前存儲拷貝到IRP的Information成員中的數據個數。
如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數呈現不同的含義。參數InputBuffer被拷貝到一個系統緩沖,這個緩沖驅動程序可以通過調用KIrp::IoctlBuffer。參數OutputBuffer被映射到KMemory對象,驅動程序對這個對象的訪問通過調用KIrp::Mdl來實現。對于METHOD_OUT_DIRECT,調用者必須有對緩沖的寫訪問權限。
注意,對METHOD_NEITHER,內核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調用進程有效。
這里是一個用METHOD_BUFFERED的例子:
首先,使用宏CTL_CODE來定義一個IOCTL代碼:
#define IOCTL_MYDEV_GET_FIRMWARE_REV \
CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
現在使用一個DeviceIoControl調用:
BOOLEAN b;
CHAR FirmwareRev[60];
ULONG FirmwareRevSize;
b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING,
? NULL, // no input? 注意,這里放的是包含有執行操作命令的字符串指針
? 0,
FirmwareRev,????? //這里是output串指針,存放從驅動程序中返回的字符串。
sizeof(FirmwareRev),& FirmwareRevSize,
? NULL // not overlapped I/O
?);
如果輸出緩沖足夠大,設備拷貝串到里面并將拷貝的資結束設置到FirmwareRevSize中。
在驅動程序中,代碼看起來如下所示:
const char* FIRMWARE_REV = "FW 16.33 v5";
NTSTATUS MyDevice::DeviceControl( KIrp I )
{
? ULONG fwLength=0;
? switch ( I.IoctlCode() )
? {
??? case IOCTL_MYDEV_GET_FIRMWARE_REV:
????? fwLength = strlen(FIRMWARE_REV)+1;
????? if (I.IoctlOutputBufferSize() >= fwLength)
????? {
??????? strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV);
??????? I.Information() = fwLength;?
??????? return I.Complete(STATUS_SUCCESS);
????? }
????? else
????? {
???????
????? }
??? case . . .
?? }
?}

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 651單片機窗簾控制器仿真程序
  12. 1.93 MB  |  2次下載  |  免費
  13. 751單片機大棚環境控制器仿真程序
  14. 1.10 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 午夜黄大色黄大片美女图片 | 精品爱爱| 国产精品久久久久久久久久免费 | 国产三级日产三级日本三级 | 加勒比啪啪 | www.av毛片| 一久久 | 五月情视频在线观看 | 亚洲高清美女一区二区三区 | 久久天天躁夜夜躁狠狠躁2015 | 五月婷花| 亚洲精品久久久久午夜三 | 97福利影院| 18满xo影院视频免费体验区 | 四虎在线成人免费网站 | 天堂网中文字幕 | 大尺度免费高清在线观看视频 | 正在播放91大神调教偷偷 | 老师您的兔子好软水好多动漫视频 | 日本媚薬痉挛在线观看免费 | xxxxxx日本人免费 | 欧美性喷潮xxxx | 免费国产黄网站在线观看视频 | 久久婷婷丁香七月色综合 | 亚洲成人在线免费观看 | 久久精品国产夜色 | 欧美久久天天综合香蕉伊 | 精品国产一区二区三区成人 | 免费观看影院 | 国产免费高清在线精品一区 | 天天干天天色综合网 | 久久99精品国产麻豆宅宅 | 色视频2 | 丁香婷婷亚洲 | 四虎成人精品在永久在线观看 | 国产精品莉莉欧美自在线线 | 国产一级特黄高清在线大片 | 日本高清色视频在线观看免费 | 日本最色视频 | 男人天堂资源网 | 国模私拍在线视频 |