Imports System Imports System.Drawing Imports System.Collections Imports System.ComponentModel Imports System.Diagnostics Imports System.Windows.Forms Imports System.Runtime.InteropServices Imports System.Text Public Class devid Declare Function KernelIoControl Lib "CoreDll.dll" (ByVal dwIoControlCode As Int32, ByVal lpInBuf As IntPtr, ByVal nInBufSize As Int32, ByVal lpOutBuf() As Byte, ByVal nOutBufSize As Int32, ByRef lpBytesReturned As Int32) As Boolean Private Shared METHOD_BUFFERED As Int32 = 0 Private Shared FILE_ANY_ACCESS As Int32 = 0 Private Shared FILE_DEVICE_HAL As Int32 = &H101 Private Const ERROR_NOT_SUPPORTED As Int32 = &H32 Private Const ERROR_INSUFFICIENT_BUFFER As Int32 = &H7A Private Shared IOCTL_HAL_GET_DEVICEID As Int32 = (&H10000 * FILE_DEVICE_HAL) Or (&H4000 * FILE_ANY_ACCESS) Or (&H4 * 21) Or METHOD_BUFFERED Public Shared Function GetDeviceID() As String ' Dim outbuff(19) As Byte Dim dwOutBytes As Int32 Dim done As Boolean = False Dim nBuffSize As Int32 = 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 Not done If KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, outbuff, nBuffSize, dwOutBytes) Then done = True Else Dim [error] As Integer = Marshal.GetLastWin32Error() Select Case [error] Case ERROR_NOT_SUPPORTED ' Throw New NotSupportedException("IOCTL_HAL_GET_DEVICEID is not supported on this device", New Win32Exception([error])) Return "nomid" 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) Case Else Throw New Win32Exception([error], "Unexpected error") End Select End If End While Dim dwPresetIDOffset As Int32 = BitConverter.ToInt32(outbuff, &H4) ' DEVICE_ID.dwPresetIDOffset Dim dwPresetIDSize As Int32 = BitConverter.ToInt32(outbuff, &H8) ' DEVICE_ID.dwPresetIDSize Dim dwPlatformIDOffset As Int32 = BitConverter.ToInt32(outbuff, &HC) ' DEVICE_ID.dwPlatformIDOffset Dim dwPlatformIDSize As Int32 = BitConverter.ToInt32(outbuff, &H10) ' DEVICE_ID.dwPlatformIDBytes Dim sb As New StringBuilder Dim i As Integer For i = dwPresetIDOffset To (dwPresetIDOffset + dwPresetIDSize) - 1 sb.Append(String.Format("{0:X2}", outbuff(i))) Next i sb.Append("-") For i = dwPlatformIDOffset To (dwPlatformIDOffset + dwPlatformIDSize) - 1 sb.Append(String.Format("{0:X2}", outbuff(i))) Next i Return sb.ToString() End Function End Class