int IM24CXXProgrammer.ProgramChip(string chip, MemoryRegion region, Action <ProgrammingCompleteInfo> completed, Action <ProgrammingProgressInfo> progress) { _isBusy = true; AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(new Guid()); if (chip == "24C02") { byte[] regdata = new byte[256]; region.ReadData(0, regdata); region = new MemoryRegion(0, 512, 1); region.WriteData(0, regdata); } Action <int, int> progressAct = delegate(int val, int max) { asyncOp.Post(delegate(object args) { progress(new ProgrammingProgressInfo(new ProgressBarData(0, val, max))); }, null); }; ThreadStart start = delegate() { asyncOp.Post(delegate(object args) { OnBusy(); }, null); ProgrammingCompleteInfo pcInfo = new ProgrammingCompleteInfo(); try { SafeFileHandle handle = CreateFile(_hardwarePath, Win32HardwareIOSupport.GENERIC_WRITE | Win32HardwareIOSupport.GENERIC_READ, Win32HardwareIOSupport.FILE_SHARE_WRITE | Win32HardwareIOSupport.FILE_SHARE_READ, IntPtr.Zero, Win32HardwareIOSupport.OPEN_EXISTING, 0, IntPtr.Zero); if (handle.IsInvalid) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } using (FileStream harwareStream = new FileStream(handle, FileAccess.ReadWrite, 65)) { SetTaskNumber(harwareStream, _m24CXXChipSet[chip]); UpdateCurrentMemRegConfig(harwareStream); if ((_currentMemoryRegionsConfig.Count != 1) || (_currentMemoryRegionsConfig[0] != region.GetRegionInfo())) { Exception e1 = Marshal.GetExceptionForHR((int)((Convert.ToUInt32(4319) | 0x80070000))); Exception e2 = Marshal.GetExceptionForHR((int)((Convert.ToUInt32(1784) | 0x80070000))); string message = e1.Message.Substring(0, e1.Message.IndexOf("(")) + e2.Message.Substring(0, e2.Message.IndexOf("(")); throw new Exception(message); } asyncOp.Post(delegate(object args) { progress(new ProgrammingProgressInfo("Programming")); }, null); ProgramRegion(harwareStream, region, progressAct); MemoryRegion testRegion = new MemoryRegion(_currentMemoryRegionsConfig[0]); asyncOp.Post(delegate(object args) { progress(new ProgrammingProgressInfo("Verification")); }, null); asyncOp.Post(delegate(object args) { progress(new ProgrammingProgressInfo(new ProgressBarData(0, 0, 1))); }, null); ReadRegion(harwareStream, testRegion, progressAct); for (int i = 0; i < region.Size; i++) { if (region.Data[i] != testRegion.Data[i]) { throw new VerificationException(region.Address + (uint)i, region.Data[i], testRegion.Data[i]); } } } } catch (VerificationException ve) { if ((chip == "24C02") && (ve.ErrorAddress >= 256)) { } else { pcInfo.error = ve; } } catch (Exception e) { pcInfo.error = e; } pcInfo.Message = "Programming complete"; asyncOp.Post(delegate(object args) { completed(pcInfo); }, null); _isBusy = false; asyncOp.PostOperationCompleted(delegate(object args) { OnReady(); }, null); }; (new Thread(start)).Start(); return(0); }