SSIZE_T parse( BYTE *data, SIZE_T /*len*/, Modules &modules, bool skipVersion/*=false*/ ) { SSIZE_T offset = 0; WORD numberOfModules = RW(data,offset); for (int mod=0; mod<numberOfModules; mod++) { Type module; module.id = RW(data,offset); module.size = RDW(data,offset); module.version = (skipVersion) ? 0 : RB(data,offset); BYTE moduleInfoLen = RB(data,offset); if (moduleInfoLen) { module.info.copy( (char *)(data+offset), moduleInfoLen ); offset += moduleInfoLen; } modules.push_back( module ); } return offset; }
Modules getModules(CIDebugSymbols *syms, std::string *errorMessage) { enum { BufSize = 1024 }; char nameBuf[BufSize]; char fileBuf[BufSize]; ULONG Loaded; ULONG Unloaded; HRESULT hr = syms->GetNumberModules(&Loaded, &Unloaded); if (FAILED(hr)) { *errorMessage = msgDebugEngineComFailed("GetNumberModules", hr); return Modules(); } const ULONG count = Loaded + Unloaded; Modules rc; rc.reserve(count); DEBUG_MODULE_PARAMETERS *parameters = new DEBUG_MODULE_PARAMETERS[count]; hr = syms->GetModuleParameters(count, NULL, 0, parameters); if (FAILED(hr)) { delete [] parameters; *errorMessage = msgDebugEngineComFailed("GetModuleParameters", hr); return Modules(); } for (ULONG m = 0; m < count; ++m) { Module module; module.base = parameters[m].Base; module.size = parameters[m].Size; module.deferred = parameters[m].Flags == DEBUG_SYMTYPE_DEFERRED; hr = syms->GetModuleNames(m, 0, fileBuf, BufSize, NULL, nameBuf, BufSize, NULL, NULL, NULL, NULL); if (FAILED(hr)) break; // Fail silently should unloaded modules not work. module.name = nameBuf; module.image = fileBuf; rc.push_back(module); } return rc; }