int start_worker_thread() { char str[80]={0}; static HANDLE *events[2]={0,0}; void *args=0; get_guid_str("worker thread event:",str,sizeof(str)); if(event!=0) CloseHandle(event); event=CreateEvent(NULL,TRUE,FALSE,str); if(event==0) return FALSE; get_guid_str("worker thread idle:",str,sizeof(str)); if(event_idle!=0) CloseHandle(event_idle); event_idle=CreateEvent(NULL,TRUE,FALSE,str); if(event_idle==0) return FALSE; events[0]=event; events[1]=event_idle; args=events; hworker=_beginthread(thread,0,args); if(hworker==-1){ MessageBox(NULL,"Failed to create worker thread","Error",MB_OK|MB_SYSTEMMODAL); hworker=0; } return TRUE; }
static int dump_darwin_id(const DATABLOCK_HEADER* bhdr) { const LINK_SZ_BLOCK *szp = (const LINK_SZ_BLOCK*)bhdr; char comp_str[40]; const char *feat, *comp, *prod_str, *feat_str; GUID guid; printf("Advertise Info\n"); printf("--------------\n\n"); printf("msi string = %s\n", szp->bufA); if (base85_to_guid(szp->bufA, &guid)) prod_str = get_guid_str(&guid); else prod_str = "?"; comp = &szp->bufA[20]; feat = strchr(comp, '>'); if (!feat) feat = strchr(comp, '<'); if (feat) { memcpy(comp_str, comp, feat - comp); comp_str[feat-comp] = 0; } else { strcpy(comp_str, "?"); } if (feat && feat[0] == '>' && base85_to_guid( &feat[1], &guid )) feat_str = get_guid_str( &guid ); else feat_str = ""; printf(" product: %s\n", prod_str); printf(" component: %s\n", comp_str ); printf(" feature: %s\n", feat_str); printf("\n"); return 0; }
void lnk_dump(void) { const LINK_HEADER* hdr; const DATABLOCK_HEADER* bhdr; DWORD dwFlags; offset = 0; hdr = fetch_block(); if (!hdr) return; printf("Header\n"); printf("------\n\n"); printf("Size: %04x\n", hdr->dwSize); printf("GUID: %s\n", get_guid_str(&hdr->MagicGuid)); printf("FileAttr: %08x\n", hdr->dwFileAttr); printf("FileLength: %08x\n", hdr->dwFileLength); printf("nIcon: %d\n", hdr->nIcon); printf("Startup: %d\n", hdr->fStartup); printf("HotKey: %08x\n", hdr->wHotKey); printf("Unknown5: %08x\n", hdr->Unknown5); printf("Unknown6: %08x\n", hdr->Unknown6); /* dump out all the flags */ printf("Flags: %04x ( ", hdr->dwFlags); dwFlags=hdr->dwFlags; #define FLAG(x) do \ { \ if (dwFlags & SLDF_##x) \ { \ printf("%s ", #x); \ dwFlags&=~SLDF_##x; \ } \ } while (0) FLAG(HAS_ID_LIST); FLAG(HAS_LINK_INFO); FLAG(HAS_NAME); FLAG(HAS_RELPATH); FLAG(HAS_WORKINGDIR); FLAG(HAS_ARGS); FLAG(HAS_ICONLOCATION); FLAG(UNICODE); FLAG(FORCE_NO_LINKINFO); FLAG(HAS_EXP_SZ); FLAG(RUN_IN_SEPARATE); FLAG(HAS_LOGO3ID); FLAG(HAS_DARWINID); FLAG(RUNAS_USER); FLAG(HAS_EXP_ICON_SZ); FLAG(NO_PIDL_ALIAS); FLAG(FORCE_UNCNAME); FLAG(RUN_WITH_SHIMLAYER); FLAG(FORCE_NO_LINKTRACK); FLAG(ENABLE_TARGET_METADATA); FLAG(DISABLE_KNOWNFOLDER_RELATIVE_TRACKING); FLAG(RESERVED); #undef FLAG if (dwFlags) printf("+%04x", dwFlags); printf(")\n"); printf("Length: %04x\n", hdr->dwFileLength); printf("\n"); if (hdr->dwFlags & SLDF_HAS_ID_LIST) dump_pidl(); if (hdr->dwFlags & SLDF_HAS_LINK_INFO) dump_location(); if (hdr->dwFlags & SLDF_HAS_NAME) dump_string("Description", hdr->dwFlags & SLDF_UNICODE); if (hdr->dwFlags & SLDF_HAS_RELPATH) dump_string("Relative path", hdr->dwFlags & SLDF_UNICODE); if (hdr->dwFlags & SLDF_HAS_WORKINGDIR) dump_string("Working directory", hdr->dwFlags & SLDF_UNICODE); if (hdr->dwFlags & SLDF_HAS_ARGS) dump_string("Arguments", hdr->dwFlags & SLDF_UNICODE); if (hdr->dwFlags & SLDF_HAS_ICONLOCATION) dump_string("Icon path", hdr->dwFlags & SLDF_UNICODE); bhdr=fetch_block(); while (bhdr) { if (!bhdr->cbSize) break; switch (bhdr->dwSignature) { case EXP_SZ_LINK_SIG: dump_sz_block(bhdr, "exp.link"); break; case EXP_SPECIAL_FOLDER_SIG: dump_special_folder_block(bhdr); break; case EXP_SZ_ICON_SIG: dump_sz_block(bhdr, "icon"); break; case EXP_DARWIN_ID_SIG: dump_darwin_id(bhdr); break; default: dump_raw_block(bhdr); } bhdr=fetch_block(); } }
static void pdb_ds_dump(void) { struct pdb_reader reader; pdb_ds_init(&reader); printf("Header (DS)\n" "\tsignature: %.*s\n" "\tblock_size: %08x\n" "\tunknown1: %08x\n" "\tnum_pages: %08x\n" "\ttoc_size: %08x\n" "\tunknown2: %08x\n" "\ttoc_page: %08x\n", (int)sizeof(pdb7) - 1, reader.u.ds.header->signature, reader.u.ds.header->block_size, reader.u.ds.header->unknown1, reader.u.ds.header->num_pages, reader.u.ds.header->toc_size, reader.u.ds.header->unknown2, reader.u.ds.header->toc_page); /* files: * 0: JG says old toc pages, I'd say free pages (tbc, low prio) * 1: root structure * 2: types * 3: modules * other known streams: * - string table: it's index is in the stream table from ROOT object under "/names" * those streams get their indexes out of the PDB_STREAM_INDEXES object * - FPO data * - segments * - extended FPO data */ reader.u.ds.root = reader.read_file(&reader, 1); if (reader.u.ds.root) { DWORD* pdw; DWORD* ok_bits; DWORD numok, count; unsigned i; PDB_STREAM_INDEXES sidx; printf("Root:\n" "\tVersion: %u\n" "\tTimeDateStamp: %08x\n" "\tAge: %08x\n" "\tguid %s\n" "\tcbNames: %08x\n", reader.u.ds.root->Version, reader.u.ds.root->TimeDateStamp, reader.u.ds.root->Age, get_guid_str(&reader.u.ds.root->guid), reader.u.ds.root->cbNames); pdw = (DWORD*)(&reader.u.ds.root->names[0] + reader.u.ds.root->cbNames); numok = *pdw++; count = *pdw++; printf("\tStreams directory:\n" "\t\tok: %08x\n" "\t\tcount: %08x\n" "\t\ttable:\n", numok, count); /* bitfield: first dword is len (in dword), then data */ ok_bits = pdw; pdw += *ok_bits++ + 1; if (*pdw++ != 0) { printf("unexpected value\n"); return; } for (i = 0; i < count; i++) { if (ok_bits[i / 32] & (1 << (i % 32))) { DWORD string_idx, stream_idx; string_idx = *pdw++; stream_idx = *pdw++; printf("\t\t\t%2d) %-20s => %x\n", i, &reader.u.ds.root->names[string_idx], stream_idx); numok--; } } if (numok) printf(">>> unmatched present field with found\n"); pdb_dump_types(&reader); pdb_dump_symbols(&reader, &sidx); pdb_dump_fpo(&reader, sidx.FPO); pdb_dump_fpo_ext(&reader, sidx.FPO_EXT); pdb_dump_segments(&reader, sidx.segments); } else printf("-Unable to get root\n"); pdb_exit(&reader); }
static void dump_codeview_headers(unsigned long base, unsigned long len) { const OMFDirHeader* dirHeader; const char* signature; const OMFDirEntry* dirEntry; const OMFSignature* sig; unsigned i; int modulecount = 0, alignsymcount = 0, srcmodulecount = 0, librariescount = 0; int globalsymcount = 0, globalpubcount = 0, globaltypescount = 0; int segmapcount = 0, fileindexcount = 0, staticsymcount = 0; cv_base = PRD(base, len); if (!cv_base) {printf("Can't get full debug content, aborting\n");return;} signature = cv_base; printf(" CodeView Data\n"); printf(" Signature: %.4s\n", signature); if (memcmp(signature, "NB10", 4) == 0) { const CODEVIEW_PDB_DATA* pdb_data; pdb_data = (const void *)cv_base; printf(" Filepos: 0x%08lX\n", pdb_data->filepos); printf(" TimeStamp: %08X (%s)\n", pdb_data->timestamp, get_time_str(pdb_data->timestamp)); printf(" Age: %08X\n", pdb_data->age); printf(" Filename: %s\n", pdb_data->name); return; } if (memcmp(signature, "RSDS", 4) == 0) { const OMFSignatureRSDS* rsds_data; rsds_data = (const void *)cv_base; printf(" Guid: %s\n", get_guid_str(&rsds_data->guid)); printf(" Age: %08X\n", rsds_data->age); printf(" Filename: %s\n", rsds_data->name); return; } if (memcmp(signature, "NB09", 4) != 0 && memcmp(signature, "NB11", 4) != 0) { printf("Unsupported signature (%.4s), aborting\n", signature); return; } sig = cv_base; printf(" Filepos: 0x%08lX\n", sig->filepos); dirHeader = PRD(Offset(cv_base) + sig->filepos, sizeof(OMFDirHeader)); if (!dirHeader) {printf("Can't get debug header, aborting\n"); return;} printf(" Size of header: 0x%4X\n", dirHeader->cbDirHeader); printf(" Size per entry: 0x%4X\n", dirHeader->cbDirEntry); printf(" # of entries: 0x%8X (%d)\n", dirHeader->cDir, dirHeader->cDir); printf(" Offset to NextDir: 0x%8X\n", dirHeader->lfoNextDir); printf(" Flags: 0x%8X\n", dirHeader->flags); if (!dirHeader->cDir) return; dirEntry = PRD(Offset(dirHeader + 1), sizeof(OMFDirEntry) * dirHeader->cDir); if (!dirEntry) {printf("Can't get DirEntry array, aborting\n");return;} for (i = 0; i < dirHeader->cDir; i++) { switch (dirEntry[i].SubSection) { case sstModule: modulecount++; break; case sstAlignSym: alignsymcount++; break; case sstSrcModule: srcmodulecount++; break; case sstLibraries: librariescount++; break; case sstGlobalSym: globalsymcount++; break; case sstGlobalPub: globalpubcount++; break; case sstGlobalTypes: globaltypescount++; break; case sstSegMap: segmapcount++; break; case sstFileIndex: fileindexcount++; break; case sstStaticSym: staticsymcount++; break; } } /* This one has to be > 0 */ printf ("\nFound: %d sstModule subsections\n", modulecount); if (alignsymcount > 0) printf (" %d sstAlignSym subsections\n", alignsymcount); if (srcmodulecount > 0) printf (" %d sstSrcModule subsections\n", srcmodulecount); if (librariescount > 0) printf (" %d sstLibraries subsections\n", librariescount); if (globalsymcount > 0) printf (" %d sstGlobalSym subsections\n", globalsymcount); if (globalpubcount > 0) printf (" %d sstGlobalPub subsections\n", globalpubcount); if (globaltypescount > 0) printf (" %d sstGlobalTypes subsections\n", globaltypescount); if (segmapcount > 0) printf (" %d sstSegMap subsections\n", segmapcount); if (fileindexcount > 0) printf (" %d sstFileIndex subsections\n", fileindexcount); if (staticsymcount > 0) printf (" %d sstStaticSym subsections\n", staticsymcount); dump_codeview_all_modules(dirHeader); }