wince6.0下使用者程式訪問實體地址

simplaman發表於2007-11-08

應用程式直接訪問實體地址可以極大的方便硬體驅動開發.如直接訪問LCD控制器,可以很直接的對各種引數進行微調,不必一次次的編譯打包,下載執行.

wince6.0之前可以透過MmMapIoSpace將實體地址對映到程式空間.MmMapIoSpace內部實現就是常見的VirtualAlloc+VirtualCopy.

Wince6.0對核心模式也使用者模式做了相當大的改動,具體如何還不是很明瞭,清楚的是使用者態程式呼叫VirtualCopy實體地址時會返回失敗,導致MmMapIoSpace返回0.

繞過去的思路就是載入部分程式碼到核心模式,在這部分程式碼中完成地址對映.有兩種實現的方法,一個是透過ActivateDevice載入一個流介面驅動,有點繁瑣,實現標準介面的驅動,修改登錄檔,再載入呼叫.另一個就是透過LoadKernelLibrary載入動態庫到核心空間,然後透過KernelLibIoControl完成對映.

程式碼中幾個關鍵的地方
1 上面我們提到是在核心空間完成對映,而不是在核心空間訪問實體地址.因為wince6.0提供了VirtualAlloc+VirtualCopy的增強版:VirtualAllocEx+VirtualCopyEx,可以直接將實體地址對映到使用者程式的地址空間.
2 LoadKernelLibrary沒有相應的FreeKernelLibrary,我們可以在核心模式動態庫中透過FreeLibrary或者FreeLibraryAndExitThread自身來實現

附:無意中在網上搜到別人轉載的這篇文章,給出來的實現卻是繁瑣的第一種方式.故加上這麼一小段:
我後面的博文基於命令列的WINCE驅動開發工具 已經實現第二種方式在AP中直接訪問實體地址.裡面包含的mapper.dll,匯出來有兩個介面
LPVOID MapAddress(DWORD dwAddress,DWORD dwSize);
void UnmapAddress(LPVOID pAddress);
有需要的朋友可以在你的AP中,透過這兩個介面對映實體地址到本地地址,然後就可以訪問該實體地址了.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/116625/viewspace-981367/,如需轉載,請註明出處,否則將追究法律責任。

相關文章