Esempio n. 1
0
        /// <summary>
        /// B、用户导入升级包
        /// </summary>
        /// <returns></returns>
        public static UInt32 UserUpdatePkg()
        {
            //1.枚举锁
            //2.打开锁
            //3.验证用户PIN
            //4.导入升级包
            //5.验证升级包内容(读取验证内容与升级内容一致)
            //6.关闭锁

            UInt32 ret = MowayCS.MW_SUCCESS;
            UInt32 devInfoArraySize = 32;       // 获取设备的最大数量

            MW_DEVICE_INFO_CTX[] devInfoArray = new MW_DEVICE_INFO_CTX[devInfoArraySize];

            UInt32 devCount = 0;
            IntPtr hHandle  = IntPtr.Zero;

            //1.枚举锁
            ret = MowayCS.mw_enum(devInfoArray, devInfoArraySize, ref devCount);
            if (ret != MowayCS.MW_SUCCESS)
            {
                Console.WriteLine("mw_enum failed, {0:X8}", ret);
                return(ret);
            }

            if (devCount == 0)
            {
                Console.WriteLine("Not found device");
                return(ret);
            }

            //2.打开锁
            ret = MowayCS.mw_open(ref devInfoArray[0], MowayCS.MW_OPEN_EXCLUSIVE_MODE, ref hHandle);
            if (ret != MowayCS.MW_SUCCESS)
            {
                Console.WriteLine("mw_open failed, {0:X8}", ret);
                return(ret);
            }

            //3.验证用户PIN
            ret = MowayCS.mw_verify_pin(hHandle, Convert.ToByte(MowayCS.MW_PIN_TYPE_USER), Encoding.ASCII.GetBytes(Program.userPIN));
            if (ret != MowayCS.MW_SUCCESS)
            {
                Console.WriteLine("mw_verify_pin failed, {0:X8}", ret);
                MowayCS.mw_close(hHandle);
                return(ret);
            }

            //4.导入升级包
            // 注意:导入前已经调用 DeveloperMakeUpdatePkg() 生成数据包内容,并且当前加密锁的PID与升级包PID相同。
            ret = MowayCS.mw_update(hHandle, pkgBuffer, pkgBufferLen);
            if (ret == MowayCS.MW_SUCCESS)
            {
                Console.WriteLine("mw_update success.");
            }
            else
            {
                Console.WriteLine("mw_update failed, {0:X8}", ret);
            }


            //5.验证升级包内容(读取验证内容与升级内容一致)
            // 5.1 读取升级后的锁内文件内容
            byte[] readBuffer    = null;
            UInt32 readBufferLen = 0;
            UInt32 readOffset    = 0;

            readBuffer    = new byte[128];
            readBufferLen = (UInt32)readBuffer.Length;
            ret           = MowayCS.mw_read_file(hHandle, updatePkgUpdateFilename, readOffset, readBufferLen, readBuffer);
            if (ret == MowayCS.MW_SUCCESS)
            {
                Console.WriteLine("mw_read_file {0} success, {1}", updatePkgUpdateFilename, Encoding.ASCII.GetString(readBuffer));
            }
            else
            {
                Console.WriteLine("mw_read_file {0} failed, {1:X8}", updatePkgUpdateFilename, ret);
            }

            // 5.2 对比文件内容与升级包写入内容相同
            FileStream   fileStream = new FileStream(updatePkgUpdateLocalFilename, FileMode.Open);
            BinaryReader bReader    = new BinaryReader(fileStream);

            byte[] updateDataBuffer    = bReader.ReadBytes((int)fileStream.Length);
            int    updateDataBufferLen = updateDataBuffer.Length;

            bReader.Close();
            fileStream.Close();

            if (Program.CompareBytes(readBuffer, updateDataBuffer, updateDataBufferLen))
            {
                Console.WriteLine("mw_update success, readBuffer = updateDataBuffer");
            }
            else
            {
                Console.WriteLine("mw_update failed, readBuffer != updateDataBuffer");
            }

            //6.关闭锁
            MowayCS.mw_close(hHandle);

            return(MowayCS.MW_SUCCESS);
        }