DeclareFunction KernelIoControl()Function KernelIoControl Lib"coredll" (ByVal dwIoControlCode AsInteger, ByVal lpInBuf As IntPtr, ByVal nInBufSize AsInteger, ByVal lpOutBuf() AsByte, ByVal nOutBufSize AsInteger, ByRef lpBytesReturned AsInteger) AsInteger PrivateConst IOCTL_HAL_GET_DEVICEID As Int32 =16842836 PublicFunction GetSerialNumberFromKernelIoControl()Function GetSerialNumberFromKernelIoControl() AsString Dim dwOutBytes AsInteger Dim nBuffSize AsInteger Dim strDeviceId AsString nBuffSize =4096 Dim arrOutBuff(4096) AsByte Dim res AsBoolean res = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, arrOutBuff, nBuffSize, dwOutBytes) If res <>FalseThen MsgBox(res.ToString) MsgBox(dwOutBytes.ToString) Dim strDeviceInfo AsString="" Dim i AsInteger Dim strNextChar AsString="" For i =1To dwOutBytes strNextChar = arrOutBuff(i).ToString strDeviceInfo = strDeviceInfo + strNextChar Next strDeviceId = strDeviceInfo Return strDeviceId EndIf End Function
再添加一个c#版的
publicclass GetDeviceInf ...{ [DllImport("coredll.dll")] privatestaticexternbool KernelIoControl(Int32 IoControlCode, IntPtr InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32 OutputBufferSize, ref Int32 BytesReturned); privatestatic Int32 FILE_DEVICE_HAL =0x00000101; privatestatic Int32 FILE_ANY_ACCESS =0x0; privatestatic Int32 METHOD_BUFFERED =0x0; privatestatic Int32 IOCTL_HAL_GET_DEVICEID = ((FILE_DEVICE_HAL) <<16) | ((FILE_ANY_ACCESS) <<14) | ((21) <<2) | (METHOD_BUFFERED); 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 // 运行上面定义的函数 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) ...{ 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. //检查输出数组缓存去寻找 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(); } }
mobile中如何取得设备ID呢? 请看下面的代码(实在懒的写太多的话了^_^)Declare Function KernelIoControl()Function KernelIoControl Lib "coredll" (ByVal dwIoControlCode As Integer, ByVal lpInBuf As IntPtr, ByVal nInBufSize A