天天看點

MmMapIoSpace和MmUnMapIoSpace

應用程式通路實體位址之MmMapIoSpace

應用環境:WinCE500

在應用程式中使用的都是虛拟位址,如果要對實體位址進行操作

需要用到MmMapIoSpace把實體位址映射到虛拟位址如:

如:pBaseAddress = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);

同上,通路pBaseAddress的指向位址,就為通路被映射後ioPhysicalBase定義的實體位址。

PVOID MmMapIoSpace(

PHYSICAL_ADDRESS PhysicalAddress,     參數1:需要映射的實體位址

ULONG NumberOfBytes,                   參數2:映射的位址長度

BOOLEAN CacheEnable                    參數3:是否使用cache(驅動中要使用uncached)

);

與OALPAtoVA不同,在使用MmMapIoSpace後,必須使用MmUnmapIoSpace。

VOID MmUnmapIoSpace(

PVOID BaseAddress,                      參數1:被映射後的虛拟位址

ULONG NumberOfBytes                     參數2:映射的位址長度

);

在一般的NK驅動編寫中,為了規範程式設計風格,請勿直接使用g_oalAddressTable中的虛拟位址。統一使用MmMapIoSpace、MmUnmapIoSpace函數。

如:pBaseAddress = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);

同上,通路pBaseAddress的指向位址,就為通路被映射後ioPhysicalBase定義的實體位址。

PVOID MmMapIoSpace(

PHYSICAL_ADDRESS PhysicalAddress,     參數1:需要映射的實體位址

ULONG NumberOfBytes,                   參數2:映射的位址長度

BOOLEAN CacheEnable                    參數3:是否使用cache(驅動中要使用uncached)

);

與OALPAtoVA不同,在使用MmMapIoSpace後,必須使用MmUnmapIoSpace。

VOID MmUnmapIoSpace(

PVOID BaseAddress,                      參數1:被映射後的虛拟位址

ULONG NumberOfBytes                     參數2:映射的位址長度

);

在一般的NK驅動編寫中,為了規範程式設計風格,請勿直接使用g_oalAddressTable中的虛拟位址。統一使用MmMapIoSpace、MmUnmapIoSpace函數。

MmMapIoSpace這個函數是在ceddk裡面實作的,是以隻要link了ceddk.lib就可以使用了。它的源碼實作在:

X:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/CEDDK/DDK_MAP

源碼中是調用了virtualalloc來預留虛拟記憶體,然後virtualcopy來做映射的。

這兩個函數都不需要Kernel權限,是以沒有Full Kernel也可以用。

PS:在非full kern模式下,映射實體記憶體可能會失敗,但是可以調用。

可以用setkmode去讓ap臨時進入kernel模式,然後在對記憶體進行操作。

在ce5下,AP可以做任何驅動可以做的事情,你可以寫個程式通路kernel的空間,破解系統,也可以dump或修改flash上面的raw data。但是從ce6開始,這一切都沒那麼自由了。

繼續閱讀