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

两种方法各有优缺点。

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

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

调用示例如下:

  1. TCHAR tcSDSerial[256];
  2. TCHAR tcSDManu[256];
  3. ZeroMemory(tcSDSerial,sizeof(TCHAR) * 256);
  4. ZeroMemory(tcSDManu,sizeof(TCHAR) * 256);
  5. if(0 == GetStorageID(SD_PART_NAME,tcSDManu,tcSDSerial))
  6. {
  7. MessageBox(tcSDSerial);
  8. if(0 == wcsncmp(VALID_SD_SERIAL_1,tcSDSerial,wcslen(VALID_SD_SERIAL_1)))
  9. {
  10. }
  11. else
  12. {
  13. }
  14. }
  15. 实现过程中,遇到以下错误:
  16. (1) 当将调用代码修改为: if(GetStorageID(L"DSK1:",csManufactureID,csSerialID)) 时(DSK1 是存在的)产生如下错误:
  17. Error 50: 不支持请求。
  18. (2) 当将实现代码中的 DeviceIoControl()函数 修改为如下时:
  19. bRet = DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID,
  20. NULL,0,(LPVOID)&StoreInfo,sizeof(STORAGE_IDENTIFICATION),&dwSize,NULL);
  21. 产生如下错误:Error 122: 传递给系统调用的数据区域太小。所以,建议各位程序在编码时,尽量对函数的返回值进行判断。在出错的状态,一定要调用 GetLastError() 函数获取详细的错误码。

CE6.0 下获得 SD 卡序列号的方法的更多相关文章

  1. Ubuntu下查看SD卡设备名的几个方法

    Ubuntu下使用SD卡查询SD卡的设备文件名:sudo fdisk -leg:Disk /dev/sdb:14.9 GiB,15931539456 字节,31116288 个扇区单元:扇区 / 1 ...

  2. Linux的启动SD卡的格式化方法

    要在OMAP3530上运行Linux,首先要知道如何启动OMAP3530,并且将MLO,XDLR,UBOOT,UImage以及文件系统等镜像程序下载到OMAP3530的芯片中去. OMAP3530提供 ...

  3. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  4. 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)

    SD卡已经看了两天了,主要是因为测试出来的卡容量不对,所以一直找原因,最终还是发现了,总比不过是单位上面出现了问题,或许是之前没有接触到SD的缘故吧,所以对其中的一些寄存器很不了解,一切都是重新开始, ...

  5. Mac下给SD卡烧录树莓派系统

    1.mac 磁盘工具 抹掉sd卡 为fat 2. df -h 看清sd卡号 3. 卸载sd卡 diskutil unmount /dev/disk2s2 Volume UNTITLED on disk ...

  6. 关于ARM Linux下的SD卡及U盘的挂载问题

    内核配置并运行后,挂载SD卡,出现问题: zynq> mount -t /dev/mmcblk1 /mntmount: mounting /dev/mmcblk0 on /mnt failed: ...

  7. Linux环境下挂载SD卡的教程

    1.插入SD卡 如果系统能够识别SD卡,则会打印一些信息: 2.查看系统给SD卡分配的设备名 命令如下: fdisk -l 命令 说明:通常是根据SD卡的存储容量来确定的. 比如下面的信息: 3.挂载 ...

  8. SPI模式下MCU对SD卡的控制及操作命令

    一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...

  9. SPI模式下MCU对SD卡的控制及操作命令(转)

    源:SPI模式下MCU对SD卡的控制及操作命令 一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控 ...

随机推荐

  1. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  2. Linux下一次数据仓库进行迁移记录

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52768613 前言:数据库每天的 ...

  3. Android Lollipop 5.0 经典新特性回顾

    *Tamic 专注移动开发! 更多文章请关注 http://blog.csdn.net/sk719887916 虽然Android已到了7.0 ,但是我们还是不能忘怀视觉革命性改变的5.0,今天回顾下 ...

  4. EBS销售订单挑库发放处理程序

    来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...

  5. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  6. Java学习之控制跳转语句

    控制跳转语句 控制跳转语句: (1)break:中断的意思 A:用在循环和switch语句中,离开此应用场景无意义. B:作用 a:跳出单层循环 b:跳出多层循环,需要标签语句的配合 (2)conti ...

  7. Android之获取屏幕的尺寸像素及获取状态栏标题栏高度

    在Android的实际开发中,会经常用到获取屏幕的尺寸的问题,以便设置一些布局在屏幕上的固定位置,从而适配各个屏幕的设备. 今天我就来讲一下怎么得到当前设备的屏幕像素吧: 一.在Activity中: ...

  8. 如何查看Android设备上的分区信息

    Android设备上,一般都会存在一块eMMC存储芯片来存放系统和用户数据,甚至部分的引导程序. 一般设备出厂时,各个厂商都会将这块存储芯片分成很多的分区,每个分区内存放不同的内容.具体分区的布局每个 ...

  9. 压力测试工具Ab简介

    Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 通过 yum-utils中的yumdownload  ...

  10. Android初级教程理论知识(第九章多媒体编程)

    多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...