有兩種方式可以讓設備和應用程序之間聯系: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_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設備類成員的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 . . . } }
上傳時間: 2013-10-17
上傳用戶:gai928943
介紹了以PLC為控制單元,變頻器為執行單元的控制系統及其在煙支輸送儲存系統中的應用,并給出了系統的組成、硬件的配置及具體的實現方法。關鍵詞 : PLC 變頻器輸送儲存系統 Ab str ac t;T hisp aperi ntroducest hec ontrols ystem whichc onsistso fP LCa ndf requencyc onvertera ndi ts application in the buffer conveyor for cigarettes. The system constitute, hardware disposal and realization method are also presented in detail.Keywords:PLC f requencyc onverter b ufferc onveyor
上傳時間: 2013-10-22
上傳用戶:ouyang426
4.asm…… 響鈴程序,輸入一個數字字符N,響鈴N次。(完成)ysk3.asm ……顯示一個星型倒三角。m1.asm ………編程將鍵盤輸入的8位無符號二進制數轉化為十六進制數和十進制數,并輸出結果form.asm ……采用子程序編程按以下三種格式(██,◣,◥)打印九九乘法表:(完成)char.asm ……小寫字母a b c d ……x y z的ASCII碼分別為61H 62H 63H 64H……78H 79H 7AH, 而大寫字母A B C D ….X Y Z的ASCII碼分別為41H 42H 43H 44H …58H 59H 5AH, 使用串處理指令編程從鍵盤輸入16個字符(大小寫字母及其它字母均有), 存入以BUF1開始的一片存儲區中,并將其傳送到以BUF2開始的一片存儲區中, 在傳送是將其中的小寫字母均改為大寫字母,并將第一個小寫字母在串中的位置 (距串頭BUF1的相對位移量)以十六進制形式輸出。(完成)
上傳時間: 2013-12-22
上傳用戶:zhyiroy
大整數乘法例子代碼 /* 遞歸邊界,如果是1位二進制數與1位二進制數相乘,則可以直接計算 */ /*累計做1位二進制乘法運算的次數*/ /* return (X*Y) */ /* 計算n的值 */ /* 把X和Y拆分開來,令X=A*2^(n/2)+B, 左移位運算,mod = 1<<(n/2) */ /* 計算XY=AC*2^n+(AD+CB)*2^(n/2)+BD */ /* 計算A*C,再向左移n位 */ /* 遞歸計算A*D */ /* 遞歸計算C*B */ /* 計算a21+a22,再向左移n/2位 */ /* 遞歸計算B*D */ /* XY=a1+a2+a3 */
上傳時間: 2015-05-19
上傳用戶:gyq
. 緩存處理技術,定時更新系統數據,提升系統性能 B. 系統模板管理功能,方便制作個性化的系統模板,可后臺管理 C. 首頁商品和店鋪的自助推薦功能,用戶可使用虛擬幣采用競價方式自助推薦自己的商品和店鋪 D. 店鋪的皮膚轉換,重新設計店鋪結構 E. 商品,店鋪,求購信息的搜索,采用積木式查詢,減少等待時間 F. 支付寶按鈕支付功能(用于系統用戶與用戶間的付款交易) G. 重新制作廣告系統,靜態JS讀取速度更快 H. 最高價競拍模式中加入一口價購買的功能 I. 后臺管理員的分權限管理(管理,添加,查看) j. 后臺商品首頁推薦,店鋪首頁推薦功能 K. 商品可實現四級分類處理 L. 增加店鋪分類功能 M. 外接用戶數據庫(AC和SQL兩種),系統郵件發送,圖片上傳,緩存更新,MD5加密等后臺管理功能 N. 實現了商品登陸收費的功能
上傳時間: 2015-06-24
上傳用戶:我干你啊
三相步進電機的三相六拍工作方式,正轉的繞組通電順序:A、AB、B、BC、C、CA、A,反轉的通電順序:A、AC、C、CB、B、BA、B、A。 由于步進電機轉子有一定的慣性以及所帶負載的慣性,故步進電機的工作過程中不能及時的啟動和停止,在啟動時應慢慢的加速到預定速度,在停止前應逐漸減速到停止,否則,將產生失步現象。 步進電機的控制問題可總結為兩點: 1、產生工作方式需要的時序脈沖; 2、控制步進電機的速度,使它始終遵循加速、勻速、減速的規律工作。
上傳時間: 2015-12-01
上傳用戶:685
【實驗名稱】遞歸子程序分析器的設計與實現 【實驗目的和要求】 設計、編制,調試一個典型的語法分析程序,實現對如下的遞歸子程序語法的分析,進一步掌握常用的語法分析方法。 【實驗內容】 ① 本分析程序所分析的文法如下: G[E]: E->eBaA A->a|bAcB B->dEd|aC C->e|dC ② 針對上述文法編寫一遞歸子程序分析程序,該程序的輸入是任意符號串,輸出是本次輸入的符號串是否是該文法的句子的結論。 【環境】 Windows Pc 機,任何版本的c語言 其中還包括java語言實現的程序
上傳時間: 2013-12-25
上傳用戶:lanhuaying
51單片連tcs230的源程序,絕對原創,可以記憶顏色。 #define uchar unsigned char #include <reg52.h> #include<math.h> sbit S0=P1^7 sbit S1=P1^0 //端口定義 sbit S2=P1^1 sbit S3=P1^2 sbit OE=P1^3 sbit OUT=P3^4 //頻率從TO口輸入 sbit key0=P1^5 sbit LED=P1^6 sbit a=P3^0 sbit b=P3^1 uchar color //1:blue 2:green 3:red uchar T[4] //color timer uchar TH[4] uchar TL[4] uchar bizhi[4] void time1() interrupt 3 { TH[color]=TH0 TL[color]=TL0 T[color]=(TH[color]*0xff+TL[color]) TR0=0 //關定時器 TR1=0 TH1=0xB1 TL1=0xE0 //歸0 TH0=0x00 TL0=0x00 //歸0 }
上傳時間: 2016-11-26
上傳用戶:秦莞爾w
sbit CS = P1^0 sbit SCK = P1^6 sbit SIN = P1^7 sbit SOUT = P1^5 sbit WP = P1^1 void XReady(void) void XSendByte(unsigned char b) unsigned char XGetByte(void) void XWriteEn(void) void XWriteDis(void) unsigned char XReadStatus(void) void XWipPoll(void) void XWriteStatus(unsigned char b) void XReadData(unsigned char *m,unsigned char x,unsigned char n) void XWriteData(unsigned char *m,unsigned char x,unsigned char n) #define XResetDog() {CS=0 CS=1 } void InitX5045(void)
上傳時間: 2014-01-17
上傳用戶:lijinchuan
KMP字符串匹配的c實現,測試字符串為char a[20]="abcdefghijk" char b[20]="abcdefgg" 取各位數字的算法,最大有效測試數據長整形最N=100000000 貪婪算法:已知若干面值的人名幣,如何找零錢,使張數最小,測試面值a[4]={25,10,5,1} 快速排序C++實現
上傳時間: 2013-12-27
上傳用戶:z1191176801