请问如何在pc端获取USB读卡器里SD卡的CID 信息???用VC++的。
下面的代码是否可以获取sd卡cid信息??
为什么 DeviceIoControl()返回0,GetLastError();返回为50,不支持请求。错在哪里了。跪求指导。。。void GetSD_CID()
{
// TODO: Add your control notification handler code here
//CComboBoxEx * pComBox = (CComboBoxEx *) GetDlgItem(IDC_COMBO1);
TCHAR StrDeviceName[64] = {0};
wsprintf(StrDeviceName,_T("\\\\.\\%C:"),'G'/*pComBox->GetCurSel()*/);
// Create device handle
HANDLE hVol = CreateFile(StrDeviceName,
GENERIC_READ|GENERIC_WRITE, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
//CString strOutputMsg;
UCHAR ucSDCID[SD_CID_LENGTH] = {0};
if(INVALID_HANDLE_VALUE != hVol && NULL != hVol){
// Structure used in IOCTL_SFFDISK_DEVICE_COMMAND
// The layout of the buffer passed to this IOCTL is as follows:
//
// +-----------------------------+
// | header (this structure) |
// +-----------------------------+
// | protocol arguments |
// +-----------------------------+
// | device data buffer |
// +-----------------------------+
//
// The actual layout of the protocol arguments depends on the protocol of
// the target device. So as an example, if the target device an SD (Secure Digital)
// storage device, then the protocol arguments would consist of an SDCMD_DESCRIPTOR,
// which is defined in SDDEF.H. The SD argument for the command should be stored
// in the "Information" field of this structure. In that case, ProtocolArgumentSize
// would be sizeof(SDCMD_DESCRIPTOR).
//
// The three size fields in the structure (HeaderSize, ProtocolArgumentSize,
// DeviceDataBufferSize) each hold the length in bytes of each respective area as
// described by the diagram above. Thus, the entire length of the buffer must be
// at least as large as the sum of these three fields.
//
int nSizeOfCmd = sizeof(SFFDISK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR) + SD_CID_LENGTH;
SFFDISK_DEVICE_COMMAND_DATA *pCmdBuf = (SFFDISK_DEVICE_COMMAND_DATA*) new BYTE[nSizeOfCmd];
SFFDISK_DEVICE_COMMAND_DATA *pCmdBufout = (SFFDISK_DEVICE_COMMAND_DATA*) new BYTE[nSizeOfCmd];
ULONG_PTR info = 0;
memset(pCmdBuf, 0, nSizeOfCmd);
pCmdBuf->HeaderSize = sizeof (SFFDISK_DEVICE_COMMAND_DATA);
pCmdBuf->Command = SFFDISK_DC_DEVICE_COMMAND;
pCmdBuf->ProtocolArgumentSize = sizeof (SDCMD_DESCRIPTOR);
pCmdBuf->DeviceDataBufferSize = SD_CID_LENGTH;
pCmdBuf->Information = info;
///Command protocol
SDCMD_DESCRIPTOR sdCmdDescriptor = { 0 };
sdCmdDescriptor.Cmd = SFFDISK_SC_GET_CARD_VERSION; // Issue CMD10 to driver
sdCmdDescriptor.CmdClass = SDCC_STANDARD;
sdCmdDescriptor.TransferDirection = SDTD_READ;
sdCmdDescriptor.TransferType = SDTT_CMD_ONLY;
sdCmdDescriptor.ResponseType = SDRT_1;
/* memcpy((BYTE *)(&(pCmdBuf->Data[0])), &sdCmdDescriptor, sizeof(SDCMD_DESCRIPTOR)); */
memcpy(pCmdBuf->Data, &sdCmdDescriptor, sizeof(SDCMD_DESCRIPTOR));
DWORD dwBytesReturned = 0;
BOOL bResult = DeviceIoControl(hVol,
IOCTL_SFFDISK_DEVICE_COMMAND,
pCmdBuf,
nSizeOfCmd,
pCmdBufout,
nSizeOfCmd,
&dwBytesReturned,
NULL);
DWORD dwErr = GetLastError();
CloseHandle(hVol);
int nCIDBaseIndex = sizeof(SDCMD_DESCRIPTOR);
if(!bResult){
printf("Failed to get CID, err code is |%d|",dwErr);
}else{
}
////////////////////////////////////////////////////////////////
delete [] pCmdBuf;
}else{
//strOutputMsg.Format(L"Failed to open device handle |%s|", StrDeviceName);
}
}
|