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);
源代码如下函数所示:
- 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)
- {
- // MessageBox(L"Open Partation failed!");
- RETAILMSG(1,(L"Open Partation failed!\r\n"));
- return FALSE;
- }
- bRet = DeviceIoControl(hVolume,IOCTL_DISK_GET_STORAGEID,
- NULL,0,(LPVOID)&StoreInfo,/*sizeof(STORAGE_IDENTIFICATION)*/3000,&dwSize,NULL);
- if(!bRet)
- {
- DWORD dwErr = GetLastError();
- // TCHAR tcError[64];
- // wsprintf(tcError,L"Device IO 1 failed: %d!",dwErr);
- // MessageBox(tcError);
- 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();
- // TCHAR tcError[64];
- // wsprintf(tcError,L"Device IO 2 failed: %d!",dwErr);
- // MessageBox(tcError);
- 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;
- }
调用示例如下:
- 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 卡序列号的方法的更多相关文章
- Ubuntu下查看SD卡设备名的几个方法
Ubuntu下使用SD卡查询SD卡的设备文件名:sudo fdisk -leg:Disk /dev/sdb:14.9 GiB,15931539456 字节,31116288 个扇区单元:扇区 / 1 ...
- Linux的启动SD卡的格式化方法
要在OMAP3530上运行Linux,首先要知道如何启动OMAP3530,并且将MLO,XDLR,UBOOT,UImage以及文件系统等镜像程序下载到OMAP3530的芯片中去. OMAP3530提供 ...
- 【译】如何在 Android 5.0 上获取 SD卡 的读写权限
因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...
- 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)
SD卡已经看了两天了,主要是因为测试出来的卡容量不对,所以一直找原因,最终还是发现了,总比不过是单位上面出现了问题,或许是之前没有接触到SD的缘故吧,所以对其中的一些寄存器很不了解,一切都是重新开始, ...
- Mac下给SD卡烧录树莓派系统
1.mac 磁盘工具 抹掉sd卡 为fat 2. df -h 看清sd卡号 3. 卸载sd卡 diskutil unmount /dev/disk2s2 Volume UNTITLED on disk ...
- 关于ARM Linux下的SD卡及U盘的挂载问题
内核配置并运行后,挂载SD卡,出现问题: zynq> mount -t /dev/mmcblk1 /mntmount: mounting /dev/mmcblk0 on /mnt failed: ...
- Linux环境下挂载SD卡的教程
1.插入SD卡 如果系统能够识别SD卡,则会打印一些信息: 2.查看系统给SD卡分配的设备名 命令如下: fdisk -l 命令 说明:通常是根据SD卡的存储容量来确定的. 比如下面的信息: 3.挂载 ...
- SPI模式下MCU对SD卡的控制及操作命令
一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...
- SPI模式下MCU对SD卡的控制及操作命令(转)
源:SPI模式下MCU对SD卡的控制及操作命令 一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控 ...
随机推荐
- BlockingQueue(阻塞队列)详解
一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量 ...
- 深入Java虚拟机(3)——安全
因为网络允许多台计算机共享数据和分布式处理,所以它提供了一条入侵计算机系统的潜在途径,使得其他人可以窃取信息,改变或破坏信息,盗取计算机资源等等.为了解决由网络引起的安全问题,Java体系结构采用了一 ...
- Maven之(六)setting.xml配置文件详解
setting.xml配置文件 maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.h ...
- Java基本语法-----java常量
1常量的概述 常量是指在程序运行过程中其值不能改变的量. 2常量类型 Java中常量的分类: 整数常量 : 所有整数 小数常量 : 所有小数 布尔常量 : 只有true和false 字符常量 :使用' ...
- Dynamics CRM2015 非基础语言环境下产品无法新建的问题
该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...
- iOS9 中关闭ATS的方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS9中增加了系统的安全性,你会发现默认情况下打开非http ...
- JqGrid 显示表格
JqGrid 是前台的表格显示库,使用起来相当方便. 这里分享下本人使用过程中遇到的问题及解决方案 ** 一.rowNum属性 ** 1.如果不设置,默认显示数是20,也就是说超过20以后的数据.不再 ...
- Android的ExpandableListView-android学习之旅(二十八)
ExpandableListView简介 ExpandableListView是ListView的子类,用法和ListView类似,ExpandableListView可以创建几个类别,每个类别下面又 ...
- SQL性能优化应该考虑哪些?
1.调整数据结构的设计.这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 2.调整应用程序结构设计.这一部分也是在开 ...
- java反射机制--reflection
反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is ...