internal void CreateDeploymentData(BackgroundWorker backgroundWorker, DoWorkEventArgs doWorkEventArgs) { MFDevice device = doWorkEventArgs.Argument as MFDevice; _DBG.Engine eng = device.DbgEngine; Commands.Monitor_FlashSectorMap.Reply flashMap = eng.GetFlashSectorMap(); //find deployment sectors. uint addressStart = 0; uint cBytes = 0; //First, find out where the deployment sectors are for (int iSector = flashMap.m_map.Length - 1; iSector >= 0; iSector--) { Commands.Monitor_FlashSectorMap.FlashSectorData flashSectorData = flashMap.m_map[iSector]; if ((flashSectorData.m_flags & Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_MASK) == Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_DEPLOYMENT) { addressStart = flashSectorData.m_address; cBytes += flashSectorData.m_size; } } if (cBytes == 0) { throw new ApplicationException("Could not find deployment sectorsd"); } byte[] deploymentData = new byte[cBytes]; //Read deployment data if (!CreateDeploymentReadHelper(backgroundWorker, doWorkEventArgs, eng, addressStart, deploymentData)) { return; } //create deployment stream MemoryStream deploymentStream = new MemoryStream(); deploymentStream.Write(deploymentData, 0, deploymentData.Length); //convert to srec MFApplicationDeploymentData data = new MFApplicationDeploymentData(); MemoryStream streamSrec = new MemoryStream(); data.BinaryData = deploymentData; deploymentStream.Seek(0, SeekOrigin.Begin); new BinToSrec().DoConversion(deploymentStream, streamSrec, addressStart); //Get bytes long pos = streamSrec.Seek(0, SeekOrigin.Current); data.HexData = new byte[(int)pos]; streamSrec.Seek(0, SeekOrigin.Begin); streamSrec.Read(data.HexData, 0, (int)pos); doWorkEventArgs.Result = data; }
internal void CreateDeploymentData(BackgroundWorker backgroundWorker, DoWorkEventArgs doWorkEventArgs) { MFDevice device = doWorkEventArgs.Argument as MFDevice; _DBG.Engine eng = device.DbgEngine; Commands.Monitor_FlashSectorMap.Reply flashMap = eng.GetFlashSectorMap(); //find deployment sectors. MemoryStream deploymentStream = new MemoryStream(); //this duplicates LoadDeploymentAssemblies logic, as how to find assemblies in the deployment sectors int iSectorStart = -1, iSectorEnd = 0; uint address, addressAssemblyStart, addressStart = 0, addressEnd = 0; int iSector; //First, find out where the deployment sectors are for (iSector = 0; iSector < flashMap.m_map.Length; iSector++) { Commands.Monitor_FlashSectorMap.FlashSectorData flashSectorData = flashMap.m_map[iSector]; if ((flashSectorData.m_flags & Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_MASK) == Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_DEPLOYMENT) { if (iSectorStart < 0) { iSectorStart = iSector; addressStart = flashSectorData.m_address; } iSectorEnd = iSector; addressEnd = flashSectorData.m_address + flashSectorData.m_size; } } if (iSectorStart < 0) { throw new ApplicationException("Could not find deployment sectors"); } address = addressStart; iSector = iSectorStart; while (true) { if (backgroundWorker.WorkerReportsProgress) { int progress = (int)(100.0 * (double)address / (double)addressEnd); backgroundWorker.ReportProgress(progress); } //read assembly header uint assemblyHeaderSize = (uint)Marshal.SizeOf(typeof(CLR_RECORD_ASSEMBLY)); byte[] assemblyHeaderBytes = null; byte[] assemblyDataBytes = null; if (address + assemblyHeaderSize >= addressEnd) { break; } addressAssemblyStart = address; if (!CreateDeploymentReadHelper(backgroundWorker, doWorkEventArgs, eng, ref address, addressStart, addressEnd, assemblyHeaderSize, out assemblyHeaderBytes)) { return; } GCHandle gch = GCHandle.Alloc(assemblyHeaderBytes, GCHandleType.Pinned); CLR_RECORD_ASSEMBLY assemblyHeader = (CLR_RECORD_ASSEMBLY)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(CLR_RECORD_ASSEMBLY)); gch.Free(); //check if valid header //check marker bool fValidAssembly = assemblyHeader.marker == CLR_RECORD_ASSEMBLY.MARKER_ASSEMBLY_V1; if (fValidAssembly) { //check header crc uint crcHeader = assemblyHeader.headerCRC; //clear headerCRC int headerCRCOffset = 8; int headerCRCSize = 4; Array.Clear(assemblyHeaderBytes, headerCRCOffset, headerCRCSize); uint crc = _DBG.CRC.ComputeCRC(assemblyHeaderBytes, 0); //Reset headerCRC Array.Copy(BitConverter.GetBytes(crcHeader), 0, assemblyHeaderBytes, headerCRCOffset, headerCRCSize); fValidAssembly = (crcHeader == crc); } if (fValidAssembly) { uint assemblyTotalSize = assemblyHeader.startOfTables[CLR_RECORD_ASSEMBLY.TBL_EndOfAssembly]; uint assemblyDataSize = assemblyTotalSize - assemblyHeaderSize; if (address + assemblyDataSize >= addressEnd) { break; } //read body if (!CreateDeploymentReadHelper(backgroundWorker, doWorkEventArgs, eng, ref address, addressStart, addressEnd, assemblyDataSize, out assemblyDataBytes)) { return; } //check if valid body (crc) uint crc = _DBG.CRC.ComputeCRC(assemblyDataBytes, 0); fValidAssembly = (crc == assemblyHeader.assemblyCRC); } if (fValidAssembly) { // add to compact stream deploymentStream.Write(assemblyHeaderBytes, 0, assemblyHeaderBytes.Length); deploymentStream.Write(assemblyDataBytes, 0, assemblyDataBytes.Length); // make sure we are on 4 byte boundary if (0 != (address % sizeof(UInt32))) { byte[] buff = new byte[sizeof(UInt32) - (address % sizeof(UInt32))]; deploymentStream.Write(buff, 0, buff.Length); address += sizeof(UInt32) - (address % sizeof(UInt32)); } } else { //if no, clear assemblyData, jump to next sector (if in middle of sector), or finish (if at beginning of sector) while (iSector < iSectorEnd) { Commands.Monitor_FlashSectorMap.FlashSectorData flashSectorData = flashMap.m_map[iSector]; if (addressAssemblyStart >= flashSectorData.m_address && addressAssemblyStart < flashSectorData.m_address + flashSectorData.m_size) { // jump to next sector address = flashSectorData.m_address + flashSectorData.m_size; System.Diagnostics.Debug.Assert(address == flashMap.m_map[iSector + 1].m_address); break; } iSector++; } } } //Finished reading //convert to srec MFApplicationDeploymentData data = new MFApplicationDeploymentData(); long deploymentLength = deploymentStream.Seek(0, SeekOrigin.Current); MemoryStream streamSrec = new MemoryStream(); deploymentStream.Seek(0, SeekOrigin.Begin); data.BinaryData = new byte[(int)deploymentLength]; deploymentStream.Read(data.BinaryData, 0, (int)deploymentLength); deploymentStream.Seek(0, SeekOrigin.Begin); new BinToSrec().DoConversion(deploymentStream, streamSrec, flashMap.m_map[iSectorStart].m_address); //add zero bytes to all other deployment sectors? //Get bytes long pos = streamSrec.Seek(0, SeekOrigin.Current); data.HexData = new byte[pos]; streamSrec.Seek(0, SeekOrigin.Begin); streamSrec.Read(data.HexData, 0, (int)pos); doWorkEventArgs.Result = data; }