织梦CMS - 轻松建站从此开始!

罗索

CE6.0 下获得 SD 卡序列号的方法

jackyhwei 发布于 2011-11-24 09:06 点击:次 
一般来说,CPU和T-Flash可能存在序列号。今天研究了一下 Windows CE 6.0 下的读取 SD 卡(T-Flash)的方法,以下将自己的实现过程列出来,供有需要的朋友一起学习。
TAG:

 经常在坛子里看到讨论软件加密的帖子,纯软件加密与读取硬件序列号加密是经常讨论到的。

两种方法各有优缺点。

在通过读取硬件序列号的方法来加密的方法,受硬件的限制。

一般来说,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);

源代码如下函数所示:

  1. BOOL GetStorageID(TCHAR *ptcCardName,TCHAR *ptcManufactureID,TCHAR *ptcSerialNum) 
  2.     DWORD dwSize = 0; 
  3.     DWORD dwReqSize = 0; 
  4.     STORAGE_IDENTIFICATION StoreInfo; 
  5.     STORAGE_IDENTIFICATION StoreInfo2; 
  6.     HANDLE hVolume = NULL; 
  7.     BOOL bRet = FALSE; 
  8.  
  9.     BYTE *pucSerialNo = NULL; 
  10.     BYTE *pucManuID = NULL; 
  11.     int i = 0; 
  12.  
  13.     ZeroMemory(&StoreInfo,sizeof(STORAGE_IDENTIFICATION)); 
  14.  
  15.     hVolume = CreateFile(ptcCardName,GENERIC_READ | GENERIC_WRITE,0,NULL
  16. ,OPEN_EXISTING,0,NULL);   
  17.     if(NULL == hVolume || INVALID_HANDLE_VALUE == hVolume)   
  18.     { 
  19.         // MessageBox(L"Open Partation failed!"); 
  20.         RETAILMSG(1,(L"Open Partation failed!\r\n")); 
  21.         return FALSE; 
  22.     } 
  23.     bRet = DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID, 
  24.         NULL,0,(LPVOID)&StoreInfo,/*sizeof(STORAGE_IDENTIFICATION)*/3000,&dwSize,NULL); 
  25.     if(!bRet) 
  26.     { 
  27.         DWORD dwErr = GetLastError(); 
  28.         // TCHAR tcError[64]; 
  29.  
  30.         // wsprintf(tcError,L"Device IO 1 failed: %d!",dwErr); 
  31.  
  32.         // MessageBox(tcError); 
  33.         RETAILMSG(1,(L"Device IO 1 failed: %d!\r\n",dwErr)); 
  34.         CloseHandle(hVolume); 
  35.         return FALSE; 
  36.     } 
  37.     dwReqSize = StoreInfo.dwSize; 
  38.  
  39.     ASSERT(dwReqSize > 0); 
  40.  
  41.     dwSize = 0; 
  42.     StoreInfo2.dwSize = dwReqSize; 
  43.     bRet = DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID, 
  44.         NULL,0,(LPVOID)&StoreInfo,dwReqSize,&dwSize,NULL);    
  45.  
  46.     if(FALSE == bRet) 
  47.     { 
  48.         DWORD dwErr = GetLastError(); 
  49.         // TCHAR tcError[64]; 
  50.  
  51.         // wsprintf(tcError,L"Device IO 2 failed: %d!",dwErr); 
  52.  
  53.         // MessageBox(tcError); 
  54.         RETAILMSG(1,(L"Device IO 2 failed: %d!\r\n",dwErr)); 
  55.         CloseHandle(hVolume); 
  56.  
  57.         return FALSE; 
  58.     } 
  59.  
  60.     pucSerialNo = (((BYTE *)&StoreInfo) + StoreInfo.dwSerialNumOffset); 
  61.     pucManuID = (((BYTE *)&StoreInfo) + StoreInfo.dwManufactureIDOffset); 
  62.     while(pucSerialNo[i] != 0 && i < 200 && i <
  63.  (int)(dwSize - StoreInfo.dwSerialNumOffset)) 
  64.     { 
  65.         ptcSerialNum[i] = pucSerialNo[i]; 
  66.         i++; 
  67.     } 
  68.     pucSerialNo[i] = '\0 '
  69.  
  70.     i = 0; 
  71.     while(pucManuID[i] != 0 && i < 200 && i <
  72.  (int)(StoreInfo.dwSerialNumOffset - StoreInfo.dwManufactureIDOffset)) 
  73.     { 
  74.         ptcManufactureID[i] = pucManuID[i]; 
  75.         i++; 
  76.     } 
  77.     pucManuID[i] = '\0 '
  78.  
  79.     CloseHandle(hVolume); 
  80.  
  81.     return TRUE;  

调用示例如下:

  1. TCHAR tcSDSerial[256]; 
  2.  TCHAR tcSDManu[256]; 
  3.  
  4.  ZeroMemory(tcSDSerial,sizeof(TCHAR) * 256); 
  5. ZeroMemory(tcSDManu,sizeof(TCHAR) * 256); 
  6.  
  7. if(0 == GetStorageID(SD_PART_NAME,tcSDManu,tcSDSerial)) 
  8.     MessageBox(tcSDSerial); 
  9.     if(0 == wcsncmp(VALID_SD_SERIAL_1,tcSDSerial,wcslen(VALID_SD_SERIAL_1))) 
  10.     { 
  11.     } 
  12.     else 
  13.     { 
  14.     } 

实现过程中,遇到以下错误:

(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() 函数获取详细的错误码。

(91program)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201111/15359.html]
本文出处:blog.csdn.net/91program 作者:91program
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容