有兩種方式可以讓設備和應用程序之間聯系: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
附件附帶破解補丁 浩辰CAD 2012專業版破解方法: 按正常安裝浩辰CAD 2012專業版,點擊安裝KeyGen.exe。 浩辰CAD2012,以增強軟件實用性、易用性為主要目標,新增了大量實用功能,改進了著色、消隱的正確性,提升了大幅面光柵圖像處理的性能,同時改進了LISP\VBA二次開發接口的正確性和兼容性。 浩辰CAD 2012根據國內外用戶的需求,增加了大量實用功能,例如動態塊、DWF文件插入、隔離隱藏對象、轉換EXCEL表格、塊屬性管理器、放樣、超級填充等。 浩辰cad2012新增功能: 1、動態塊(bedit) 動態塊具有靈活性和智能性。 用戶在操作時可以輕松地更改圖形中的動態塊參照。 可以通過自定義夾點或自定義特性來操作動態塊參照中的幾何圖形。 a)通過設置圖塊中元素的可見性,一個圖塊中可以包含一種圖形的多種形態,如下圖的汽車模塊就包含跑車、轎車和卡車的各向視圖,只需在可見性列表中選擇一個選項,就可以顯示相應的圖形。 還可對圖塊中的圖形設置參數和動作,可對圖塊的整體或部分圖形進行移動、旋轉、翻轉、縮放、陣列等;并可建立查詢列表,對圖塊進行參數化控制。通過圖塊的動作設置,一個圖塊可以派生出數個圖塊,如下圖所示: 2、DWF參考底圖(dwfattach) 可以將dwf文件插入到當前圖中作為參考底圖,并可以捕捉到底圖的端點、中點,如下圖所示: 3、對象隔離、對象隱藏、取消對象隔離 可將選擇的對象暫時隱藏,也可將選擇對象以外的其他所有對象隱藏。當圖中對象較多,利用此命令可以簡化圖紙,方便后續操作,操作起來比圖層隔離更加簡便、直觀。 4、凍結其它圖層和鎖定其它圖層 浩辰CAD 之前版本提供了圖層隔離的功能,凍結其他圖層和鎖定其它圖層與圖層隔離功能類似,可以通過選擇需要顯示或可編輯對象,將其他圖層進行凍結和鎖定。 5、CAD表格轉EXCEL表格 可以直接選擇CAD中由直線、多段線和單行文字、多行文字組成的表格輸出為EXCEL表格。 6、文字遞增 可以對序號、編號、數值進行遞增復制,間距、數量和增量均可隨心所欲地控制。 7、多段線布爾運算 可直接對封閉的多段線進行差并交計算,無需轉換面域,有時比修剪更簡便。 8、拼寫檢查(spell) 此功能實現對用戶輸入的單詞或文章進行單詞校驗,提示匹配的單詞列表,方便用戶進行正確的單詞填寫工作。可以實現不同語言的單詞校驗工作,包括英文,德文,等8種語言。 可以對全部實體(包括布局,模型中的所有實體)進行校驗。 可以分別對布局或模型中的實體進行校驗。 可以單獨對一個實體或一個選擇集進行校驗。 方便用戶自定義詞典。 兼容的自定義詞典。 支持文字,塊內文字,塊屬性,屬性,標注的校驗。 9、放樣(Loft) 通過對包含兩條或者兩條以上的橫截面曲線的一組曲線進行放樣(繪制實體或曲面)來創建三維實體或曲面。 10、塊屬性管理器(battman) 創建帶屬性的塊后,執行 battman 對塊中屬性定義進行查詢和修改,如果將修改應用到所有塊參照,則對應塊的塊參照中屬性實體也會做對應修改。 11、超級填充(superhatch) 超級填充命令有點像hatch命令,不同的是,可以使用該命令將光柵圖像、塊、外部參照和擦除這些實體作為填充實體對閉合區域進行填充。 12、線上寫字 可以在選擇線上書寫文字,線會被自動打斷,文字會放到線中間。 ◆ 重要功能改進 1、超鏈接 浩辰CAD 2012版的超鏈接不僅修改了以前存在的一些錯誤,而且提供了更為豐富的功能。 a)支持web鏈接的瀏覽和連接的設置。 b)支持打開操作系統可打開的所有文件。 c)支持dwg圖紙的視圖定位。 d)支持超鏈接的復制粘貼。 e)可以通過鼠標光標狀態來判斷是否存在鏈接,方便用戶判斷是否存在鏈接。 f)可以通過ctrl+鼠標點擊打開設置的文件,方便用戶的操作。 g)可以通過右鍵打開塊內實體的鏈接。 2、光柵圖像 浩辰CAD 2012版不僅增加了圖像格式的支持,同時提升了大分辨率光柵圖像的插入、顯示和打印的效果和速度。 a) 增加了對多種圖像格式的支持,諸如:CALS-1(*.cal,*.mil,*.rst,*.cg4)、RLC、GEOSPORT(.bil)、PICT(.pct/.pict)、IG4、Autodesk Animator(.fil/.flc)。 b) 內存使用問題,可以插入多張圖片,內存不會增加。 c) 光柵圖像打印問題(不清晰)。 d) 插入大圖像時,預覽速度大幅提升。 3、二次開發改進 浩辰CAD 2012版針對二次開發商和用戶提出的一些LISP及VBA與AutoCAD存在的兼容性問題進行了系統梳理,兼容性有明顯提升,此外還針對國外二次開發商的需求開發了Lisp調試器。 a) Lisp改進 處理了線程問題、命令范圍值問題、VLX解析問題,對Lisp程序執行速度進行了優化。 b) VBA改進 處理了VBA的文檔管理、接口不全、接口錯誤、類派生關系錯誤問題。 c) Lisp調試器 用戶在使用浩辰CAD時,由于LISP與AutoCAD不完全兼容,用戶需要一個工具進行調試,以協助用戶解決及分析報告LISP問題。此系統以完成調試功能為主,不處理詞法分析前的映射。適用于中級以上開發用戶。
上傳時間: 2013-11-24
上傳用戶:lepoke
在線醫藥銷售管理系統(b/s)
上傳時間: 2013-12-19
上傳用戶:moerwang
使用C#語言開發的遠程監控管理平臺;使用soaphead對webservice進行加密的實例
標簽: webservice soaphead 語言 管理平臺
上傳時間: 2014-01-24
上傳用戶:康郎
用系統調用signal()讓父進程捕捉鍵盤上來的中斷信號(按Ctrl-C鍵);當捕捉到中斷信號后,父進程用系統調用kill()向兩個子進程發出信號,子進程捕捉到信號后分別輸出下列信息后終止: Child Process 1 is Killed by Parent! Child Process 2 is Killed by Parent! 父進程等待兩個子進程終止后,輸出如下的信息后終止: Parent Process is Killed!
上傳時間: 2015-02-27
上傳用戶:ywqaxiwang
企業內部辦公管理信息系統 (一個用ASP開發的基于B/S方式的畢業設計)
上傳時間: 2013-12-13
上傳用戶:ynwbosss
1、本系統采用B/S架構,是學校智能辦公系統的一部分,菜單中的“用戶管理”、“權限管理”、“菜單管理”、“幫助主題”已集成在辦公系統之中,因此本系統不提供這幾項功能。 2、本系統采用集中管理、分工合作的方式,將用戶分為五個級別,每個級別的用戶只能使用相應的功能,因此,能公平、公正、公開地考評各位教師的教學質量。 3、支持多人同時操作和遠程操作,大大縮短數據錄入時間。 安裝和使用注意事項: 1、將壓縮文件解壓到IIS目錄后,運行cjcl目錄下的reg.bat。 2、系統內置五個用戶:系統管理、學校領導、成績錄入、班主任、一般用戶,其中前四個用戶的密碼均為1,而一般用戶在登錄頁面只需點提交,一般用戶只提供查詢功能。 3、使用前先由學校領導創建新任務,錄入學校信息、教師信息、班信息等,再由班主任錄入學生信息,最后由成績錄入員錄入學生成績。 4、在數據庫中的user表中更改或增加用戶,在jbqx表中更改每個級別的權限。 如有建議或疑問請與作者聯系。
標簽: 架構
上傳時間: 2015-03-11
上傳用戶:qlpqlq
在linux平臺上實現兩個進程之間的交互。一客戶進程向一遠程進程提交一道作業;遠程進程完成作業后向客戶進程返回執行結果或者是結束的信息。
上傳時間: 2015-03-11
上傳用戶:jkhjkh1982
清華大學數據結構課上實現的B+樹,設計一個4階B+樹,包括: (1) 葉子的每個記錄應該包括4字節(long)關鍵碼值和60字節的數據字段(存儲文件名等,可以自定),設每個葉子可以存儲5條記錄,而內部節點應該是關鍵碼值/指針對。此外,每個節點還應該有指向同層下一個節點的指針、本節點存儲的關鍵碼數等; (2) 此4階B+樹應該支持插入、刪除以及根據給定關鍵碼值進行精確檢索與關鍵碼范圍檢索; (3) 顯示(打印)此4階B+樹的生長(含刪除節點)過程實例;
上傳時間: 2014-08-05
上傳用戶:ywqaxiwang
圖書管理程序,b-tree,c++語言完成。程序非常的棒
上傳時間: 2013-12-19
上傳用戶:love1314