采用NUMEGA Software 公司出品的vxd(virtual device driver)開發(fā)軟件包VtoolsD,開發(fā)出了DMA 方式下的PCL_818L 數(shù)據(jù)采集卡虛擬設(shè)備驅(qū)
上傳時間: 2013-04-24
上傳用戶:s363994250
有兩種方式可以讓設(shè)備和應(yīng)用程序之間聯(lián)系:1. 通過為設(shè)備創(chuàng)建的一個符號鏈;2. 通過輸出到一個接口WDM驅(qū)動程序建議使用輸出到一個接口而不推薦使用創(chuàng)建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創(chuàng)建一個惟一的、獨立于語言的訪問設(shè)備的方法。一個應(yīng)用程序使用Win32APIs來調(diào)用設(shè)備。在某個Win32 APIs和設(shè)備對象的分發(fā)函數(shù)之間存在一個映射關(guān)系。獲得對設(shè)備對象訪問的第一步就是打開一個設(shè)備對象的句柄。 用符號鏈打開一個設(shè)備的句柄為了打開一個設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個符號鏈出口,應(yīng)用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調(diào)用希望打開一個設(shè)備。這個設(shè)備必須有一個符號鏈,以便應(yīng)用程序能夠打開它。有關(guān)細(xì)節(jié)查看有關(guān)Kdevice和CreateLink的內(nèi)容。在上述調(diào)用中第一個參數(shù)中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數(shù)不是Windows 98/2000中驅(qū)動程序(.sys文件)的路徑。是到設(shè)備對象的符號鏈。如果使用DriverWizard產(chǎn)生驅(qū)動程序,它通常使用類KunitizedName來構(gòu)成設(shè)備的符號鏈。這意味著符號鏈名有一個附加的數(shù)字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應(yīng)用程序需要被覆蓋的I/O,第六個參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設(shè)備信息集,該信息集包含了特殊類中的所有設(shè)備接口信息。應(yīng)用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設(shè)備。下面用一個小例子來顯示這些類最基本的使用方法: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;} 在設(shè)備中執(zhí)行I/O操作一旦應(yīng)用程序獲得一個有效的設(shè)備句柄,它就能使用Win32 APIs來產(chǎn)生到設(shè)備對象的IRPs。下面的表顯示了這種對應(yīng)關(guān)系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設(shè)備類成員的Close和CleanUp:CreateFile使內(nèi)核為設(shè)備創(chuàng)建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當(dāng)這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調(diào)用CleanUp。當(dāng)沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調(diào)用Close。如果被打開的設(shè)備不支持指定的功能,則調(diào)用相應(yīng)的Win32將引起錯誤(無效功能)。以前為Windows95編寫的vxd的應(yīng)用程序代碼中可能會在打開設(shè)備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導(dǎo)致沒有特權(quán)的用戶企圖打開這個設(shè)備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉(zhuǎn)換成IRP域的方法依賴于設(shè)備對象的屬性。當(dāng)設(shè)備設(shè)置DO_DIRECT_IO標(biāo)志,I/O管理器將buff鎖住在存儲器中,并且創(chuàng)建了一個存儲在IRP中的MDL域。一個設(shè)備可以通過調(diào)用Kirp::Mdl來存取MDL。當(dāng)設(shè)備設(shè)置DO_BUFFERED_IO標(biāo)志,設(shè)備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或?qū)懖僮鳙@得buff地址。當(dāng)設(shè)備不設(shè)置DO_BUFFERED_IO標(biāo)志也不設(shè)置DO_DIRECT_IO,內(nèi)核設(shè)置IRP 的UserBuffer域來對應(yīng)ReadFile或WriteFile中的buff參數(shù)。然而,存儲區(qū)并沒有被鎖住而且地址只對調(diào)用進(jìn)程有效。驅(qū)動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調(diào)用,buffer參數(shù)的轉(zhuǎn)換依賴于特殊的I/O控制代碼,它不在設(shè)備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構(gòu)造控制代碼。這個宏的其中一個參數(shù)指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應(yīng)的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數(shù):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,系統(tǒng)分配一個單一的緩沖來作為輸入與輸出。驅(qū)動程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅(qū)動程序通過調(diào)用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統(tǒng)緩沖拷貝數(shù)據(jù)到提供給Ring 3級調(diào)用者使用的緩沖中。驅(qū)動程序必須在結(jié)束前存儲拷貝到IRP的Information成員中的數(shù)據(jù)個數(shù)。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數(shù)呈現(xiàn)不同的含義。參數(shù)InputBuffer被拷貝到一個系統(tǒng)緩沖,這個緩沖驅(qū)動程序可以通過調(diào)用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對象,驅(qū)動程序?qū)@個對象的訪問通過調(diào)用KIrp::Mdl來實現(xiàn)。對于METHOD_OUT_DIRECT,調(diào)用者必須有對緩沖的寫訪問權(quán)限。注意,對METHOD_NEITHER,內(nèi)核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調(diào)用進(jìn)程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現(xiàn)在使用一個DeviceIoControl調(diào)用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執(zhí)行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅(qū)動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設(shè)備拷貝串到里面并將拷貝的資結(jié)束設(shè)置到FirmwareRevSize中。在驅(qū)動程序中,代碼看起來如下所示: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 . . . } }
標(biāo)簽: 驅(qū)動程序 應(yīng)用程序 接口
上傳時間: 2013-10-17
上傳用戶:gai928943
Port1.0 使用說明 Port1.0是作者本人在進(jìn)行電子制作和維修過程中萌發(fā)的一個思路。在電子制作、維修中,經(jīng)常要用到多路的脈沖信號或是要測量多路的脈沖信號。本軟件可通過微機并口向用戶提供多達(dá)12路的標(biāo)準(zhǔn)TTL脈沖信號,同時可進(jìn)行5路的標(biāo)準(zhǔn)TTL脈沖信號的波形顯示。 軟件的使用方法極為簡單。輸出信號時,只要選中或取消引腳號,就能在相應(yīng)的引腳得到相應(yīng)的脈沖信號(統(tǒng)一為選中為高電平,取消為低電平),“清零”按鈕為對應(yīng)該組的所有信號清零。 輸入信號的波形顯示,按“開始”按鈕為開始進(jìn)行顯示,“停止”為暫停。 在設(shè)置面板中,“數(shù)據(jù)讀入時間間隔”為讀入時間的設(shè)定。“并行打印端口設(shè)置”為顯示微機中存在的可用打印端口,并可以設(shè)定本軟件當(dāng)前要使用的端口(如只有一個可用端口,就為缺省端口,如有多個可用端口軟件自動選擇最后一個可用端口為當(dāng)前使用端口)。 本軟件的輸入波形顯示沒有運用vxd等的技術(shù)支持,在速度上不能做到高頻的實時性,只能用在低速的環(huán)境下。這個版本沒有提供多數(shù)據(jù)的連續(xù)輸出。這些問題在下一個版本中得到改進(jìn)和支持。 本軟件可使用在微機的打印適配器、打印機等各種的并口設(shè)備檢修中,還可用在各種數(shù)字電路、單片機的制作和維修中。在下一版本在這方面會有更大的支持。 * 注意:只支持win9x * 注意:并口的輸入/輸出電平為0-5伏TTL,不能連接高電壓高電流的電路,以免塤壞主板或打印適配器。要連接COMS的0-12伏時請用戶自做轉(zhuǎn)換電路再連接。 * 注意:在使用本軟件時最好不要同時使用打印機之類的并口設(shè)備。如本程序已運行請先關(guān)閉,再使用并口設(shè)備。
上傳時間: 2014-04-18
上傳用戶:paladin
磁盤格式化是計算機用戶經(jīng)常使用的操作之一,但是對于如何編程實現(xiàn)磁盤格式化,很多人卻不清楚。很多人認(rèn)為磁盤格式化應(yīng)該需要編寫負(fù)載的vxd或者WDM驅(qū)動程序來直接對硬件進(jìn)行操作。世界上完全可以通過調(diào)用一個簡單的Shell函數(shù)來實現(xiàn)這一功能。
上傳時間: 2013-12-31
上傳用戶:mpquest
計算機接口技術(shù)系列 Visual C++串口通信技術(shù)與工程實踐 在編譯本章程序后,請將winio.dll、winio.vxd和winio.sys文件復(fù)制到可執(zhí)行文件所在目錄下, 否則WinIo庫初始化函數(shù)initializeWinIO調(diào)用將會失敗。
標(biāo)簽: Visual 計算機 接口技術(shù) 串口
上傳時間: 2013-12-15
上傳用戶:wlcaption
Win32匯編編程系列 本幫助文件由yyc個人整理后出版,內(nèi)容全摘自網(wǎng)絡(luò)。版權(quán)歸實際作者所有。 為了讓網(wǎng)友們能更好的學(xué)習(xí)Win32匯編編程,于是我為大家將網(wǎng)上的資料整理成一個幫助文件。 本幫助文件包括:Iczelion的Win32匯編教程、Iczelion 的 ODBC 教程、Iczelion 的 vxd 教程共三部分
上傳時間: 2015-03-09
上傳用戶:qb1993225
-有 沒 有 簡 單 一 些 的 辦 法 呢 ? 我 們 可 以 令 一 個 普 通Win32 應(yīng) 用 程 序 運 行 在Ring0 下, 從 而 獲 得vxd 的 能 力 嗎 ? 答 案 是 肯 定 的,請看本文
上傳時間: 2013-12-30
上傳用戶:我干你啊
匯編超全資料,學(xué)匯編的不要錯過 Iczelion的Win32匯編教程、Iczelion 的 ODBC 教程、Iczelion 的 vxd 教程共三部分
標(biāo)簽: 匯編
上傳時間: 2014-01-20
上傳用戶:離殤
非常好的驅(qū)動開發(fā)學(xué)習(xí)書籍,是學(xué)習(xí)驅(qū)動開發(fā)的好資料Windows.設(shè)備驅(qū)動程序(vxd與WDM)開發(fā)實務(wù)
標(biāo)簽: 驅(qū)動開發(fā) 書籍
上傳時間: 2014-01-18
上傳用戶:王者A
WDM驅(qū)動程序設(shè)計 一.WDM簡介 微軟不斷推出新的操作系統(tǒng),現(xiàn)在Windows98和Windows2000已經(jīng)成了主流,原先用來實現(xiàn)驅(qū)動程序的vxd技術(shù)隨著Win95的淡出也慢慢地將退出歷史舞臺,在Windows98和Windows2000中設(shè)備驅(qū)動程序?qū)⒏鶕?jù)Windows驅(qū)動程序模型(WDM)來設(shè)計。WDM通過提供一種靈活的方式來簡化驅(qū)動程序的開發(fā),在實現(xiàn)對新硬件支持的基礎(chǔ)上減少并降低所必須開發(fā)的驅(qū)動程序的數(shù)量和復(fù)雜性。
標(biāo)簽: WDM 驅(qū)動 程序設(shè)計 微軟
上傳時間: 2015-06-29
上傳用戶:253189838
蟲蟲下載站版權(quán)所有 京ICP備2021023401號-1