获取SD卡序列号和厂商ID

SD卡‘身份证’CID寄存器全解析:从厂商MID到出厂日期MDT,教你识别卡的真伪与来源 本文深入解析SD卡CID寄存器的结构与功能,从厂商ID(MID)到生产日期(MDT),详细教你如何通过CID字段识别SD卡的真伪与来源。文章包含实战指南、真伪鉴定技术及数据恢复应用,帮助用户和技术人员全面掌握SD卡身份识别技术。 阅读详情
AI摘要

本文介绍了一种在Windows CE环境下获取SD卡制造商ID和序列号的方法,并提供了一份示例代码。通过使用CreateFile和DeviceIoControl函数,可以有效地读取到存储设备的相关信息。

转自:http://honwsn.itpub.net/post/41648/499730
wince 存储设备有两个名称,
一个设备名称CreateFile打开设备获取句柄的时候要用的,如DSK1:
一个是存储名称,如Mircosoft Flash Disk
见如下数据结构:

typedef struct {
DWORD cbSize;
TCHAR szDeviceName[DEVICENAMESIZE];
TCHAR szStoreName[STORENAMESIZE];
DWORD dwDeviceClass;
DWORD dwDeviceType;
STORAGEDEVICEINFO sdi;
DWORD dwDeviceFlags;
SECTORNUM snNumSectors;
DWORD dwBytesPerSector;
SECTORNUM snFreeSectors;
SECTORNUM snBiggestPartCreatable;
FILETIME ftCreated;
FILETIME ftLastModified;
DWORD dwAttributes;
DWORD dwPartitionCount;
DWORD dwMountCount;
} STOREINFO, *PSTOREINFO;

 

下面是我找的获取SD序号号和厂商ID一份示例代码:
SD卡的厂商ID和序列号都是ASCII字符串.

摘自http://geekswithblogs.net/BruceEitman/Default.aspx

#include "windows.h"
#include "Diskio.h"

void RETAILMSG_ASCII(char *Str, DWORD NumChars)
{
DWORD Index;

for( Index = 0; *Str != '' && Index < NumChars; Index++ )
{
RETAILMSG( 1, (TEXT("%c"), *Str++));
}
}

