zoukankan      html  css  js  c++  java
  • 获取设备 ID 和名称

    获取设备 ID 和名称

    .NET Framework 3.5
     
    其他版本
     

    更新:2007 年 11 月

    要获取设备的名称,请使用 Dns.GetHostName 属性。通常情况下,默认名称为“PocketPC”。

    示例
     
     

    本示例在加载窗体时在消息框中显示设备的 ID 和名称。

    要获取设备 ID 或序列号,您必须使用平台调用来访问本机 Windows CE KernelIoControl 函数。

     
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace DeviceID
    {
        /// <summary>
        /// Summary description for DeviceID.
        /// </summary>
        public class DeviceID : System.Windows.Forms.Form
        {
    
        public DeviceID()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
    
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
            }
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                base.Dispose( disposing );
            }
    
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                // 
                // DeviceID
                // 
                this.Text = "DeviceID";
                this.Load += new System.EventHandler(this.DeviceID_Load);
    
            }
            static void Main() 
            {
                Application.Run(new DeviceID());
            }
            #endregion
    
            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);
    
            private static string GetDeviceID()
            {
                // 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 is not 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");
                        }
                    }
                }
    
                // Copy the elements of the DEVICE_ID structure.
                Int32 dwPresetIDOffset = BitConverter.ToInt32(outbuff, 0x4);
                Int32 dwPresetIDSize = BitConverter.ToInt32(outbuff, 0x8);
                Int32 dwPlatformIDOffset = BitConverter.ToInt32(outbuff, 0xc);
                Int32 dwPlatformIDSize = BitConverter.ToInt32(outbuff, 0x10);
                StringBuilder sb = new StringBuilder();
    
                for (int i = dwPresetIDOffset; 
                    i < dwPresetIDOffset + dwPresetIDSize; i++)
                {
                    sb.Append(String.Format("{0:X2}", outbuff[i]));
                }
    
                sb.Append("-");
    
                for (int i = dwPlatformIDOffset; 
                    i < dwPlatformIDOffset + dwPlatformIDSize; i ++ )  
                {
                    sb.Append( String.Format("{0:X2}", outbuff[i]));
                }
                return sb.ToString();
            }
    
            private void DeviceID_Load(object sender, System.EventArgs e)
            {
                try 
                {
                    // Show the device ID.
                    string strDeviceID = GetDeviceID();
                    MessageBox.Show("Device ID: " + strDeviceID);
    
                    // Show the device name.
                    string deviceName = System.Net.Dns.GetHostName();
                    MessageBox.Show("Device Name: " + deviceName);
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
        }
    }
    
    
    

    下表列出了本机 KernelIoControl 函数参数。所有参数均是 32 位。

     

    参数

    Win32 类型

    托管类型

    典型值

    dwIoControlCode

    DWORD

    Int32

    IOCTL_HAL_GET_DEVICEID

    lpInBuf

    LPVOID

    IntPtr

    IntPtr.Zero(不要求输入数据)

    nInBufSize

    DWORD

    Int32

    0(不要求输入数据)

    lpOutBuf

    LPVOID*

    Int32

    含 20 个元素的Byte 数组(DEVICE_ID 结构的大小为 20 字节)

    nOutBufSize

    DWORD

    Int32

    20

    lpBytesReturned

    LPWORD

    refInt32

    0

    lpOutBuf 参数具有以下结构:

     
    struct DEVICE_ID
    {
        int dwSize;
        int dwPresetIDOffset;
        int dwPresetIDBytes;
        int dwPlatformIDOffset;
        int dwPlatformIDBytes;
    }
    

    返回值和错误处理

    如果将设备 ID 复制到了输出缓冲区,KernelIoControl 函数返回 true;否则,它会返回 false。如果 KernelIoControl 失败,请调用托管GetLastWin32Error 方法以获取 Win32 错误代码。错误代码可能是下列代码中的任意一种:

    • ERROR_NOT_SUPPORTED - 指示设备不执行 IOCTL_HAL_GET_DEVICEID 控制代码。

    • ERROR_INSUFFICIENT_BUFFER - 指示输出缓冲区不够大,无法容纳设备 ID。由 DEVICE_ID 结构中的 dwSize 指定的所需字节数在输出缓冲区的前四个字节中返回。如果发生此错误,请将输出缓冲区重新分配为 dwSize 指定的大小,然后再次调用 KernelIoControl

  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/skyay/p/5856400.html
Copyright © 2011-2022 走看看