- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
读写数據.ppt
讀寫數據 sigang@mti.xidian.edu.cn 應用程式如何讀寫數據 應用程式發起一個讀或寫操作時,它會提供用戶模式虛擬位址和長度,即應用程式向I/O管理器提供了一個數據緩沖區。 應用程式讀寫數據主要透過如下三個win 32API︰ReadFile,WriteFile,DeviceIoControl DeviceIoControl BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped ); ReadFile BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); WriteFile BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); 驅動程式如何讀寫數據 內核模式驅動程式幾乎從不使用用戶模式虛擬位址訪問內存,因為不能確定具體的線程上下文。 Windows 2000為驅動程式訪問用戶模式數據緩沖區提供了三種方法︰buffered,direct,neither。 三種方法 buffered模式中,I/O管理器先創建一個與用戶模式數據緩沖區大小相等的系統緩沖區。驅動程式將使用這個系統緩沖區工作。I/O管理器負責在系統緩沖區和用戶模式緩沖區之間複製數據。 在direct模式中,I/O管理器鎖定了包含用戶模式緩沖區的物理內存頁,並創建一個稱為MDL(內存描述符表)的輔助數據架構來描述鎖定頁。驅動程式將使用MDL工作。 在neither模式中,I/O管理器僅簡單地把用戶模式的虛擬位址傳遞給驅動程式。這通常很少用到。 如何指定緩沖區的讀寫模式 和驅動程式數據讀寫相關的Win32 API分為兩類,在不同的地方設置他們的緩沖區讀寫模式 ReadFile,WriteFile(在AddDevice例程中指定) DeviceIoControl(對每一個Control code分別指定) AddDevice中指定 PDEVICE_OBJECT fdo; IoCreateDevice(..., fdo); fdo-Flags |= DO_BUFFERED_IO; or fdo-Flags |= DO_DIRECT_IO; or fdo-Flags |= 0; // i.e., neither direct nor //buffered 特點 一旦指定,所有的其它過濾驅動程式都要使用這個數據緩沖模式 這個數據緩沖模式,即針對ReadFile又針對WriteFile,一旦指定某種模式,讀寫都要使用者這種模式。 無論使用哪種模式,對用戶的界面,也就是ReadFile和WriteFile的使用都是一樣的 DeviceIoControl如何指定 #define IOCTL_GET_VERSION_BUFFERED \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_VERSION_DIRECT \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_GET_VERSION_NEITHER \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS) DeviceIoControl result = DeviceIoControl(Handle, IOCTL_GET_VERSION_BUFFERED , InputData, In
您可能关注的文档
最近下载
- 生命体征的观察与照护.pptx VIP
- 电力设计软件:CDEGS二次开发_(6).CDEGS模型创建与编辑.docx VIP
- 《县级(区域)医疗资源集中化运行规范 第2部分:医学影像会诊中心》.docx VIP
- 国有企业内部薪酬分配指引(2025年).docx VIP
- 铁路线路防护栅栏 通线(2023)8001.docx VIP
- 电力系统设计软件:CDEGS二次开发_(5).CDEGS模块深度应用.docx VIP
- 2025年银行业专业人员初级职业资格考试(银行业法律法规与综合能力)历年参考题库含答案详解.docx VIP
- 2021年自考06090人员素质测评理论与方法.pdf VIP
- 本科药理学教学大纲(72学时).doc VIP
- 2024年九年级上册道德与法治期中测试卷含答案.pdf VIP
原创力文档


文档评论(0)