#include #include "cenk.h" #include "debug.h" // // c:\local\WINCE420\PUBLIC\COMMON\OAK\INC\romxip.h // c:\local\WINCE420\PUBLIC\COMMON\OAK\INC\romldr.h // void DumpVolumes(XIPCHAIN_SUMMARY *pChainHeader, DWORD dwChainSize) { DWORD dwNumRegions = (dwChainSize / sizeof(XIPCHAIN_SUMMARY)) - 1; XIPCHAIN_SUMMARY *pChain = pChainHeader+1; // Exclude the chain header ROMHDR *pToc = (ROMHDR *)UserKInfo[KINX_PTOC]; for (DWORD i=0; i < dwNumRegions; i++, pChain++) { debug("BINFS: ChainInfo - Address=%08X Length=%ld Order=%ld Flags=%04X\r\n", pChain->pvAddr, pChain->dwMaxLength, pChain->usOrder, pChain->usFlags); if (pChain->usOrder < dwNumRegions) { WORD wOrder = (WORD)(dwNumRegions-1) - pChain->usOrder; if (pToc->physfirst == (DWORD)pChain->pvAddr) { debug("volchain[%d].toc=xip: %08lx\n", wOrder, pToc); } else { debug("volchain[%d] = binfs\n", wOrder); } } else { debug("chain[%d].order =%d >= %d\n", i, pChain->usOrder, dwNumRegions); } } } bool FindViaKioctl() { DWORD dwRet; XIPCHAIN_SUMMARY *pChainHeader = NULL; DWORD dwChainSize = 0; if (KernelIoControl( IOCTL_HAL_GET_BIN_CHAIN, NULL, 0, &dwChainSize, sizeof(DWORD), &dwRet) && dwChainSize) { pChainHeader = (XIPCHAIN_SUMMARY *)new BYTE[dwChainSize]; if (pChainHeader) { if (!KernelIoControl( IOCTL_HAL_GET_BIN_CHAIN, (LPBYTE)pChainHeader, dwChainSize, NULL, 0, &dwRet)) { delete [] pChainHeader; pChainHeader = NULL; dwChainSize = 0; } } else { dwChainSize = 0; } } if (pChainHeader==0) { debug("FindViaKioctl: no chain found\n"); return false; } debug("FindViaKioctl: hdr=%08lx, size=%08lx\n", pChainHeader, dwChainSize); DumpVolumes(pChainHeader, dwChainSize+0x10); return true; } bool FindViaROMHDR() { XIPCHAIN_SUMMARY *pChainHeader = NULL; DWORD dwChainSize = 0; ROMHDR *pToc = (ROMHDR *)UserKInfo[KINX_PTOC]; ROMPID *pRomPid = (ROMPID *)pToc->pExtensions; ROMPID *pItem = (ROMPID *)pRomPid->pNextExt; LPSTR szChainDesc = "chain information"; while(pItem) { if ((memcmp( pItem->name, szChainDesc, strlen(szChainDesc)) == 0) && pItem->length) { pChainHeader = (XIPCHAIN_SUMMARY *) pItem->pdata; dwChainSize = pItem->length; break; } pItem = (ROMPID *)pItem->pNextExt; } if (pChainHeader==0) { debug("FindViaROMHDR: no chain found\n"); return false; } debug("FindViaROMHDR: hdr=%08lx, size=%08lx\n", pChainHeader, dwChainSize); DumpVolumes(pChainHeader, dwChainSize+0x10); return true; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DebugSetLogfile("chaininfo.log"); BOOL bMode = SetKMode(TRUE); DWORD dwPerm = SetProcPermissions(-1); FindViaKioctl(); FindViaROMHDR(); SetKMode(bMode); SetProcPermissions(dwPerm); return 0; }