mobile中如何取得设备ID呢?
请看下面的代码(实在懒的写太多的话了^_^)
Declare
Function KernelIoControl()
Function KernelIoControl Lib "coredll" (ByVal dwIoControlCode As Integer, ByVal lpInBuf As IntPtr, ByVal nInBufSize As Integer, ByVal lpOutBuf() As Byte, ByVal nOutBufSize As Integer, ByRef lpBytesReturned As Integer) As Integer
Private Const IOCTL_HAL_GET_DEVICEID As Int32 = 16842836
Public Function GetSerialNumberFromKernelIoControl()Function GetSerialNumberFromKernelIoControl() As String
Dim dwOutBytes As Integer
Dim nBuffSize As Integer
Dim strDeviceId As String
nBuffSize = 4096
Dim arrOutBuff(4096) As Byte
Dim res As Boolean
res = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, arrOutBuff, nBuffSize, dwOutBytes)
If res <> False Then
MsgBox(res.ToString)
MsgBox(dwOutBytes.ToString)
Dim strDeviceInfo As String = ""
Dim i As Integer
Dim strNextChar As String = ""
For i = 1 To dwOutBytes
strNextChar = arrOutBuff(i).ToString
strDeviceInfo = strDeviceInfo + strNextChar
Next
strDeviceId = strDeviceInfo
Return strDeviceId
End If
End Function
Private Const IOCTL_HAL_GET_DEVICEID As Int32 = 16842836
Public Function GetSerialNumberFromKernelIoControl()Function GetSerialNumberFromKernelIoControl() As String
Dim dwOutBytes As Integer
Dim nBuffSize As Integer
Dim strDeviceId As String
nBuffSize = 4096
Dim arrOutBuff(4096) As Byte
Dim res As Boolean
res = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, arrOutBuff, nBuffSize, dwOutBytes)
If res <> False Then
MsgBox(res.ToString)
MsgBox(dwOutBytes.ToString)
Dim strDeviceInfo As String = ""
Dim i As Integer
Dim strNextChar As String = ""
For i = 1 To dwOutBytes
strNextChar = arrOutBuff(i).ToString
strDeviceInfo = strDeviceInfo + strNextChar
Next
strDeviceId = strDeviceInfo
Return strDeviceId
End If
End Function
再添加一个c#版的
public
class
GetDeviceInf
... {
[DllImport("coredll.dll")]
private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr
InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32
OutputBufferSize, ref Int32 BytesReturned);
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);
private static string GetDeviceID()
...{
byte[] OutputBuffer = new byte[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
// 运行上面定义的函数 KernelIoControl
// 并传递前面已经定义了的静态变量作为参数
// 我们不需要输入任何缓存到这个函数
// 因此InputBuffer和InputBufferSize两个形参传递实参null
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)
...{
return null;
}
// Examine the OutputBuffer byte array to find the start of the
// Preset ID and Platform ID, as well as the size of the
// PlatformID.
//检查输出数组缓存去寻找 Platform ID以及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);
//将Preset ID转换成string便于显示
// Convert the Preset ID segments into a string so they can be
// displayed easily.
System.Text.StringBuilder sb = new System.Text.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))
);
//将Platform ID分解成16进制的数字附加到Preset ID上
//这将形成一个格式化了的Device ID字符串
// 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}", OutputBuffer[i]));
}
// return the Device ID string
//返回Device ID字符串
return sb.ToString();
}
}
... {
[DllImport("coredll.dll")]
private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr
InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32
OutputBufferSize, ref Int32 BytesReturned);
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);
private static string GetDeviceID()
...{
byte[] OutputBuffer = new byte[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
// 运行上面定义的函数 KernelIoControl
// 并传递前面已经定义了的静态变量作为参数
// 我们不需要输入任何缓存到这个函数
// 因此InputBuffer和InputBufferSize两个形参传递实参null
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)
...{
return null;
}
// Examine the OutputBuffer byte array to find the start of the
// Preset ID and Platform ID, as well as the size of the
// PlatformID.
//检查输出数组缓存去寻找 Platform ID以及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);
//将Preset ID转换成string便于显示
// Convert the Preset ID segments into a string so they can be
// displayed easily.
System.Text.StringBuilder sb = new System.Text.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))
);
//将Platform ID分解成16进制的数字附加到Preset ID上
//这将形成一个格式化了的Device ID字符串
// 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}", OutputBuffer[i]));
}
// return the Device ID string
//返回Device ID字符串
return sb.ToString();
}
}
HUST:Eric