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);
        }