/* (C) 2003-2007 Willem Jan Hengeveld * Web: http://www.xs4all.nl/~itsme/ * http://wiki.xda-developers.com/ * * $Id: $ */ #include #include "debug.h" #include "cenk.h" #include "kernelmisc.h" #include "cever_deps.h" int GetWinceVersion() { OSVERSIONINFO version; if (!GetVersionEx(&version)) { error("GetVersionEx"); return 2; } return version.dwMajorVersion; } bool isValidPtr(DWORD dwAddr) { return VirtToPhys(dwAddr)!=INVALID_PHYSICAL_ADDRESS; } DWORD PhysToVirt(DWORD dwPhysOffset) { // KSEG0_BASE .. KSEG1_BASE = cached kernel physical for (DWORD ixPage= 0x800 ; ixPage < 0xa00 ; ixPage++) { DWORD dwEntry= FirstPT[ixPage]; // FirstPT is defined in nkarm.h if (((dwEntry&3)==2) && ((dwEntry&0xfff00000)==(dwPhysOffset&0xfff00000))) return (dwPhysOffset&0xfffff)|(ixPage<<20); } debug("Physical address %08lx is not mapped\n", dwPhysOffset); return 0; } DWORD PhysToVirtUC(DWORD dwPhysOffset) { return PhysToVirt(dwPhysOffset)|0x20000000; } /* this is the other way to convert physical to virtual: via the kernel vm init table. as is done in c:/local/WINCE500/PRIVATE/WINCEOS/COREOS/NK/KERNEL/ARM/mdarm.c void *Phys2Virt(DWORD pfn) { int i=0; PTE *pAddrTbl= (PTE *)0x800417E8; while(pAddrTbl[i].dwSize) { DWORD va = pAddrTbl[i].dwVA & 0x1FF00000; // Virtual Base Address of section DWORD pa = pAddrTbl[i].dwPA & 0xFFF00000; // Physical Base Address of section DWORD pau = pa + (pAddrTbl[i].dwSize << 20) - 1; // Physical Address Upper Bound of section DWORD pfnmb = pfn & 0xfff00000; // PFN rounded down to 1MB if ((pfnmb >= pa) && (pfnmb <= pau)) return ((PVOID) ((pfn - pa) + va + 0x80000000)); i++; } return 0; } */ HDATA *cvHandle2HDataPtr(HANDLE h) { return (HDATA *)(KData.handleBase+((DWORD)h&HANDLE_ADDRESS_MASK)); } bool CreateModuleInfoMap(ModuleInfoMap& map) { for (MODULE *m= (MODULE*)KData.aInfo[KINX_MODULES]; m ; m=m->pMod) { DWORD vbase= GetModuleMembase(m); FillModuleInfo(map[vbase], m); } return true; } bool FindModuleNameForProcessAddress(const ModuleInfoMap& map, DWORD pid, DWORD dwAddress, TCHAR *szModname, int maxmodname) { ModuleInfoMap::const_iterator i= map.upper_bound(dwAddress); if (i==map.end()) { //debug("could not find module for %08lx\n", dwAddress); return false; } //debug("upper = %08lx\n", (*i).first); i--; if (i==map.end()) { //debug("#2 - could not find module for %08lx\n", dwAddress); return false; } //debug("upper-- = %08lx\n", (*i).first); const ModuleInfo &mi = (*i).second; if (mi.membase<=dwAddress && (dwAddress=0x02000000) return false; // only check csegbase if it is in the right range. if (mi.csegbase<=dwAddress && (dwAddress