privatestaticstring GetDeviceID() { byte[] OutputBuffer =newbyte[256]; Int32 OutputBufferSize, BytesReturned; OutputBufferSize = OutputBuffer.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, OutputBuffer, OutputBufferSize, ref BytesReturned); // If the request failed, exit the method now if (retVal ==false) { returnnull; } // 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(OutputBuffer, 4); Int32 PlatformIDOffset = BitConverter.ToInt32(OutputBuffer, 0xc); Int32 PlatformIDSize = BitConverter.ToInt32(OutputBuffer, 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(OutputBuffer, PresetIDOffset), BitConverter.ToInt16(OutputBuffer, PresetIDOffset +4), BitConverter.ToInt16(OutputBuffer, PresetIDOffset +6), BitConverter.ToInt16(OutputBuffer, 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}", outbuff[i])); } // return the Device ID string return sb.ToString(); }