请问如何在pc端获取USB读卡器里SD卡的CID 信息???用VC++的。

[复制链接]
 楼主| MOSHEN 发表于 2013-7-15 14:51 | 显示全部楼层 |阅读模式
请问如何在pc端获取USB读卡器里SD卡的CID 信息???用VC++的。
下面的代码是否可以获取sd卡cid信息??
为什么 DeviceIoControl()返回0,GetLastError();返回为50,不支持请求。错在哪里了。跪求指导。。。
  1. void GetSD_CID()
  2. {
  3.   // TODO: Add your control notification handler code here
  4.   //CComboBoxEx * pComBox = (CComboBoxEx *) GetDlgItem(IDC_COMBO1);
  5.   TCHAR StrDeviceName[64] = {0};
  6.   wsprintf(StrDeviceName,_T("\\\\.\\%C:"),'G'/*pComBox->GetCurSel()*/);
  7.   // Create device handle
  8.   HANDLE hVol = CreateFile(StrDeviceName,
  9.     GENERIC_READ|GENERIC_WRITE,                // no access to the drive
  10.     FILE_SHARE_READ | // share mode
  11.     FILE_SHARE_WRITE,
  12.     NULL,             // default security attributes
  13.     OPEN_EXISTING,    // disposition
  14.     0,                // file attributes
  15.     NULL);            // do not copy file attributes
  16.   //CString strOutputMsg;
  17.   UCHAR ucSDCID[SD_CID_LENGTH] = {0};
  18.   if(INVALID_HANDLE_VALUE != hVol && NULL != hVol){
  19.     // Structure used in IOCTL_SFFDISK_DEVICE_COMMAND
  20.     // The layout of the buffer passed to this IOCTL is as follows:
  21.     //
  22.     //        +-----------------------------+
  23.     //        | header (this structure)     |
  24.     //        +-----------------------------+
  25.     //        | protocol arguments          |
  26.     //        +-----------------------------+
  27.     //        | device data buffer          |
  28.     //        +-----------------------------+
  29.     //
  30.     // The actual layout of the protocol arguments depends on the protocol of
  31.     // the target device. So as an example, if the target device an SD (Secure Digital)
  32.     // storage device, then the protocol arguments would consist of an SDCMD_DESCRIPTOR,
  33.     // which is defined in SDDEF.H. The SD argument for the command should be stored
  34.     // in the "Information" field of this structure. In that case, ProtocolArgumentSize
  35.     // would be sizeof(SDCMD_DESCRIPTOR).
  36.     //
  37.     // The three size fields in the structure (HeaderSize, ProtocolArgumentSize,
  38.     // DeviceDataBufferSize) each hold the length in bytes of each respective area as
  39.     // described by the diagram above. Thus, the entire length of the buffer must be
  40.     // at least as large as the sum of these three fields.
  41.     //
  42.     int nSizeOfCmd = sizeof(SFFDISK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR) + SD_CID_LENGTH;
  43.     SFFDISK_DEVICE_COMMAND_DATA *pCmdBuf = (SFFDISK_DEVICE_COMMAND_DATA*) new BYTE[nSizeOfCmd];
  44.         SFFDISK_DEVICE_COMMAND_DATA *pCmdBufout = (SFFDISK_DEVICE_COMMAND_DATA*) new BYTE[nSizeOfCmd];
  45.     ULONG_PTR info = 0;
  46.     memset(pCmdBuf, 0, nSizeOfCmd);      
  47.     pCmdBuf->HeaderSize = sizeof (SFFDISK_DEVICE_COMMAND_DATA);
  48.     pCmdBuf->Command = SFFDISK_DC_DEVICE_COMMAND;
  49.     pCmdBuf->ProtocolArgumentSize = sizeof (SDCMD_DESCRIPTOR);
  50.     pCmdBuf->DeviceDataBufferSize = SD_CID_LENGTH;
  51.     pCmdBuf->Information = info;
  52.     ///Command protocol
  53.     SDCMD_DESCRIPTOR sdCmdDescriptor = { 0 };
  54.     sdCmdDescriptor.Cmd = SFFDISK_SC_GET_CARD_VERSION;   // Issue CMD10 to driver
  55.     sdCmdDescriptor.CmdClass = SDCC_STANDARD;
  56.     sdCmdDescriptor.TransferDirection = SDTD_READ;
  57.     sdCmdDescriptor.TransferType = SDTT_CMD_ONLY;
  58.     sdCmdDescriptor.ResponseType = SDRT_1;      
  59. /*    memcpy((BYTE *)(&(pCmdBuf->Data[0])), &sdCmdDescriptor, sizeof(SDCMD_DESCRIPTOR));   */   
  60.     memcpy(pCmdBuf->Data, &sdCmdDescriptor, sizeof(SDCMD_DESCRIPTOR));   
  61.     DWORD dwBytesReturned = 0;
  62.     BOOL bResult = DeviceIoControl(hVol,
  63.       IOCTL_SFFDISK_DEVICE_COMMAND,
  64.       pCmdBuf,
  65.       nSizeOfCmd,
  66.       pCmdBufout,
  67.       nSizeOfCmd,
  68.       &dwBytesReturned,
  69.       NULL);      
  70.     DWORD dwErr = GetLastError();
  71.     CloseHandle(hVol);
  72.     int nCIDBaseIndex = sizeof(SDCMD_DESCRIPTOR);
  73.     if(!bResult){
  74.       printf("Failed to get CID, err code is |%d|",dwErr);
  75.     }else{
  76.     }
  77.     ////////////////////////////////////////////////////////////////
  78.     delete [] pCmdBuf;
  79.   }else{
  80.     //strOutputMsg.Format(L"Failed to open device handle |%s|", StrDeviceName);
  81.   }
  82. }
Richiezeng 发表于 2018-8-24 10:21 | 显示全部楼层
似乎不能通过读卡器读到SD卡里的CID,读出来的应该是读卡器的信息吧?我们生产的SD卡要看CID都是通过特别硬件治具,再加上特殊软件,才可以显示出来的呢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部