/* (C) 2003 XDA Developers itsme@xs4all.nl * * $Header$ */ #define EDB 1 #include #include #include "debug.h" #include "stringutils.h" bool g_edbfuncs=true; std::string guidstring(CEGUID* pguid) { return stringformat("{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", pguid->Data1, pguid->Data2&0xffff, pguid->Data2>>16, pguid->Data3&0xff, (pguid->Data3>>8)&0xff, (pguid->Data3>>16)&0xff, (pguid->Data3>>24)&0xff, pguid->Data4&0xff, (pguid->Data4>>8)&0xff, (pguid->Data4>>16)&0xff, (pguid->Data4>>24)&0xff); } bool dump_prop(CEPROPVAL *prop) { debug(" %08lx %04x %04x ", prop->propid, prop->wLenData, prop->wFlags); switch (prop->propid&0xffff) { case CEVT_I2: debug(" i2 %04x\n", prop->val.iVal ); break; case CEVT_UI2: debug(" ui2 %04x\n", prop->val.uiVal); break; case CEVT_I4: debug(" i4 %08x\n", prop->val.lVal ); break; case CEVT_UI4: #ifdef EDB case CEVT_AUTO_I4: #endif debug(" ui4 %08lx\n", prop->val.ulVal); break; case CEVT_FILETIME: debug(" ft %08lx%08lx\n", prop->val.filetime.dwHighDateTime, prop->val.filetime.dwLowDateTime); break; case CEVT_LPWSTR: debug(" '%ls'\n", prop->val.lpwstr); break; case CEVT_BLOB: #ifdef EDB case CEVT_AUTO_I8: case CEVT_RECID: case CEVT_STREAM: #endif debug(" %08lx[%s]\n", prop->val.blob.dwCount, hexdump(prop->val.blob.lpb, prop->val.blob.dwCount).c_str()); break; case CEVT_BOOL: debug(" bool %d\n", prop->val.boolVal); break; case CEVT_R8: debug(" r8 %g\n", prop->val.dblVal); break; default: debug("unknown type val=%08lx\n", prop->val.dblVal); } return true; } bool dump_props(CEPROPVAL *props, int n) { for (int i=0 ; idwFlags).c_str(), dbi->dwDbaseType, dbi->dwNumRecords, dbi->dwSize, /* ftLastModified, wNumSortOrder, rgSortSpecs */ dbi->szDbaseName); if (dbi->wNumSortOrder) { debug(" ORDERING:"); for (int i=0 ; iwNumSortOrder ; i++) { debug(" %d:%s={", dbi->rgSortSpecs[i].wVersion, CEDBKeyFlagString(dbi->rgSortSpecs[i].wKeyFlags).c_str()); for (int j=0 ; jrgSortSpecs[i].wNumProps ; j++) { if (j) debug(", "); debug("%08lx:%s", dbi->rgSortSpecs[i].rgPropID[j], CEDBSortFlagString(dbi->rgSortSpecs[i].rgdwFlags[j]).c_str()); } debug("}"); } debug("\n"); } } bool DumpDatabase(CEGUID *pvolguid, CEOID dboid) { debug("-------------------------------------------------------\n"); HANDLE hDb= g_edbfuncs ? CeOpenDatabaseInSession(NULL, pvolguid, &dboid, NULL, 0, CEDB_AUTOINCREMENT, NULL) : CeOpenDatabaseEx(pvolguid, &dboid, NULL, 0, CEDB_AUTOINCREMENT, NULL); if (hDb==NULL || hDb==INVALID_HANDLE_VALUE) { error("CeOpenDatabaseInSession(%08lx)", dboid); return false; } BY_HANDLE_DB_INFORMATION dbhi; memset(&dbhi, 0, sizeof(dbhi)); dbhi.wVersion= BY_HANDLE_DB_INFORMATION_VERSION; if (!CeGetDBInformationByHandle(hDb, &dbhi)) { dbhi.wVersion= BY_HANDLE_DB_INFORMATION_VERSION-1; if (!CeGetDBInformationByHandle(hDb, &dbhi)) { dbhi.oidDbase= 0; error("CeGetDBInformationByHandle(%08lx)", dboid); } else { debug("!!! database version 1\n"); } } if (dbhi.oidDbase) DumpDatabaseInfo(dboid, &dbhi.infDatabase); else debug("database %08lx\n", dboid); BYTE *lpBuffer= NULL; DWORD nBufferSize= 0; while (true) { WORD nProperties; CEOID oid= CeReadRecordPropsEx(hDb, CEDB_ALLOWREALLOC, &nProperties, NULL, (BYTE**)&lpBuffer, &nBufferSize, NULL); if (oid==0) { if (GetLastError()!=ERROR_NO_MORE_ITEMS) error("CeReadRecordPropsEx"); return false; } debug("oid=%08lx\n", oid); dump_props((CEPROPVAL*)lpBuffer, nProperties); } CloseHandle(hDb); return true; } void EnumDatabases(CEGUID* pvolguid) { HANDLE hEnumDb= CeFindFirstDatabaseEx(pvolguid, 0); // 0=alltypes if (hEnumDb==INVALID_HANDLE_VALUE) { error("CeFindFirstDatabase"); return; } CEOID dboid; while (0!=(dboid=CeFindNextDatabaseEx(hEnumDb, pvolguid))) { DumpDatabase(pvolguid, dboid); } CloseHandle(hEnumDb); } void DumpVolume(TCHAR *szVolname, CEGUID *pvolguid) { debug("=============================================================================\n"); CEGUID mvolguid; bool bMounted= g_edbfuncs ? (0!=CeMountDBVolEx(&mvolguid, szVolname, NULL, OPEN_EXISTING)) : (0!=CeMountDBVol(&mvolguid, szVolname, OPEN_EXISTING)); if (!bMounted) { DWORD dwError= GetLastError(); if (pvolguid) debug("volume %s %ls\n", guidstring(pvolguid).c_str(), szVolname); error(dwError, "CeMountDBVolEx(%ls)", szVolname); memset(&mvolguid, 0, sizeof(mvolguid)); } else { debug("volume %s %ls\n", guidstring(&mvolguid).c_str(), szVolname); } EnumDatabases(pvolguid ? pvolguid : &mvolguid); if (bMounted) CeUnmountDBVol(&mvolguid); } void EnumVolumes() { CEGUID volguid; CREATE_INVALIDGUID(&volguid); int bufferSize= 1024; WCHAR *volumeName= (WCHAR*)malloc(bufferSize*sizeof(WCHAR)); while(true) { if (!CeEnumDBVolumes(&volguid, volumeName, bufferSize)) { int err= GetLastError(); if (err==ERROR_NO_MORE_ITEMS) break; else if (err==ERROR_INSUFFICIENT_BUFFER) { bufferSize *= 2; volumeName= (WCHAR*)realloc(volumeName, bufferSize*sizeof(WCHAR)); } else { error(err, "CeEnumDbVolumes"); break; } } else { DumpVolume(volumeName, &volguid); } } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DebugSetLogfile("tstedb.log"); debug("starting dump, ver=%d\n", CEOIDINFOEX_VERSION); StringList args; if (!SplitString(ToString(lpCmdLine), args, false)) { error("Error in commandline"); return false; } StringList vollist; for (StringList::iterator i= args.begin() ; i!=args.end() ; ++i) { std::string& arg= *i; if (arg[0]=='-') switch(arg[1]) { case 'c': g_edbfuncs=false; break; } else { vollist.push_back(arg); } } if (!vollist.empty()) { DumpVolume((TCHAR*)ToTString(vollist.front()).c_str(), NULL); } else { EnumVolumes(); DumpVolume(L"\\Documents and Settings\\default.vol", NULL); DumpVolume(L"\\Windows\\boot.hv", NULL); DumpVolume(L"\\Windows\\default.hv", NULL); DumpVolume(L"\\Windows\\mxip_initdb.vol", NULL); DumpVolume(L"\\Windows\\mxip_lang.vol", NULL); DumpVolume(L"\\Windows\\mxip_notify.vol", NULL); DumpVolume(L"\\Windows\\mxip_system.vol", NULL); DumpVolume(L"\\Windows\\user.hv", NULL); DumpVolume(L"\\cemail.vol", NULL); DumpVolume(L"\\Documents and Settings\\system.hv", NULL); DumpVolume(L"\\Documents and Settings\\default\\user.hv", NULL); DumpVolume(L"\\mxip_initdb.vol", NULL); DumpVolume(L"\\mxip_lang.vol", NULL); DumpVolume(L"\\mxip_notify.vol", NULL); DumpVolume(L"\\mxip_system.vol", NULL); DumpVolume(L"\\pim.vol", NULL); DumpVolume(L"\\ReplStorVol", NULL); DumpVolume(L"\\dochive\\system.hv", NULL); DumpVolume(L"\\docprof\\default\\user.hv", NULL); DumpVolume(L"\\mxip_swmgmt.vol", NULL); DumpVolume(L"\\Application Data\\HTC\\AudioManager_Eng\\AudioManager_Eng.vol", NULL); DumpVolume(L"\\Application Data\\HTC\\HTC ALBUM\\album.vol", NULL); DumpVolume(L"\\Application Data\\Windows Live\\WindowsLive.vol", NULL); DumpVolume(L"\\Documents and Settings\\default.vol", NULL); DumpVolume(L"\\Intern geheugen\\album.vol", NULL); DumpVolume(L"\\Windows\\Volume-100", NULL); DumpVolume(L"\\Windows\\Volume-20", NULL); DumpVolume(L"\\Windows\\Volume-40", NULL); DumpVolume(L"\\Windows\\Volume-60", NULL); DumpVolume(L"\\Windows\\Volume-80", NULL); DumpVolume(L"\\Windows\\mxip_swmgmt.vol", NULL); DumpVolume(L"\\Windows\\System\\PushRouter\\clientqueues.vol", NULL); } debug("done\n"); return 0; }