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;
using System.Text.RegularExpressions;
namespace SmartDeviceProject7
{
class CheckDev
{
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 Regex.Replace(sb.ToString(), @"\s", "");//去掉获取字符串中的空格
}
catch (System.Exception e)
{
MessageBox.Show("取设备序列号异常" + e.Message);
StringBuilder sb = new StringBuilder();
sb.Append("请联系我们:037167868667");
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();
}
///
///判断设备是否为我公司授权
///
public static bool Check()
{
string[] _UUID = { "13726218220181307811040", "87010501100100011101190115032067069000" };//为设备号
string uuid = GetDeviceID();
foreach (string str2 in _UUID)
{
if (str2 == uuid)
{
return true;
}
}
return false ;
}
}
}