c# wince 取设备号

17 篇文章 0 订阅

wince设备,有时为了做软件保护,采取注册限制,需要取设备的序列号,以下为通用的取法,网上抄的。

using   System; 
using   System.Collections.Generic; 
using   System.ComponentModel; 
using   System.Data; 
using   System.Drawing; 
using   System.Text; 
using   System.Windows.Forms; 
using   System.Collections; 
using   System.Diagnostics; 
using   System.Runtime.InteropServices; 
using   System.IO; 
using   System.Security.Cryptography;

namespace Check
{
    class LiangDeviceID
    {
        private static string[] strEncrypt = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP" };
        private   static   Int32   METHOD_BUFFERED   =   0; 
        private   static   Int32   FILE_ANY_ACCESS   =   0; 
        private   static   Int32   FILE_DEVICE_HAL   =   0x00000101; 

        private   const   Int32   ERROR_NOT_SUPPORTED   =   0x32; 
        private   const   Int32   ERROR_INSUFFICIENT_BUFFER   =   0x7A; 


        private   static   Int32   IOCTL_HAL_GET_DEVICEID   =   ((FILE_DEVICE_HAL)   <<   16)   |   ((FILE_ANY_ACCESS)   <<   14)   |   ((21)   <<   2)   |   (METHOD_BUFFERED); 


        [DllImport( "coredll.dll",   SetLastError   =   true)] 
        private   static   extern   bool   KernelIoControl(Int32   dwIoControlCode,   IntPtr   lpInBuf,   Int32   nInBufSize,   byte[]   lpOutBuf,   Int32   nOutBufSize,   ref   Int32   lpBytesReturned); 

        public   static   string   GetDeviceID() 
        { 
            try
            {
                //   Initialize   the   output   buffer   to   the   size   of   a   Win32   DEVICE_ID   structure 
                byte[] outbuff = new byte[20];
                Int32 dwOutBytes;
                bool done = false;

                Int32 nBuffSize = outbuff.Length;

                //   Set   DEVICEID.dwSize   to   size   of   buffer.     Some   platforms   look   at 
                //   this   field   rather   than   the   nOutBufSize   param   of   KernelIoControl 
                //   when   determining   if   the   buffer   is   large   enough. 
                // 
                BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
                dwOutBytes = 0;


                //   Loop   until   the   device   ID   is   retrieved   or   an   error   occurs 
                while (!done)
                {
                    if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, outbuff, nBuffSize, ref   dwOutBytes))
                    {
                        done = true;
                    }
                    else
                    {
                        int error = Marshal.GetLastWin32Error();
                        switch (error)
                        {
                            case ERROR_NOT_SUPPORTED:
                                throw new NotSupportedException("IOCTL_HAL_GET_DEVICEID   is   not   supported   on   this   device ", new Win32Exception(error));

                            case ERROR_INSUFFICIENT_BUFFER:
                                //   The   buffer   wasn 't   big   enough   for   the   data.     The 
                                //   required   size   is   in   the   first   4   bytes   of   the   output 
                                //   buffer   (DEVICE_ID.dwSize). 
                                nBuffSize = BitConverter.ToInt32(outbuff, 0);
                                outbuff = new byte[nBuffSize];

                                //   Set   DEVICEID.dwSize   to   size   of   buffer.     Some 
                                //   platforms   look   at   this   field   rather   than   the 
                                //   nOutBufSize   param   of   KernelIoControl   when 
                                //   determining   if   the   buffer   is   large   enough. 
                                // 
                                BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
                                break;

                            default:
                                throw new Win32Exception(error, "Unexpected   error ");
                        }
                    }
                }

                Int32 dwPresetIDOffset = BitConverter.ToInt32(outbuff, 0x4);         //   DEVICE_ID.dwPresetIDOffset 
                Int32 dwPresetIDSize = BitConverter.ToInt32(outbuff, 0x8);             //   DEVICE_ID.dwPresetSize 
                Int32 dwPlatformIDOffset = BitConverter.ToInt32(outbuff, 0xc);     //   DEVICE_ID.dwPlatformIDOffset 
                Int32 dwPlatformIDSize = BitConverter.ToInt32(outbuff, 0x10);       //   DEVICE_ID.dwPlatformIDBytes 
                StringBuilder sb = new StringBuilder();

                for (int i = dwPresetIDOffset; i < dwPresetIDOffset + dwPresetIDSize; i++)
                {
                    //sb.Append(String.Format( "{0:X2} ",   outbuff[i]));
                    sb.Append(String.Format("{0} ", outbuff[i]));
                }

                //sb.Append("- ");
                //for (int i = dwPlatformIDOffset; i < dwPlatformIDOffset + dwPlatformIDSize; i++)
                //{
                //    //sb.Append(String.Format( "{0:X2} ",   outbuff[i]));
                //    sb.Append(String.Format("{0} ", outbuff[i]));

                //}
                return sb.ToString(); 
            }
            catch (System.Exception e)
            {
                MessageBox.Show("取设备序列号异常"+e.Message );
                StringBuilder sb = new StringBuilder();
                sb.Append("austec 010-59713137");
                return sb.ToString();
            }
        } 

        public static string GetEncrypt( string strDeviceID )
        {
            int i, no;
            
            StringBuilder   sb   =   new   StringBuilder();
            for (i = 0; i < strDeviceID.Length; i++)
            {
                try
                {
                    no = int.Parse(strDeviceID[i].ToString());
                }
                catch (System.Exception ex)
                {
                    no =1;
                }
               
                if (no > strEncrypt.Length)
                    no = no%strEncrypt.Length;
                sb.Append(String.Format( "{0}", strEncrypt[no]) );
            }

            return sb.ToString();
        }
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值