目前需要在XP系统下读到SD卡的ID号。网上的资料基本都是在winCE下读到的,用的都是DeviceIoControl()这个API。使用这个API之前需要先得到SD卡的设备句柄,是通过CreateFile()得到的。目前我在windows xp下能得到sd卡的设备句柄,值为0x0f70。但是用到DeviceIoControl()时,第二个参数IOCTL,不知道给一个什么IOCTL值进去(应该是Disk类设备的操作符),我试了很多的参数,像IOCTL_STORAGE_GET_DEVICE_NUMBER,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER等,都得到无效的返回。哪位大哥有过经验或者建议,多多指导。

解决方案 »

  1.   

    // IOCTL_STORAGE_QUERY_PROPERTY ?
      

  2.   

    #include "winioctl.h"#include "storemgr.h"#define IOCTL_DISK_GET_STORAGEID CTL_CODE(FILE_DEVICE_DISK,0x709,METHOD_BUFFERED,FILE_ANY_ACCESS)typedef struct _STORAGE_IDENTIFICATION{    DWORD dwSize;    DWORD dwFlags;    DWORD dwManufactureIDOffset;    DWORD dwSerialNumOffset;} STORAGE_IDENTIFICATION, *PSTORAGE_IDENTIFICATION;unsigned char* GetStroageID(LPCTSTR szDisk);unsigned char* GetStroageID(LPCTSTR szDisk){    //HANDLE hDisk = CreateFile(_T("DSK1:"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);     HANDLE hDisk = CreateFile(szDisk, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);     if (!hDisk) return FALSE;    PSTORAGE_IDENTIFICATION pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[3000];    DWORD dwBytesRet;    if (!DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, NULL, 0, pStoreInfo, 3000, &dwBytesRet, NULL))    {        DWORD err = GetLastError();         delete [] pStoreInfo;         CloseHandle(hDisk);         return FALSE;     }    BYTE *ManuID = (((BYTE *)pStoreInfo) + pStoreInfo->dwManufactureIDOffset);     BYTE *SerialNo = (((BYTE *)pStoreInfo) + pStoreInfo->dwSerialNumOffset);    return SerialNo;}
    据说有人成功过
      

  3.   

    详见:
    http://coderask.com/?qa=25209/%E9%80%9A%E8%BF%87deviceiocontrol%E8%AF%BBsd%E5%8D%A1id