BOOL DisplayDiskID( TCHAR *Disk )
{
STORAGE_IDENTIFICATION *StoreID = NULL;
STORAGE_IDENTIFICATION GetSizeStoreID;
DWORD dwSize;
HANDLE hVol;
TCHAR VolumeName[MAX_PATH];
char *ManfID;
char *SerialNumber;
BOOL RetVal = FALSE;
DWORD GLE;

//_stprintf(VolumeName, _T("%sVol:"), Disk);
_stprintf(VolumeName, _T("%s"), Disk);//这两种方式状况都可以,输入应该是设备名称,如DSK1: DSK2:

hVol = CreateFile( Disk, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if( hVol != INVALID_HANDLE_VALUE )
{
if(DeviceIoControl(hVol, IOCTL_DISK_GET_STORAGEID, (LPVOID)NULL, 0, &GetSizeStoreID, sizeof(STORAGE_IDENTIFICATION), &dwSize, NULL) == FALSE)
{
GLE = GetLastError();
if( GLE == ERROR_INSUFFICIENT_BUFFER )
{
//若是空间不足,引起的调用失败,说明还是有厂商ID和序列号信息的.
//GetSizeStoreID.dwSize 说明了STORAGE_IDENTIFICATION结构本身的大小加上了
//厂商ID和序列号所需的存储空间.

StoreID = (STORAGE_IDENTIFICATION *)malloc( GetSizeStoreID.dwSize );
if(DeviceIoControl(hVol, IOCTL_DISK_GET_STORAGEID, (LPVOID)NULL, 0, StoreID, GetSizeStoreID.dwSize, &dwSize, NULL) != FALSE)
{
if( !(StoreID->dwFlags & MANUFACTUREID_INVALID) )
{
ManfID = (char *)((DWORD)StoreID + StoreID->dwManufactureIDOffset);
RETAILMSG( 1, (TEXT("DisplayDiskID: Manufacture ID ")));
//下面的输出函数考虑到输出字符的长度
//The serial number and module number are NULL terminated ASCII strings.

RETAILMSG_ASCII( ManfID, StoreID->dwSerialNumOffset - StoreID->dwManufactureIDOffset);
RETAILMSG( 1, (TEXT("rn")));
}
if( !(StoreID->dwFlags & SERIALNUM_INVALID) )
{
SerialNumber = (char *)((DWORD)StoreID + StoreID->dwSerialNumOffset);
RETAILMSG( 1, (TEXT("DisplayDiskID: Serial Number ")));
RETAILMSG_ASCII( SerialNumber, GetSizeStoreID.dwSize - StoreID->dwSerialNumOffset );
RETAILMSG( 1, (TEXT("rn")));
}
RetVal = TRUE;
}
else
RETAILMSG( 1, (TEXT("DisplayDiskID: DeviceIoControl failed (%d)rn"), GLE));

free(StoreID);
}
else
RETAILMSG( 1, (TEXT("No Disk Identifcation available for %srn"), VolumeName ));
}
else//这种状况下,DeviceIoControl返回成功 说明这张卡没有序列号和厂商ID信息
RETAILMSG( 1, (TEXT("DisplayDiskID: DeviceIoControl succeeded (and shouldn't have)rn")));

CloseHandle (hVol);
}
else
RETAILMSG( 1, (TEXT("DisplayDiskID: Failed to open volume (%s)rn"), VolumeName ));

return RetVal;
}

下面是作者的原话,说明在获取卡的序列号时的注意事项,体现的严谨态度

"Note that the manufature ID and serial number are ASCII strings, so I included a little function to output those on the debug serial port. I also found that some of the memory card drivers don't handle the strings very well, so I had to limit the strings by length rather than by looking for the null character.

Further testing showed that both DSKx: and DSKx:Vol: work when calling CreateFile();"

SD卡寄存器解密:从物理结构到文件系统的底层探索 本文深入解析SD卡的物理结构、寄存器操作原理及协议层实现细节,特别针对STM32开发板的SDIO和SPI接口进行详细讲解。从NAND闪存阵列到CID/CSD寄存器结构,再到SD卡命令系统和性能优化实践,为硬件工程师和底层驱动开发者提供全面的技术视角,帮助实现高效稳定的存储解决方案。 阅读详情

相关推荐

用STM32CubeMX给SD卡做个“体检”:手把手教你读取CID/CSD信息并计算容量(SPI+FATFS)

本文详细介绍了如何使用STM32CubeMX通过SPI接口读取SD卡的CID/CSD信息并计算其容量。通过FATFS中间件配置和实战代码示例,帮助开发者深入理解SD卡的身份密码和技术参数,提升嵌入式存储应用的开发效率。

weixin_32818781的博客 322

cf卡序列号读取软件_这款华为NM卡读卡器,可能是行业内最实用的读卡器之一...

TF卡、SD卡、或者是CF卡,相信这种类型的存储卡,我们是经常接触了。那么,你是否有听说过NM卡呢?NM卡是华为于2019年自创的一种超微型存储卡,与Micro SD存储卡相比,华为NM存储卡的体积减小了45%。NM卡的形状大小和Nano SIM卡完全相同,可以与Nano SIM卡共享卡槽。华为NM存储卡的顺序读取速率可达90MB/s,顺序写入速率达70MB/s,是目前业界速率最快的存储卡。诸如M...

weixin_36415835的博客 826

SD卡寄存器详解:从OCR到CSR,揭秘存储卡的核心配置

本文深入解析SD卡寄存器的核心配置,从OCR到CSR,详细介绍了8个关键寄存器的作用与访问方法。涵盖电压协商、容量识别、性能调优等实战技巧,帮助开发者掌握SDIO接口底层开发。通过寄存器配置可优化读写速度、解决兼容性问题,是嵌入式存储开发的必备知识。

weixin_29189377的博客 434

SD/TF卡的序列号的生成或修改,无需定制,无需软件

SD/TF卡拷贝机实现SD卡对卡的序列号生成,应该是比较简单的方式,一键生产,无需懂任何专业,开机就会用,把卡插到拷贝机接口,在屏幕菜单操作即可。

2501_91366856的博客 4017

SD卡序列号修改工具(1).zip

SD卡序列号修改工具

读写SD卡序列号

利用此工具可以轻松读取SD卡序列号,并且可以修改的好工具哦

序列号绑定的SD卡坏了怎么办?

制作相同的序列号的卡,然后再进行程序烧录,即可完成新的程序烧录,并且能够保证新的系统程序卡,能够启动设备并且进行工作。成功制作出新的母卡后,如果数量较多,也可通过专业设备批量复制设备来复制系统程序,提高数据的完整性和安全性,确保多台设备的使用需求;防克隆设计 :SD卡可能包含唯一的加密芯片(如eMMC或加密控制器),直接复制文件系统无法复制底层硬件标识。使用这种类型的系统程序卡常见的设备:复印机,打印机,导航卡,精密机床,航海地图等等。分析复印机固件,查找可能的签名验证绕过方法(涉及法律风险)。

2501_91366856的博客 756

数字IC设计随笔之二(VCS、DVE|Verdi单步调试)

VCS+Verdi单步调试

ic疾风传 1万+

SD信息 读取,包括制造SD卡厂商

/** * @brief Card Specific Data: CSD Register */ typedef struct { __IO uint8_t CSDStruct; /*!< CSD structure */ __IO uint8_t SysSpecVersion; ...

unsv29的专栏 1819

【物联网毕设】多模态智能门禁系统设计(STM32+人脸识别+蓝牙联动)

本文详细介绍了基于STM32的多模态智能门禁系统设计,整合了人脸识别、蓝牙联动、RFID和密码等多种开锁方式。文章从硬件选型、电路设计、嵌入式软件编程到手机APP开发,提供了完整的毕设实现方案与调试指南,帮助物联网与嵌入式方向的学生构建一个功能全面、可扩展的智能门禁系统。

rain6的博客 246

Unity海洋渲染实战:Ceto Ocean System核心原理与高级应用指南

实时水面渲染是计算机图形学中的重要课题,涉及波浪模拟、光照交互和着色器编程等核心技术。其原理通常基于物理模型,如使用Gerstner波模拟规则海浪,或通过快速傅里叶变换(FFT)处理频谱数据生成随机海面。这些技术的价值在于能以可控的性能开销,在游戏中实现具有体积感、反射和折射效果的真实水体。在开放世界、海战模拟等应用场景中,专业的海洋系统如Ceto Ocean System,通过模块化架构整合了波浪生成、动态网格和渲染管线,为开发者提供了完整的解决方案。本文深入探讨了其双引擎波浪系统和多层渲染结构,并分享了

weixin_29002595的博客 279

Windows/Linux获取Mac地址和CPU序列号实现

UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性。可用的开源库如libuuid,可参考https://blog.csdn.net/fengbingchun/article/details/94590406。 UDID(Unique Device Identifier)即设备唯一标识符。一般可通过获取设备的MAC地址+设备的CPU序列号作为设备的唯一标识符。 MAC地址(Media Access Control Ad

网络资源是无限的 1万+

共聚焦显微镜的光源、工作原理与选型

共聚焦显微镜作为科研与工业领域中重要的微观成像工具,凭借光源的精准适配性、光学切片技术的三维成像能力,以及对不同工业场景的定制化适配潜力,为半导体检测、工业部件分析、智能制造升级提供了关键技术支撑。深入理解其光源特性、工作原理与选型逻辑,能帮助工程师与技术人员精准匹配设备与生产需求,既保障微观检测的精度与效率,又为产业优化、技术创新筑牢微观观测的基础。

PhotonixBay的博客 1537

android 获取SD卡相关信息

package com.example.hardware.Util; import java.io.BufferedReader; import java.io.FileReader; import java.io.Reader; public class SdcardUtils { public static String getSdcardName(){ Str...

zhangmiaoping23的专栏 1315

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 173

Allegro File菜单实战指南:从导入网表到导出BOM的完整流程

PCB设计离不开对EDA软件菜单体系的深入理解。在Cadence Allegro中,File菜单是数据流转的中枢,它不仅是新建、打开、保存的基础入口,更是连接原理图与版图、设计与制造的关键桥梁。工程师常遇到的“导入网表报错”“导出BOM为空”“板框不闭合”等高频问题,大多源于对File菜单中Import与Export功能的理解不到位。从基础概念出发,先厘清Import(网表、DXF、IPC)与Export(BOM、ODB++、DXF)的工作原理,再结合版本兼容、封装库路径、单位设置等工程细节,即可构建完整的

weixin_32950759的博客 295

Android 手机信息获取详解

极力推荐文章:欢迎收藏Android 干货分享Android手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的...

程序员Android 716

Unity音游开发全指南:模板与免费资源高效构建节奏游戏

**粒子特效** | [Universal VFX](https://assetstore.unity.com/packages/vfx/particles/universal-vfx-159182) | 免费视觉特效 || **UI素材** | [Game UI Pack](https://assetstore.unity.com/packages/2d/gui/game-ui-pack-86908) | 现代风格UI元素 |**音游开发的黄金法则**:完美的节奏游戏是音乐与游戏的和谐统一。

Loving_enjoy的博客 727

SDIO协议深度解析:从硬结构到数据读写优化 SD卡​

概要框架: 一、SDIO协议与硬件基础 ​​SD卡硬件结构​​ 物理接口定义(SD/TF卡引脚差异) 内部模块:存储单元、控制器、寄存器组(CID/CSD/OCR等) 时钟配置:SDIO_CK计算公式与初始化限制(≤400kHz) ​​SDIO适配器架构​​ 控制单元(电源/时钟管理) 命令通道(CPSM状态机)与数据通道(DPSM状态机) 多总线模式:1线/4线/8线带宽对比 二、SD卡操作模式与命令系统 ​​卡识别模式​​ 关键命令流程:CMD0复位→CMD8电压检测→ACMD41初始化→CMD2/3获

k_XXll的博客 1798

深度强化学习 | 基于DQN实现Flappy Bird游戏与分析

在Flappy Bird中,玩家需要通过控制小鸟安全穿过随机长度的水管来得分。本文基于深度Q网络DQN来实现Flappy Bird游戏的自主探索与学习

FRIGIDWINTER的博客 5912

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

php获取linux cpu序列号,Windows/Linux获取Mac地址和CPU序列号实现

UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性。可用的开源库如libuuid,可参考https://blog.csdn.net/fengbingchun/article/details/94590406。UDID(Unique Device Identifier)即设备唯一标识符。一般可通过获取设备的MAC...

weixin_30692969的博客 692

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

如何读取电脑CPU序列号、主板BIOS、硬盘的序列号

如何读取电脑CPU序列号、主板BIOS、硬盘的序列号 (2010-09-11 09:01:41) 转载▼ 标签: 序列号 硬盘控制器 c语言 读取 进行 it 分类:IT 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=2740166 关注 -------------

hyxl75的专栏 8356

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SD卡与TF卡上位机开发实战:从协议底层到锁死抢救

在嵌入式存储领域,SD卡和TF卡作为常见介质,其内部寄存器结构与协议栈是稳定读写的基础。理解CID、CSD、OCR等寄存器及SPI/SD模式切换原理,能有效避免初始化失败与数据错位。掌握这些底层机制,可显著提升文件系统挂载、表格化存储及掉电保护的可靠性,广泛应用于工控、单片机等场景。本文深入解析SD/TF卡锁死根源,提供从硬件设计到软件恢复的完整方案,助你彻底解决存储卡变砖难题。

weixin_29190651的博客 284
上一篇: 使用GetUpdateRect和GetClipBox的体会
下一篇: 提高AlphaBlend效率的实际验证
alien75
博客等级 码龄25年 195粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值