Re: Geting the unique Identifier of the PPC by Milsnips
Milsnips
Thu Mar 10 04:13:21 CST 2005
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
Module modDevice
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 METHOD_BUFFERED As Int32 = 0
Private FILE_ANY_ACCESS As Int32 = 0
Private FILE_DEVICE_HAL As Int32 = &H101
Private Const ERROR_NOT_SUPPORTED As Int32 = &H32
Private Const ERROR_INSUFFICIENT_BUFFER As Int32 = &H7A
Private IOCTL_HAL_GET_DEVICEID As Int32 = (&H10000 * FILE_DEVICE_HAL) Or
(&H4000 * FILE_ANY_ACCESS) Or (&H4 * 21) Or METHOD_BUFFERED
Public Function GetDeviceID() As String
' Initialize the output buffer to the size of a Win32 DEVICE_ID
structure
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]))
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 Module
enjoy,
Paul
"Abhi Unniyambath" <AbhiUnniyambath@discussions.microsoft.com> wrote in
message news:B1CB153E-9733-4ED3-B44F-E2ED11050203@microsoft.com...
> hi,
>
> How can my program ( .net CF using c#) retrieve the unique Identifier of
> my
> Pocket PC ? ( either UUID or the Asset Tag/Serial Number).
>
> Thnx
> Abhi