應用程式通路實體位址之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開始,這一切都沒那麼自由了。