WinCE获取SD卡序列号
之后,我们就很容易获取这两个标志的起始地址了:
[cpp] view plaincopychar *pManufactureID = reinterpret_cast
char *pSerialNum = reinterpret_cast
接下来的事情可能就不用细说了,无非就是根据起始地址来复制字符串。最后,就是调用CloseHandle来关闭驱动句柄了。
流程介绍完毕,但还不是文章的结尾。本文的最后,让我们来看看一个完整的获取标识符的函数,代码如下所示:
[cpp] view plaincopyBOOL GetStorageIdentification(std::wstring strDiskName,std::string strManufactureID,std::string strSerialNum)
{
BOOL bRes = FALSE;
PSTORAGE_IDENTIFICATION pStoreInfo = NULL;
HANDLE hDisk = INVALID_HANDLE_VALUE;
__try
{
//The buffer for storing data
const DWORD BUFFER_SIZE = 300;
//Allocate the size for the struct
pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[BUFFER_SIZE];
if(pStoreInfo == NULL)
{
__leave;
}
//Open the driver
hDisk = CreateFile(strDiskName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hDisk == INVALID_HANDLE_VALUE)
{
__leave;
}
//Get the ID from the driver
DWORD dwBytesRet = 0;
if (DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, NULL, 0, pStoreInfo, BUFFER_SIZE, dwBytesRet, NULL) == FALSE)
{
__leave;
}
//Get the manufacture ID
if (pStoreInfo->dwManufactureIDOffset != 0)
{
char *pManufactureID = reinterpret_cast
if(pStoreInfo->dwSerialNumOffset != 0)
{
strManufactureID.assign(pManufactureID,pStoreInfo->dwSerialNumOffset - pStoreInfo->dwManufactureIDOffset);
}
else
{
strManufactureID = pManufactureID;
}
}
if(pStoreInfo->dwSerialNumOffset != 0)
{
char *pSerialNum = reinterpret_cast
strSerialNum = pSerialNum;
}
bRes = TRUE;
}
__finally
{
if(pStoreInfo != NULL)
{
delete []pStoreInfo;
}
if(hDisk != INVALID_HANDLE_VALUE)
{
CloseHandle(hDisk);
}
}
return bRes;
}
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
