public int Create(MFUpdate_Header storageHeader) { if (m_updateStorage.ContainsKey(storageHeader.UpdateID)) { return(-1); } m_updateStorage[storageHeader.UpdateID] = new UpdateClass(storageHeader); return((int)storageHeader.UpdateID); }
public bool GetHeader(int handle, ref MFUpdate_Header header) { if (!m_updateStorage.ContainsKey(handle)) { return(false); } header = m_updateStorage[handle].Header; return(true); }
public bool InitializeUpdate(IntPtr updateHeader) { bool supportedUpdate = false; MFUpdate_Header header = (MFUpdate_Header)Marshal.PtrToStructure(updateHeader, typeof(MFUpdate_Header)); switch ((MFUpdateType)header.UpdateType) { case MFUpdateType.AssemblyUpdate: case MFUpdateType.KeyUpdate: case MFUpdateType.FirmwareUpdate: supportedUpdate = true; break; default: supportedUpdate = false; break; } return(supportedUpdate); }
internal UpdateClass(MFUpdate_Header header) { Header = header; Data = new byte[header.UpdateSize]; }
public bool InstallUpdate(MFUpdate_Emu update, IntPtr pValidation, int validationLen) { bool fValid = false; MFUpdate_Header header = new MFUpdate_Header(); GCHandle h = GCHandle.Alloc(header, GCHandleType.Pinned); IntPtr ptr = h.AddrOfPinnedObject(); Hal.UpdateStorage.Read(update.StorageHandle, 0, ptr, Marshal.SizeOf(header)); header = (MFUpdate_Header)Marshal.PtrToStructure(ptr, typeof(MFUpdate_Header)); h.Free(); switch ((MFUpdateType)header.UpdateType) { case MFUpdateType.AssemblyUpdate: // signature check or strong name check fValid = true; if (fValid) { byte[] asmBytes = new byte[header.UpdateSize]; GCHandle hb = GCHandle.Alloc(asmBytes, GCHandleType.Pinned); IntPtr gcBytes = h.AddrOfPinnedObject(); if (0 < Hal.UpdateStorage.Read(update.StorageHandle, Marshal.SizeOf(header), gcBytes, (int)header.UpdateSize)) { Marshal.Copy(gcBytes, asmBytes, 0, asmBytes.Length); string fTmp = Path.ChangeExtension(Path.GetTempFileName(), ".pe"); try { using (FileStream fs = File.OpenWrite(fTmp)) { fs.Write(asmBytes, 0, asmBytes.Length); } Emulator.LoadAssembly(fTmp); Emulator.Run(); File.Delete(fTmp); } catch { return(false); } finally { if (File.Exists(fTmp)) { File.Delete(fTmp); } } } hb.Free(); } break; case MFUpdateType.KeyUpdate: // unwrap and store break; } return(fValid); }