获取SD卡序列号和厂商ID

转自:http://honwsn.itpub.net/post/41648/499730
wince 存储设备有两个名称,
一个设备名称CreateFile打开设备获取句柄的时候要用的,如DSK1:
一个是存储名称,如Mircosoft Flash Disk
见如下数据结构:

typedef struct {
DWORD cbSize;
TCHAR szDeviceName[DEVICENAMESIZE];
TCHAR szStoreName[STORENAMESIZE];
DWORD dwDeviceClass;
DWORD dwDeviceType;
STORAGEDEVICEINFO sdi;
DWORD dwDeviceFlags;
SECTORNUM snNumSectors;
DWORD dwBytesPerSector;
SECTORNUM snFreeSectors;
SECTORNUM snBiggestPartCreatable;
FILETIME ftCreated;
FILETIME ftLastModified;
DWORD dwAttributes;
DWORD dwPartitionCount;
DWORD dwMountCount;
} STOREINFO, *PSTOREINFO;

 

下面是我找的获取SD序号号和厂商ID一份示例代码:
SD卡的厂商ID和序列号都是ASCII字符串.

摘自http://geekswithblogs.net/BruceEitman/Default.aspx

#include "windows.h"
#include "Diskio.h"

void RETAILMSG_ASCII(char *Str, DWORD NumChars)
{
DWORD Index;

for( Index = 0; *Str != '' && Index < NumChars; Index++ )
{
RETAILMSG( 1, (TEXT("%c"), *Str++));
}
}

BOOL DisplayDiskID( TCHAR *Disk )
{
STORAGE_IDENTIFICATION *StoreID = NULL;
STORAGE_IDENTIFICATION GetSizeStoreID;
DWORD dwSize;
HANDLE hVol;
TCHAR VolumeName[MAX_PATH];
char *ManfID;
char *SerialNumber;
BOOL RetVal = FALSE;
DWORD GLE;

//_stprintf(VolumeName, _T("%sVol:"), Disk);
_stprintf(VolumeName, _T("%s"), Disk);//这两种方式状况都可以,输入应该是设备名称,如DSK1: DSK2:

hVol = CreateFile( Disk, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if( hVol != INVALID_HANDLE_VALUE )
{
if(DeviceIoControl(hVol, IOCTL_DISK_GET_STORAGEID, (LPVOID)NULL, 0, &GetSizeStoreID, sizeof(STORAGE_IDENTIFICATION), &dwSize, NULL) == FALSE)
{
GLE = GetLastError();
if( GLE == ERROR_INSUFFICIENT_BUFFER )
{
//若是空间不足,引起的调用失败,说明还是有厂商ID和序列号信息的.
//GetSizeStoreID.dwSize 说明了STORAGE_IDENTIFICATION结构本身的大小加上了
//厂商ID和序列号所需的存储空间.

StoreID = (STORAGE_IDENTIFICATION *)malloc( GetSizeStoreID.dwSize );
if(DeviceIoControl(hVol, IOCTL_DISK_GET_STORAGEID, (LPVOID)NULL, 0, StoreID, GetSizeStoreID.dwSize, &dwSize, NULL) != FALSE)
{
if( !(StoreID->dwFlags & MANUFACTUREID_INVALID) )
{
ManfID = (char *)((DWORD)StoreID + StoreID->dwManufactureIDOffset);
RETAILMSG( 1, (TEXT("DisplayDiskID: Manufacture ID ")));
//下面的输出函数考虑到输出字符的长度
//The serial number and module number are NULL terminated ASCII strings.

RETAILMSG_ASCII( ManfID, StoreID->dwSerialNumOffset - StoreID->dwManufactureIDOffset);
RETAILMSG( 1, (TEXT("rn")));
}
if( !(StoreID->dwFlags & SERIALNUM_INVALID) )
{
SerialNumber = (char *)((DWORD)StoreID + StoreID->dwSerialNumOffset);
RETAILMSG( 1, (TEXT("DisplayDiskID: Serial Number ")));
RETAILMSG_ASCII( SerialNumber, GetSizeStoreID.dwSize - StoreID->dwSerialNumOffset );
RETAILMSG( 1, (TEXT("rn")));
}
RetVal = TRUE;
}
else
RETAILMSG( 1, (TEXT("DisplayDiskID: DeviceIoControl failed (%d)rn"), GLE));

free(StoreID);
}
else
RETAILMSG( 1, (TEXT("No Disk Identifcation available for %srn"), VolumeName ));
}
else//这种状况下,DeviceIoControl返回成功 说明这张卡没有序列号和厂商ID信息
RETAILMSG( 1, (TEXT("DisplayDiskID: DeviceIoControl succeeded (and shouldn't have)rn")));

CloseHandle (hVol);
}
else
RETAILMSG( 1, (TEXT("DisplayDiskID: Failed to open volume (%s)rn"), VolumeName ));

return RetVal;
}

下面是作者的原话,说明在获取卡的序列号时的注意事项,体现的严谨态度

"Note that the manufature ID and serial number are ASCII strings, so I included a little function to output those on the debug serial port. I also found that some of the memory card drivers don't handle the strings very well, so I had to limit the strings by length rather than by looking for the null character.

Further testing showed that both DSKx: and DSKx:Vol: work when calling CreateFile();"

你可能感兴趣的:(数据结构,null,存储,WinCE,disk,testing)