在windows mobile下怎么用C#读取SD Card ID?
每次在DeviceIoControl后,就退出了。
请问是为什么?
现在的代码如下:
#region 常量定义 const uint GENERIC_READ = 0×80000000;
const int OPEN_EXISTING = 3;
const uint FILE_SHARE_READ = 0×00000001;
const uint FILE_SHARE_WRITE = 0×00000002;
const uint FILE_DEVICE_DISK = 0×00000007;
const uint METHOD_BUFFERED = 0;
const uint FILE_ANY_ACCESS = 0;
const uint E_FAIL = 0×80004005;
#endregion #region 函数封送声明 [DllImport("coredll.dll")]
private static extern uint CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
uint lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
uint hTemplateFile
); [DllImport("coredll.dll", SetLastError = true)]
private static extern bool DeviceIoControl(
uint hDevice,
uint dwIoControlCode,
uint lpInBuf /* set to 0 */,
uint nInBufSize /* set to 0 */,
[In, Out] byte[] lpOutBuf,
uint nOutBufSize,
out uint lpBytesReturned,
uint lpOverlapped); #endregion #region 公有方法 public bool GetStorageCardID(ref string szIMSI)
{
uint hDisk = CreateFile("DSK1:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if ((int)hDisk == 0xFFFF)
{
return false;
}
else
{
Byte[] pStoreInfo = new Byte[3000];uint dwBytesRet; uint IOCTL_DISK_GET_STORAGEID = CTL_CODE(FILE_DEVICE_DISK,0×709,METHOD_BUFFERED,FILE_ANY_ACCESS);if (!DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, 0, 0, pStoreInfo, 3000, out dwBytesRet, 0))
{
//每次都进入这里
return false;
}
else
{
int dwSize = BitConverter.ToInt32(pStoreInfo, 0);
int dwSerialNumOffset = BitConverter.ToInt32(pStoreInfo, 12);
int dwSerialNumCount = dwSize – dwSerialNumOffset – 2;
Byte[] StorageCardID = new Byte[dwSerialNumCount];
Array.Copy(pStoreInfo,dwSerialNumOffset, StorageCardID, 0, dwSerialNumCount);
szIMSI = Encoding.ASCII.GetString(StorageCardID, 0, dwSerialNumCount);
return true;
}
}
}
#endregion #region 私有方法 private uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
{
return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method);
} #endregion
每次在DeviceIoControl后,就退出了。
请问是为什么?
现在的代码如下:
#region 常量定义 const uint GENERIC_READ = 0×80000000;
const int OPEN_EXISTING = 3;
const uint FILE_SHARE_READ = 0×00000001;
const uint FILE_SHARE_WRITE = 0×00000002;
const uint FILE_DEVICE_DISK = 0×00000007;
const uint METHOD_BUFFERED = 0;
const uint FILE_ANY_ACCESS = 0;
const uint E_FAIL = 0×80004005;
#endregion #region 函数封送声明 [DllImport("coredll.dll")]
private static extern uint CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
uint lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
uint hTemplateFile
); [DllImport("coredll.dll", SetLastError = true)]
private static extern bool DeviceIoControl(
uint hDevice,
uint dwIoControlCode,
uint lpInBuf /* set to 0 */,
uint nInBufSize /* set to 0 */,
[In, Out] byte[] lpOutBuf,
uint nOutBufSize,
out uint lpBytesReturned,
uint lpOverlapped); #endregion #region 公有方法 public bool GetStorageCardID(ref string szIMSI)
{
uint hDisk = CreateFile("DSK1:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if ((int)hDisk == 0xFFFF)
{
return false;
}
else
{
Byte[] pStoreInfo = new Byte[3000];uint dwBytesRet; uint IOCTL_DISK_GET_STORAGEID = CTL_CODE(FILE_DEVICE_DISK,0×709,METHOD_BUFFERED,FILE_ANY_ACCESS);if (!DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, 0, 0, pStoreInfo, 3000, out dwBytesRet, 0))
{
//每次都进入这里
return false;
}
else
{
int dwSize = BitConverter.ToInt32(pStoreInfo, 0);
int dwSerialNumOffset = BitConverter.ToInt32(pStoreInfo, 12);
int dwSerialNumCount = dwSize – dwSerialNumOffset – 2;
Byte[] StorageCardID = new Byte[dwSerialNumCount];
Array.Copy(pStoreInfo,dwSerialNumOffset, StorageCardID, 0, dwSerialNumCount);
szIMSI = Encoding.ASCII.GetString(StorageCardID, 0, dwSerialNumCount);
return true;
}
}
}
#endregion #region 私有方法 private uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
{
return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method);
} #endregion
本内容使用CSDN小秘书回复
每天回帖即可得10分可用分!
*************************************************[/align]