生活随笔
收集整理的這篇文章主要介紹了
CE6.0 下获得 SD 卡序列号的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
經常在壇子里看到討論軟件加密的帖子,純軟件加密與讀取硬件序列號加密是經常討論到的。
兩種方法各有優缺點。
在通過讀取硬件序列號的方法來加密的方法,受硬件的限制。
一般來說,CPU和T-Flash可能存在序列號。今天研究了一下 Windows CE 6.0 下的讀取 SD 卡(T-Flash)的方法,以下將自己的實現過程列出來,供有需要的朋友一起學習。
函數的聲明,在.H文件文件中:
#define SD_PART_NAME?? ?L"DSK2:"
#define VALID_SD_SERIAL_1?? ?L"A7DFB784"
BOOL GetStorageID(TCHAR *ptcCardName,TCHAR *ptcManufactureID,TCHAR *ptcSerialNum);
源代碼如下函數所示:
[cpp]?view plaincopy
BOOL?GetStorageID(TCHAR?*ptcCardName,TCHAR?*ptcManufactureID,TCHAR?*ptcSerialNum)?? {?? ????DWORD?dwSize?=?0;?? ????DWORD?dwReqSize?=?0;?? ????STORAGE_IDENTIFICATION?StoreInfo;?? ????STORAGE_IDENTIFICATION?StoreInfo2;?? ????HANDLE?hVolume?=?NULL;?? ????BOOL?bRet?=?FALSE;?? ?? ????BYTE?*pucSerialNo?=?NULL;?? ????BYTE?*pucManuID?=?NULL;?? ????int?i?=?0;?? ?? ????ZeroMemory(&StoreInfo,sizeof(STORAGE_IDENTIFICATION));?? ?? ????hVolume?=?CreateFile(ptcCardName,GENERIC_READ?|?GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);???? ????if(NULL?==?hVolume?||?INVALID_HANDLE_VALUE?==?hVolume)???? ????{?? ?????????? ????????RETAILMSG(1,(L"Open?Partation?failed!\r\n"));?? ????????return?FALSE;?? ????}?? ????bRet?=?DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID,?? ????????NULL,0,(LPVOID)&StoreInfo,3000,&dwSize,NULL);?? ????if(!bRet)?? ????{?? ????????DWORD?dwErr?=?GetLastError();?? ?????????? ?? ?????????? ?? ?????????? ????????RETAILMSG(1,(L"Device?IO?1?failed:?%d!\r\n",dwErr));?? ????????CloseHandle(hVolume);?? ????????return?FALSE;?? ????}?? ????dwReqSize?=?StoreInfo.dwSize;?? ?? ????ASSERT(dwReqSize?>?0);?? ?? ????dwSize?=?0;?? ????StoreInfo2.dwSize?=?dwReqSize;?? ????bRet?=?DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID,?? ????????NULL,0,(LPVOID)&StoreInfo,dwReqSize,&dwSize,NULL);????? ?? ????if(FALSE?==?bRet)?? ????{?? ????????DWORD?dwErr?=?GetLastError();?? ?????????? ?? ?????????? ?? ?????????? ????????RETAILMSG(1,(L"Device?IO?2?failed:?%d!\r\n",dwErr));?? ????????CloseHandle(hVolume);?? ?? ????????return?FALSE;?? ????}?? ?? ????pucSerialNo?=?(((BYTE?*)&StoreInfo)?+?StoreInfo.dwSerialNumOffset);?? ????pucManuID?=?(((BYTE?*)&StoreInfo)?+?StoreInfo.dwManufactureIDOffset);?? ????while(pucSerialNo[i]?!=?0?&&?i?<?200?&&?i?<?(int)(dwSize?-?StoreInfo.dwSerialNumOffset))?? ????{?? ????????ptcSerialNum[i]?=?pucSerialNo[i];?? ????????i++;?? ????}?? ????pucSerialNo[i]?=?'\0?';?? ?? ????i?=?0;?? ????while(pucManuID[i]?!=?0?&&?i?<?200?&&?i?<?(int)(StoreInfo.dwSerialNumOffset?-?StoreInfo.dwManufactureIDOffset))?? ????{?? ????????ptcManufactureID[i]?=?pucManuID[i];?? ????????i++;?? ????}?? ????pucManuID[i]?=?'\0?';?? ?? ????CloseHandle(hVolume);?? ?? ????return?TRUE;??? }??
調用示例如下:
[cpp]?view plaincopy
TCHAR?tcSDSerial[256];?? ?TCHAR?tcSDManu[256];?? ?? ?ZeroMemory(tcSDSerial,sizeof(TCHAR)?*?256);?? ZeroMemory(tcSDManu,sizeof(TCHAR)?*?256);?? ?? if(0?==?GetStorageID(SD_PART_NAME,tcSDManu,tcSDSerial))?? {?? ????MessageBox(tcSDSerial);?? ????if(0?==?wcsncmp(VALID_SD_SERIAL_1,tcSDSerial,wcslen(VALID_SD_SERIAL_1)))?? ????{?? ????}?? ????else?? ????{?? ????}?? }?? ?? 實現過程中,遇到以下錯誤:?? (1)?當將調用代碼修改為:?if(GetStorageID(L"DSK1:",csManufactureID,csSerialID))?時(DSK1?是存在的)產生如下錯誤:?? Error?50:?不支持請求。??? (2)?當將實現代碼中的?DeviceIoControl()函數?修改為如下時:?? bRet?=?DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID,?? ????NULL,0,(LPVOID)&StoreInfo,sizeof(STORAGE_IDENTIFICATION),&dwSize,NULL);?? ?????? ?產生如下錯誤:Error?122:?傳遞給系統調用的數據區域太小。所以,建議各位程序在編碼時,盡量對函數的返回值進行判斷。在出錯的狀態,一定要調用?GetLastError()?函數獲取詳細的錯誤碼。 ?
總結
以上是生活随笔為你收集整理的CE6.0 下获得 SD 卡序列号的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。