-
有兩種方式可以讓設(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)用進程有效。驅(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)用進程有效。這里是一個用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
-
三種方法讀取鍵值 使用者設(shè)計行列鍵盤介面,一般常採用三種方法讀取鍵值。 中斷式 在鍵盤按下時產(chǎn)生一個外部中斷通知CPU,並由中斷處理程式通過不同位址讀資料線上的狀態(tài)判斷哪個按鍵被按下。 本實驗採用中斷式實現(xiàn)使用者鍵盤介面。 掃描法 對鍵盤上的某一行送低電位,其他為高電位,然後讀取列值,若列值中有一位是低,表明該行與低電位對應(yīng)列的鍵被按下。否則掃描下一行。 反轉(zhuǎn)法 先將所有行掃描線輸出低電位,讀列值,若列值有一位是低表明有鍵按下;接著所有列掃描線輸出低電位,再讀行值。 根據(jù)讀到的值組合就可以查表得到鍵碼。4x4鍵盤按4行4列組成如圖電路結(jié)構(gòu)。按鍵按下將會使行列連成通路,這也是見的使用者鍵盤設(shè)計電路。
//-----------4X4鍵盤程序--------------// uchar keboard(void) { uchar xxa,yyb,i,key; if((PINC&0x0f)!=0x0f) //是否有按鍵按下 {delayms(1); //延時去抖動 if((PINC&0x0f)!=0x0f) //有按下則判斷 { xxa=~(PINC|0xf0); //0000xxxx DDRC=0x0f; PORTC=0xf0; delay_1ms(); yyb=~(PINC|0x0f); //xxxx0000 DDRC=0xf0; //復(fù)位 PORTC=0x0f; while((PINC&0x0f)!=0x0f) //按鍵是否放開 { display(data); } i=4; //計算返回碼 while(xxa!=0) { xxa=xxa>>1; i--; } if(yyb==0x80) key=i; else if(yyb==0x40) key=4+i; else if(yyb==0x20) key=8+i; else if(yyb==0x10) key=12+i; return key; //返回按下的鍵盤碼 } } else return 17; //沒有按鍵按下 }
標(biāo)簽:
4x4
鍵盤
上傳時間:
2013-11-12
上傳用戶:a673761058
-
CPU在處理某一事件時,發(fā)生了另一事件請求CPU迅速去處理。CPU暫時中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B。待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A。這一處理過程稱為中斷。介紹用匯編和C語言兩語言的源程序,愿給大家?guī)韼椭?前面我已經(jīng)上傳了幾個程序,沒幾天卻失蹤了。但這次的不會失蹤,能保留上幾天。
標(biāo)簽:
匯編語言
C語言
外部中斷
上傳時間:
2014-12-31
上傳用戶:dianxin61
-
附件是一款PCB阻抗匹配計算工具,點擊CITS25.exe直接打開使用,無需安裝。附件還帶有PCB連板的一些計算方法,連板的排法和PCB聯(lián)板的設(shè)計驗驗。
PCB設(shè)計的經(jīng)驗建議:
1.一般連板長寬比率為1:1~2.5:1,同時注意For FuJi Machine:a.最大進板尺寸為:450*350mm,
2.針對有金手指的部分,板邊處需作掏空處理,建議不作為連板的部位.
3.連板方向以同一方向為優(yōu)先,考量對稱防呆,特殊情況另作處理.
4.連板掏空長度超過板長度的1/2時,需加補強邊.
5.陰陽板的設(shè)計需作特殊考量.
6.工藝邊需根據(jù)實際需要作設(shè)計調(diào)整,軌道邊一般不少於6mm,實際中需考量板邊零件的排布,軌道設(shè)備正常卡壓距離為不少於3mm,及符合實際要求下的連板經(jīng)濟性.
7.FIDUCIAL MARK或稱光學(xué)定位點,一般設(shè)計在對角處,為2個或4個,同時MARK點面需平整,無氧化,脫落現(xiàn)象;定位孔設(shè)計在板邊,為對稱設(shè)計,一般為4個,直徑為3mm,公差為±0.01inch.
8.V-cut深度需根據(jù)連板大小及基板板厚考量,角度建議為不少於45°.
9.連板設(shè)計的同時,需基於基板的分板方式考量<人工(治具)還是使用分板設(shè)備>.
10.使用針孔(郵票孔)聯(lián)接:需請考慮斷裂后的毛刺,及是否影響COB工序的Bonding機上的夾具穩(wěn)定工作,還應(yīng)考慮是否有無影響插件過軌道,及是否影響裝配組裝.
標(biāo)簽:
PCB
阻抗匹配
計算工具
教程
上傳時間:
2014-12-31
上傳用戶:sunshine1402
-
附件是一款PCB阻抗匹配計算工具,點擊CITS25.exe直接打開使用,無需安裝。附件還帶有PCB連板的一些計算方法,連板的排法和PCB聯(lián)板的設(shè)計驗驗。
PCB設(shè)計的經(jīng)驗建議:
1.一般連板長寬比率為1:1~2.5:1,同時注意For FuJi Machine:a.最大進板尺寸為:450*350mm,
2.針對有金手指的部分,板邊處需作掏空處理,建議不作為連板的部位.
3.連板方向以同一方向為優(yōu)先,考量對稱防呆,特殊情況另作處理.
4.連板掏空長度超過板長度的1/2時,需加補強邊.
5.陰陽板的設(shè)計需作特殊考量.
6.工藝邊需根據(jù)實際需要作設(shè)計調(diào)整,軌道邊一般不少於6mm,實際中需考量板邊零件的排布,軌道設(shè)備正常卡壓距離為不少於3mm,及符合實際要求下的連板經(jīng)濟性.
7.FIDUCIAL MARK或稱光學(xué)定位點,一般設(shè)計在對角處,為2個或4個,同時MARK點面需平整,無氧化,脫落現(xiàn)象;定位孔設(shè)計在板邊,為對稱設(shè)計,一般為4個,直徑為3mm,公差為±0.01inch.
8.V-cut深度需根據(jù)連板大小及基板板厚考量,角度建議為不少於45°.
9.連板設(shè)計的同時,需基於基板的分板方式考量<人工(治具)還是使用分板設(shè)備>.
10.使用針孔(郵票孔)聯(lián)接:需請考慮斷裂后的毛刺,及是否影響COB工序的Bonding機上的夾具穩(wěn)定工作,還應(yīng)考慮是否有無影響插件過軌道,及是否影響裝配組裝.
標(biāo)簽:
PCB
阻抗匹配
計算工具
教程
上傳時間:
2013-10-15
上傳用戶:3294322651
-
一、PAC的概念及軟邏輯技術(shù)二、開放型PAC系統(tǒng)三、應(yīng)用案例及分析四、協(xié)議支持及系統(tǒng)架構(gòu)五、軟件編程技巧&組態(tài)軟件的整合六、現(xiàn)場演示&上機操作。PAC是由ARC咨詢集團的高級研究員Craig Resnick提出的,定義如下:具有多重領(lǐng)域的功能,支持在單一平臺里包含邏輯、運動、驅(qū)動和過程控制等至少兩種以上的功能單一開發(fā)平臺上整合多規(guī)程的軟件功能如HMI及軟邏輯, 使用通用標(biāo)簽和單一的數(shù)據(jù)庫來訪問所有的參數(shù)和功能。軟件工具所設(shè)計出的處理流程能跨越多臺機器和過程控制處理單元, 實現(xiàn)包含運動控制及過程控制的處理程序。開放式, 模塊化構(gòu)架, 能涵蓋工業(yè)應(yīng)用中從工廠的機器設(shè)備到過程控制的操作單元的需求。采用公認(rèn)的網(wǎng)絡(luò)接口標(biāo)準(zhǔn)及語言,允許不同供應(yīng)商之設(shè)備能在網(wǎng)絡(luò)上交換資料。
標(biāo)簽:
PAC
開放式
系統(tǒng)設(shè)計
上傳時間:
2014-01-14
上傳用戶:JGR2013
-
當(dāng)一個VI A.vi在VI B.vi 中使用,就稱A.vi為B.vi的子VI,B.vi為A.vi的主VI。子VI 相當(dāng)于文本編程語言中的子程序。 在主VI的程序框圖中雙擊子VI的圖標(biāo)時,將出現(xiàn)該子VI 的前面板和程序框圖。在前面板窗口和程序框圖窗口的右上角可以看到該VI 的圖標(biāo)。該圖標(biāo)與將VI放置在程序框圖中時所顯示的圖標(biāo)相同。
標(biāo)簽:
上傳時間:
2013-10-31
上傳用戶:jisujeke
-
RSA算法 :首先, 找出三個數(shù), p, q, r, 其中 p, q 是兩個相異的質(zhì)數(shù), r 是與 (p-1)(q-1) 互質(zhì)的數(shù)...... p, q, r 這三個數(shù)便是 person_key,接著, 找出 m, 使得 r^m == 1 mod (p-1)(q-1)..... 這個 m 一定存在, 因為 r 與 (p-1)(q-1) 互質(zhì), 用輾轉(zhuǎn)相除法就可以得到了..... 再來, 計算 n = pq....... m, n 這兩個數(shù)便是 public_key ,編碼過程是, 若資料為 a, 將其看成是一個大整數(shù), 假設(shè) a < n.... 如果 a >= n 的話, 就將 a 表成 s 進位 (s
標(biāo)簽:
person_key
RSA
算法
上傳時間:
2013-12-14
上傳用戶:zhuyibin
-
C++完美演繹 經(jīng)典算法 如 /* 頭文件:my_Include.h */ #include <stdio.h> /* 展開C語言的內(nèi)建函數(shù)指令 */ #define PI 3.1415926 /* 宏常量,在稍后章節(jié)再詳解 */ #define circle(radius) (PI*radius*radius) /* 宏函數(shù),圓的面積 */ /* 將比較數(shù)值大小的函數(shù)寫在自編include文件內(nèi) */ int show_big_or_small (int a,int b,int c) { int tmp if (a>b) { tmp = a a = b b = tmp } if (b>c) { tmp = b b = c c = tmp } if (a>b) { tmp = a a = b b = tmp } printf("由小至大排序之后的結(jié)果:%d %d %d\n", a, b, c) } 程序執(zhí)行結(jié)果: 由小至大排序之后的結(jié)果:1 2 3 可將內(nèi)建函數(shù)的include文件展開在自編的include文件中 圓圈的面積是=201.0619264
標(biāo)簽:
my_Include
include
define
3.141
上傳時間:
2014-01-17
上傳用戶:epson850
-
一元稀疏多項式計算器[加法和乘法] 問題描述: 設(shè)計一元系數(shù)多項式計數(shù)器實現(xiàn)兩個多項式間的加法、減法。 基本要求: (1) 輸入并建立多項式 (2) 輸出多項式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2……cn,en,其中n是多項式的項數(shù),ci,ei分別為第i項的系數(shù)和指數(shù)。序列按指數(shù)降序排列。 (3) 多項式a和b相加,建立多項式a+b,輸出相加的多項式。 (4) 多項式a和b相減,建立多項式a-b,輸出相減的多項式。 用帶表頭結(jié)點的單鏈表存儲多項式。 測試數(shù)據(jù): (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3) (x+x2+x3)+0 (4) (x+x3)-(-x-x-3)
標(biāo)簽:
多項式
加法
稀疏
乘法
上傳時間:
2013-12-03
上傳用戶:561596