Get the Device ID on the Windows Mobile device in compact framework?

8.4k views Asked by At

When I connect to a windows mobile device from the PC using the RAPI API I can get its device ID like so:

using (RemoteDeviceManager r = new RemoteDeviceManager())
{
     using (RemoteDevice dev = r.Devices.FirstConnectedDevice)
     {
         //dev.DeviceId; <--the id
     }
}

How can I get the same 'DeviceId' value on the device itself in compact framework?

2

There are 2 answers

0
AudioBubble On BEST ANSWER

Microsoft published a library article back in 2003 on Retrieving the Windows CE Device ID with the Microsoft .NET Compact Framework that I have been using with success.

[DllImport("coredll.dll")]
private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32 OutputBufferSize, ref Int32 BytesReturned);

private static string GetDeviceID() {
  // Reference: http://msdn.microsoft.com/en-us/library/aa446562.aspx
  byte[] data = new byte[256];
  Int32 OutputBufferSize, BytesReturned;
  OutputBufferSize = data.Length;
  BytesReturned = 0;
  // Call KernelIoControl passing the previously defined IOCTL_HAL_GET_DEVICEID parameter
  // We don’t need to pass any input buffers to this call
  // so InputBuffer and InputBufferSize are set to their null values
  bool retVal = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, data, OutputBufferSize, ref BytesReturned);
  // If the request failed, exit the method now
  if (retVal) {
    // Examine the OutputBuffer byte array to find the start of the 
    // Preset ID and Platform ID, as well as the size of the PlatformID. 
    // PresetIDOffset – The number of bytes the preset ID is offset from the beginning of the structure
    // PlatformIDOffset - The number of bytes the platform ID is offset from the beginning of the structure
    // PlatformIDSize - The number of bytes used to store the platform ID
    // Use BitConverter.ToInt32() to convert from byte[] to int
    Int32 PresetIDOffset = BitConverter.ToInt32(data, 4);
    Int32 PlatformIDOffset = BitConverter.ToInt32(data, 0xc);
    Int32 PlatformIDSize = BitConverter.ToInt32(data, 0x10);

    // Convert the Preset ID segments into a string so they can be 
    // displayed easily.
    StringBuilder sb = new StringBuilder();
    sb.Append(String.Format("{0:X8}-{1:X4}-{2:X4}-{3:X4}-",
         BitConverter.ToInt32(data, PresetIDOffset),
         BitConverter.ToInt16(data, PresetIDOffset + 4),
         BitConverter.ToInt16(data, PresetIDOffset + 6),
         BitConverter.ToInt16(data, PresetIDOffset + 8)));

    // Break the Platform ID down into 2-digit hexadecimal numbers
    // and append them to the Preset ID. This will result in a 
    // string-formatted Device ID
    for (int i = PlatformIDOffset; i < PlatformIDOffset + PlatformIDSize; i++) {
      sb.Append(String.Format("{0:X2}", data[i]));
    }
    // return the Device ID string
    return sb.ToString();
  }
  return null;
}
1
antonio On

the complete code is:

public static class Device 
{
    //http://msdn.microsoft.com/en-us/library/aa446562.aspx
    //These values and the definition of IOCTL_HAL_GET_DEVICEID were taken from the C++ header file, 
    // winioctl.h.
    private static Int32 FILE_DEVICE_HAL = 0x00000101;
    private static Int32 FILE_ANY_ACCESS = 0x0;
    private static Int32 METHOD_BUFFERED = 0x0;

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

    [DllImport("coredll.dll")]
    private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32 OutputBufferSize, ref Int32 BytesReturned);
    public static string GetDeviceID()
    {
        byte[] data = new byte[256];
        Int32 OutputBufferSize, BytesReturned;
        OutputBufferSize = data.Length;
        BytesReturned = 0;
        // Call KernelIoControl passing the previously defined IOCTL_HAL_GET_DEVICEID parameter
        // We don’t need to pass any input buffers to this call
        // so InputBuffer and InputBufferSize are set to their null values
        bool retVal = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, data, OutputBufferSize, ref BytesReturned);
        // If the request failed, exit the method now
        if (retVal)
        {
            // Examine the OutputBuffer byte array to find the start of the 
            // Preset ID and Platform ID, as well as the size of the PlatformID. 
            // PresetIDOffset – The number of bytes the preset ID is offset from the beginning of the structure
            // PlatformIDOffset - The number of bytes the platform ID is offset from the beginning of the structure
            // PlatformIDSize - The number of bytes used to store the platform ID
            // Use BitConverter.ToInt32() to convert from byte[] to int
            Int32 PresetIDOffset = BitConverter.ToInt32(data, 4);
            Int32 PlatformIDOffset = BitConverter.ToInt32(data, 0xc);
            Int32 PlatformIDSize = BitConverter.ToInt32(data, 0x10);

            // Convert the Preset ID segments into a string so they can be 
            // displayed easily.
            StringBuilder sb = new StringBuilder();
            sb.Append(String.Format("{0:X8}-{1:X4}-{2:X4}-{3:X4}-",
                 BitConverter.ToInt32(data, PresetIDOffset),
                 BitConverter.ToInt16(data, PresetIDOffset + 4),
                 BitConverter.ToInt16(data, PresetIDOffset + 6),
                 BitConverter.ToInt16(data, PresetIDOffset + 8)));

            // Break the Platform ID down into 2-digit hexadecimal numbers
            // and append them to the Preset ID. This will result in a 
            // string-formatted Device ID
            for (int i = PlatformIDOffset; i < PlatformIDOffset + PlatformIDSize; i++)
            {
                sb.Append(String.Format("{0:X2}", data[i]));
            }
            // return the Device ID string
            return sb.ToString();
        }
        // if null call 
        // "If the OEM has provided support for the IOCTL_HAL_GET_DEVICEID IOCTL, KernelIoControl will return true.
        // If the OEM has not provided support for IOCTL_HAL_GET_DEVICEID, or the request fails, then false is returned. 
        // If false is returned, call Marshal.GetLastWin32Error for details. An error code of 122 indicates that
        // the allocated DEVICE_ID buffer is too small to store all the information. In this situation,
        // the first 4 bytes of OutputBuffer will contain the required buffer size. 
        //Simply reallocate the size of OutputBuffer and request the information again."
        return null;
    }
}

then For instance:

var deviceId = Device.GetDeviceID();
Debug.WriteLine(string.Format("Device Id {0}", deviceId));

Thank you jp2code.

I just completed the dots. Working for me in Windows Compact 7

EDIT: Ref:https://msdn.microsoft.com/en-us/library/ee478480.aspx 10/16/2014 This I/O control (IOCTL_HAL_GET_DEVICEID) is deprecated. Its functionality has been integrated into IOCTL_HAL_GET_DEVICE_INFO.

antonio