windows api编程中有没有把U盘设为只读的函数

用win32 API监听U盘插拔并取得其盘符/取得当前插入U盘的盘符 - 草泥马在戈壁 - 博客园
在广阔草原上,我们尽情狂奔。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
用win32 API监听U盘插拔并取得其盘符
1.使用RegisterDeviceNotification()函数注册
2.在WndProc()函数中接收WM_DEVICECHANGE消息
3.处理接收到的WM_DEVICECHANGE消息
用win32 API取得当前插入U盘的盘符
1.使用取得代表各分区的掩码
2.遍历掩码的每一位,判断对应的分区是否是U盘
阅读(...) 评论()
Copyright & 草泥马在戈壁
Powered by:
模板提供:二次开发U盘 提供**API接口及技术支持 可根据客户要求定制-中国制造交易网
产品名称:二次开发U盘 提供**API接口及技术支持 可根据客户要求定制
产品链接:
手机版链接:
在windows unix linux下都可以使用的二次开发U盘
二次开发的U盘的特性
根据用户的需求可配置成多种分区组合:虚拟CD-ROM区\隐藏区\私密区\公共区等,用户可根据实际应用需要,选择不同的容量.分区方式和大小。
CD-ROM区支持光盘.ISO文件自启动,,并可通过调用API中UpdateISOFileOfCDROMDrive函数来更新CD-ROM的内容,适合客户端软件运行和在线升级;
私密区的读写是通过API中的一系列的接口函数来实现的,可以字节访问,扇区访问,还可以以文件的方式访问,适合写入关键数据或文件:密钥\认证码等;
隐藏区通常情况下是不可见的,通过转换函数将其可其映射为可见分区。
公共区与普通U盘一样使用
产品广泛应用于各种领域:网络、安全、认证、审计、教育等领域。
可提供VC,C#,C++,VB,delphi下的demo。所有win32开发语言都支持.
可根据客户要求来订做开发U盘程序
usb时钟模块,time时钟锁
采用完全独立的真硬件时钟芯片,不依赖于计算机系统时间,同时硬件上增加了防止篡改时间的安全保护措施,能够广泛满足各种软件对时间限制的加密需求,非常适用于软件试用,软件租赁,限时加密等灵活的软件营销模式,使得加密方式更加多样,应用更加灵活。价格**的真硬件时钟芯片加密锁不需要读取pc的时间,时效软件的保障稳定的质量解决后顾之忧安全硬件设计,防止篡改锁内时间电池寿命3年以上使用key的同时充电全系统兼容的HID无驱USB设备完善易用的API接口256字节安全存储空间,用户级别读写控制通过api读取和设置时间
加密狗,小容量usb存储器超低的价格HID无驱usb设备支持软件保护和身份认证可用作usbkey或加密狗提供完善易用的API256字节用户数据空间数据可加密保存和读取
1、我公司对产品提供一年保修,保修日期自客户提货之日计算。
2、以下情况时,不在本协议保修的范围内:
机器出厂编号丢失,被涂改或与销售的产品不符;
芯片有烧痕、断裂、摔坏或裂痕;
控制板有物理性损坏,电路折断;
产品生锈或腐蚀,部件脱落缺损。
3、下列情况的产品故障或损坏不在保修之列,但支付维修费用可享受正规服务:
外观破损,机身有划痕的情况可更换外壳;
水灾,火灾,地震等不可抗力因素或人为因素。
【二次开发U盘 提供**API接口及技术支持 可根据客户要求定制】产品信息由【深圳市风翔世纪电子有限公司】提供,【深圳市风翔世纪电子有限公司】主营:&&&&,您可以查看更多关于【二次开发U盘 提供**API接口及技术支持 可根据客户要求定制】的产品。
联系人:张爱**电话:13**地址:中国**网站:主营:&&&&
业务咨询:
战略合作:
ICP备案号:豫B2-|增值电信业务经营许可证:豫B2-网站已改版,请使用新地址访问:
srcUDiskCpyManager_V53 防止向U盘中拷贝文件, Hook Win32API, 实现在WinXp DLP 函数列表:CopyFileEx api 钩子与API截获 238万源代码下载- www.pudn.com
&文件名称: srcUDiskCpyManager_V53
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 449 KB
&&上传时间:
&&下载次数: 43
&&提 供 者:
&详细说明:防止向U盘中拷贝文件, Hook Win32API, 实现在WinXp下U盘 DLP Hook函数列表:CopyFileExW Win7(x86/x64)下U盘DLP Hook函数列表: CoCreateInstance,
IFileOperation::CopyItems IFileOperation::MoveItems IFileOperation::NewItem IFileOperation::RenameItem
-U disk to copy files to prevent, Hook Win32API, U disk under WinXp achieve DLP Hook Function list: CopyFileExW
Win7 (x86/x64) under U disk DLP Hook Function list: CoCreateInstance, IFileOperation :: CopyItems IFileOperation :: MoveItems IFileOperation: : NewItem IFileOperation :: RenameItem
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&UDiskCpyManager\bin\CtrlProg.exe&&...............\...\LsApiHook.dll&&...............\...\LsComHookProxy.dll&&...............\...\readme.txt&&...............\prj\common\constDefine.h&&...............\...\......\disasm-lib\cpu.c&&...............\...\......\..........\cpu.h&&...............\...\......\..........\disasm.c&&...............\...\......\..........\disasm.h&&...............\...\......\..........\disasm_x86.c&&...............\...\......\..........\disasm_x86.h&&...............\...\......\..........\disasm_x86_tables.h&&...............\...\......\..........\misc.c&&...............\...\......\..........\misc.h&&...............\...\......\file\CFileHelper.cpp&&...............\...\......\....\CFileHelper.h&&...............\...\......\....\fileConst.h&&...............\...\......\....\fileHelper.cpp&&...............\...\......\....\fileHelper.h&&...............\...\......\....\mfcFileDlgHelper.cpp&&...............\...\......\....\mfcFileDlgHelper.h&&...............\...\......\....\UnicodeFileHelper.cpp&&...............\...\......\....\UnicodeFileHelper.h&&...............\...\......\....\UnicodeIni.cpp&&...............\...\......\....\UnicodeIni.h&&...............\...\......\mhook-lib\mhook.cpp&&...............\...\......\.........\mhook.h&&...............\...\......\string\stringConst.h&&...............\...\......\......\stringHelper.cpp&&...............\...\......\......\stringHelper.h&&...............\...\CtrlProg\DlgUDiskParam.cpp&&...............\...\........\DlgUDiskParam.h&&...............\...\........\MainFrm.cpp&&...............\...\........\MainFrm.h&&...............\...\........\ReadMe.txt&&...............\...\........\res\srcR3.ico&&...............\...\........\...\srcR3.rc2&&...............\...\........\...\srcR3Doc.ico&&...............\...\........\...\Toolbar.bmp&&...............\...\........\resource.h&&...............\...\........\srcR3.aps&&...............\...\........\srcR3.cpp&&...............\...\........\srcR3.h&&...............\...\........\srcR3.rc&&...............\...\........\srcR3.vcxproj&&...............\...\........\srcR3.vcxproj.filters&&...............\...\........\srcR3Doc.cpp&&...............\...\........\srcR3Doc.h&&...............\...\........\srcR3View.cpp&&...............\...\........\srcR3View.h&&...............\...\........\stdafx.cpp&&...............\...\........\stdafx.h&&...............\...\........\targetver.h&&...............\...\........\TreeViewNormal.cpp&&...............\...\........\TreeViewNormal.h&&...............\...\........\UiFrame\CTRLEXT.CPP&&...............\...\........\.......\CTRLEXT.H&&...............\...\........\.......\CTRLEXT.INL&&...............\...\........\.......\FrameworkProperties.cpp&&...............\...\........\.......\FrameworkProperties.h&&...............\...\........\.......\readme.txt&&...............\...\........\.......\UiSwitchConstValue.cpp&&...............\...\........\.......\UiSwitchConstValue.h&&...............\...\........\.......\VisualFrameWorkConstValue.h&&...............\...\........\.......\VisualFx.cpp&&...............\...\........\.......\VisualFx.h&&...............\...\........\ViewNormal.cpp&&...............\...\........\ViewNormal.h&&...............\...\........\ViewUDiskProtected.cpp&&...............\...\........\ViewUDiskProtected.h&&...............\...\HookDll\dllmain.cpp&&...............\...\.......\LsApiHook.cpp&&...............\...\.......\LsApiHook.def&&...............\...\.......\LsApiHook.h&&...............\...\.......\LsApiHook.vcxproj&&...............\...\.......\LsApiHook.vcxproj.filters&&...............\...\.......\ReadMe.txt&&...............\...\.......\stdafx.cpp&&...............\...\.......\stdafx.h&&...............\...\.......\targetver.h&&...............\...\LsComHookProxy\CTypeInterfaceDefine.h&&...............\...\..............\dllmain.cpp&&...............\...\..............\Hook_IFileOperation\Hook_IFileOperation.cpp&&...............\...\..............\...................\Hook_IFileOperation.h&&...............\...\..............\LsComHookProxy.cpp&&...............\...\..............\LsComHookProxy.def&&...............\...\..............\LsComHookProxy.h&&...............\...\..............\LsComHookProxy.vcxproj&&...............\...\..............\LsComHookProxy.vcxproj.filters&&...............\...\..............\ReadMe.txt&&...............\...\..............\stdafx.cpp&&...............\...\..............\stdafx.h&&...............\...\..............\targetver.h&&...............\...\srcAll.sln&&...............\...\common\disasm-lib&&...............\...\......\file&&...............\...\......\mhook-lib&&...............\...\......\string&&...............\...\CtrlProg\res&&...............\...\........\UiFrame
&[]:纯粹是垃圾&[]:文件不全&[]:很好,推荐下载&[]:很好,推荐下载
&近期下载过的用户:
&&&&&&&&[]
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 这是一个dll工程。通过注入到其他进程能捕获到进程的网络收发数据。(所用技术:IAT HOOK,能截取send()、recv()等网络收发函数)
&[] - 非常好的电子书,很难找,主要讲解了windows下的消息机制及钩子过程!
&[] - IFileOperation COM HOOK代码实例
win7系统在explorer.exe中操作文件都是调用IFileOperation COM接口,因此通用方法HOOK Win32 API 如DeleteFile就失去了作用
该实例成功HOOK到了NewItem、RenameItem、Re
&[] - Microsoft MS-DOS6.0 完整源代码,包括所有外部命令,安装程序,DOSSHELL等。每个源文件均包括开发历史、更新说明、注释。这样一套源码对你的意义,实在无法以笔墨形容
&[] - useful for basic hwid usage
&[] - FU rootkit (enhanced)
&[] - MFC目录监视VC源代码,实时监视文件的任何变化
&[] - Inline HOOK NtOpenFile 简单实现保护指定路径文件
&[] - PnigoSpy:
开发环境:win7 x64 VS2010 Detours3.0
本程序可以对正在运行的任意进程的API调用进行监控,并在当前目录生成日志文件便于查看。
&[] - NtCreateProcessEx(HOOKAPI)5526人阅读
USB开发(17)
一、目的:
当計算機有一個或者多個U盤插入時,系統識別后,該應用可以自動獲取U盤的相關信息,如生産廠商信息,產品名,版本號,VID&PID,產品序列號等等一些U盤的相關信息。
二、實現思路:
1、通過獲得U盤盤符獲得設備句柄
首先必須檢測當前系統連接的U盤設備,在這一方面最便捷的方法是掃描當前系統的各個驅動器,判斷當前系統所連設備屬性是否為DRIVE_REMOVABLE,如果是,表明設備是可移動設備,儅我們排除軟盤后,剩下的就是U盤設備了。
//得到U盘盘符;
LPTSTR lpDrives = new TCHAR[MAX_PATH];
DWORD dwLen = ::GetLogicalDriveStrings(MAX_PATH, lpDrives);
CString sDrives[26] = {""};
for(DWORD nIndex = 0; nIndex & dwLen / 4; nIndex++)
if(::GetDriveType(lpDrives + nIndex * 4) == DRIVE_REMOVABLE)
sDrives[nIndex] += (CString)(lpDrives + nIndex * 4);
if(sDrives[nIndex]!=”A://”&&
sDrives[nIndex]!=”B://”)
//…具體操作代碼;
delete lpD
獲得上面這段代碼,獲得了具體的形如“H:/”的設備盤符,並且將這一組盤符存儲在sDevice[26]這樣一個字符串數組中。然後通過具體操作獲得的盤符經過一定的處理將其轉化為形如”////?//H:”的設備路徑,然後再通過CreateFile獲得這個設備的句柄:
HANDLE hDeviceHandle = CreateFile(PATH,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
OPEN_EXISTING,
注意,這裡的第三項參數必須是FILE_SHARE_READ | FILE_SHARE_WRITE,因爲U盤設備是共享設備,第五個參數必須是OPEN_EXISTING,打開現有設備。hDeviceHandle就是我們所需要的U盤句柄了。
獲得這個句柄之後我們將用到一個比較關鍵的函數DeviceIoControl,儅我們對系統的各種設備進行操作時,這個函數是經常要用到的。這個函數中控制碼的種類很多,這裡我們主要討論利用IOCTL_STORAGE_QUERY_PROPERTY這個控制碼,获取设备属性信息,得到系统中所安装的各种固定的和可移动的硬盘、优盘和CD/DVD-ROM/R/W的接口类型、序列号、产品ID等信息。
這裡給出這樣一個函數:
// 取设备属性信息
hDevice -- 设备句柄
pDevDesc -- 输出的设备描述和属性信息缓冲区指针(包含连接在一起的两部分)
BOOL GetDriveProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
STORAGE_PROPERTY_QUERY Q
查询输入参数
DWORD dwOutB
// IOCTL输出数据长度
// IOCTL返回值
// 指定查询方式
Query.PropertyId = StorageDeviceP
Query.QueryType = PropertyStandardQ
// 用IOCTL_STORAGE_QUERY_PROPERTY取设备属性信息
bResult = ::DeviceIoControl(hDevice, //
IOCTL_STORAGE_QUERY_PROPERTY,
取设备属性信息
&Query, sizeof(STORAGE_PROPERTY_QUERY),
输入数据缓冲区
pDevDesc, pDevDesc-&Size,
输出数据缓冲区
&dwOutBytes,
输出数据长度
(LPOVERLAPPED)NULL);
注意,使用這個函數需要引入winioctl.h。在這個頭文件中聲明了STORAGE_DEVICE_DESCRIPTOR這樣一個結構体:
// 查询属性输出的数据结构
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
UCHAR DeviceT
UCHAR DeviceTypeM
// SCSI-2额外的设备类型
BOOLEAN RemovableM
是否可移动
BOOLEAN CommandQ
是否支持命令队列
ULONG VendorIdO
厂家设定值的偏移
ULONG ProductIdO
产品ID的偏移
ULONG ProductRevisionO
产品版本的偏移
ULONG SerialNumberO
序列号的偏移
STORAGE_BUS_TYPE BusT
ULONG RawPropertiesL
额外的属性数据长度
UCHAR RawDeviceProperties[1];
额外的属性数据(仅定义了象征性的1个字节)
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
調用以上列出的GetDriveProperty時要注意聲明一個STORAGE_DEVICE_DESCRIPTOR變量,並且初始化,可以這樣初始化:
PSTORAGE_DEVICE_DESCRIPTOR DeviceD
DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];
DeviceDesc-&Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;
通過這樣我們獲得一個設備對應的屬性數據結構,這樣,我們就可以獲取相關的信息了。
(其中我在Vista+VS2005+WinSDK下只能獲得ProductIdOffset,ProductIdOffset,ProductRevisionOffset等信息,而SerialNumberOffset等信息返回字符串為空串,而且這裡也無法知道U盤的VID&PID,所以以上這兩個無法獲得的信息我們可以通過其它方式獲得,具體見方法2。)
後來我又在win200+VC6+DDK的環境下進行同樣的實驗,發現利用這種方法也同樣是無法獲得SerialNumberOffset,利用這種方法只能獲得硬盤、光驅等硬件設備的SerialNumberOffset,而對於usb設備,包括通過usb連接到電腦上的移動硬盤,也無法通過此种方法獲得。
2、另一種方法是通過設備的GUID號直接找到U盤設備。
實現過程中我們將用到一些WinSDK的函數,SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetInterfaceDeviceDetail。具體用法,請參照相關的文檔,這裡不作詳細介紹
另外,MicroSoft定義了一些設備類的GUID。
DEFINE_GUID(DiskClassGuid, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(CdRomClassGuid, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(TapeClassGuid, 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(FloppyClassGuid, 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
我們同樣可以找到對於USB設備的GUID號
DEFINE_GUID(UsbClassGuid,
0xa5dcbf10L, 0xd2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed)
這樣我們可以通過以下這樣一個函數來實現:
// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE
// 根据GUID获得设备路径
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
HDEVINFO hDevInfoS
//设备信息集句柄;
SP_DEVICE_INTERFACE_DATA
PSP_DEVICE_INTERFACE_DETAIL_DATA pD
// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs(UsbClassGuid,
// class GUID
不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
目前存在的设备
// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
// 申请设备接口数据空间
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
pDetail-&cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
nCount = 0;
bResult = TRUE;
// 设备序号=0,1,2...
逐一测试设备接口,到失败为止
while (bResult)
ifdata.cbSize = sizeof(ifdata);
// 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet,
设备信息集句柄
不需额外的设备描述
(ULONG)nCount,
设备信息集里的设备序号
设备接口信息
if (bResult)
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet,
设备信息集句柄
设备接口信息
设备接口细节(设备路径)
INTERFACE_DETAIL_SIZE,
输出缓冲区大小
不需计算输出缓冲区大小(直接用设定值)
不需额外的设备描述
if (bResult)
// 复制设备路径到输出缓冲区
::strcpy(pszDevicePath[nCount], pDetail-&DevicePath);
// 调整计数值
// 释放设备接口数据空间
::GlobalFree(pDetail);
// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
以上這個函數中除了要包含winioctl.h外,還要包含initguid.h,setupapi.h,以及連接setupapi.lib。
不一樣的是,以上這樣一個函數讓我們獲得了一個形如"//?/usb#vid_0ef5&pid_#{a5dcbf10--901f-00c04fb951ed}"的設備路徑,從以上這一串路徑我們不難找到,已經有VID&PID,產品序列號等信息。如果只是需要這兩個信息的話,我們可以通過提取這段字符串的内容,直接就達到獲得VID&PID和產品序列號的目的。
當然,這樣一個路徑,同樣也可以由方法1中的CreateFile打開獲得句柄。
之後的做法與方法1中的一樣,通過DeviceIoControl函數獲得相關的信息。
3、通過HidD_GetAttributes获得其基本属性信息
HID設備是微軟定義的標準人機接口範圍。不用查找設備具體的GUID,直接使用API
HidD_GetHidGuid(&guidHID)即可得到GUID。有了GUID通過方法2獲得其設備句柄,通过HidD_GetAttributes获得其基本属性信息。當然,這樣獲得的基本屬性可能不全面,可以結合方法1、2來綜合獲取想要得到的信息。具體實現方法這裡不做詳細介紹。這個方法我沒有試過,但應該可以行的通。
通過以上三种方法基本上可以獲得我們所需的所有關於U盤的所有信息了。
4、通過所獲得的U盤盤符找到與其對應的相關信息
從以上的這幾種方法來看,由於每個方法都是通過對於系統的設備進行掃描然後得出U盤盤符、PID/VID,序列號…等。而且由於這些信息是通過多種方法獲得的,儅計算機連接多個usb設備時,那麽以上的這些信息就無法正確的對應起來,尤其是U盤盤符與其唯一標識Serial
Number無法對應,這樣很不利于我們正確的選擇目標usb設備。下面我們來看如何通過U盤盤符找到對應的設備序列號。
第一步,我們仍可以按照方法1种所提到的通過遍歷盤符屬性來找到所有連接到機器上的U盤盤符,然後CreateFile獲得設備句柄。
第二步,在應用DeviceIoControl函數的時候,我們需要引入一個新的查詢方式IOCTL_STORAGE_GET_DEVICE_NUMBER,如
STORAGE_DEVICE_NUMBER
DWORD dwBytesReturned = 0;
用IOCTL_STORAGE_GET_DEVICE_NUMBER取设备號
bResult = ::DeviceIoControl(hDevice, //
IOCTL_STORAGE_GET_DEVICE_NUMBER,
取设备属性信息
输入数据缓冲区
sdn -&Size,
输出数据缓冲区
& dwBytesReturned,
输出数据地址
(LPOVERLAPPED)NULL);
DeviceNumber = pDevDesc.DeviceN
這樣我們可以獲得該盤符對應的設備號,同樣我們可以通過QueryDosDevice來找到該盤符對應的dos設備名:
QueryDosDevice(szDevicePath,
//設備路徑,如:“F:”
szDosDeviceName,
//查詢返回的dos設備名
MAX_PATH);
到現在爲止,我們通過盤符獲得了兩個信息:DeviceNumber,szDosDeviceName。
第三步用下面這樣一個函數來找到相應的設備序列號:
DEVINST GetDrivesDevInstByDiskNumber (long DiskNumber, char *szDosDeviceName)
…//函數的前半部分與方法2种提到的方法相同目的是爲了獲得一個DivicePath;
…//注意這裡用到的GUID應該是DiskClassGuid;
HANDLE hDrive = CreateFile(pspdidd-&DevicePath,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, NULL, NULL);
if ( hDrive != INVALID_HANDLE_VALUE )
STORAGE_DEVICE_NUMBER
DWORD dwBytesReturned = 0;
//通過這樣一個句柄,用同樣的方法也可以得到一個設備號。
res = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &sdn, sizeof(sdn),
&dwBytesReturned, NULL);
if ( res )
//這句是關鍵,通過這兩种方法獲得的.DeviceNumber,進行比較,以DeviceNumber作//爲橋梁,找到了對應的設備
if ( DiskNumber == (long)sdn.DeviceNumber )
CloseHandle(hDrive);
SetupDiDestroyDeviceInfoList(hDevInfo);
return spdd.DevI
//這裡是來返回一個DeviceInstance。
CloseHandle(hDrive);
調用以上這個函數,我們獲得了一個DEVINST,這樣我們就可以通過DDK中CM_Get_Device_ID來獲得設備ID:
char Buf[MAX_PATH];
CM_Get_Device_ID(DevInst,Buf,MAX_PATH,0);
其中的Buf中返回的就是DeviceInstanceID,這是一個形如“USBSTOR/DISK&VEN________&PROD_FREEDIK-LWFORMAT&REV_2.23/1001”的字符串,我們可以看到字符串的最後一串數字就是我們想要得到的SerialNumber。
通過這樣一個方法,我們可以通過所獲得的U盤盤符找到與其對應的相關信息。因爲我們一旦獲得了SerialNumber這樣一個唯一的標識,我們就可以以它為橋梁,找到相關的所有信息了。共被编辑 4 次
我想代码应该挺清楚了。。
bool IsUsbDevice( wchar_t letter )
wchar_t volumeAccessPath[] = L"\\\\.\\X:";
volumeAccessPath[4] =
HANDLE deviceHandle = CreateFileW(
volumeAccessPath,
// no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
// default security attributes
OPEN_EXISTING,
// disposition
// file attributes
// do not copy file attributes
// setup query
STORAGE_PROPERTY_QUERY
memset(&query, 0, sizeof(query));
query.PropertyId = StorageDeviceP
query.QueryType = PropertyStandardQ
// issue query
STORAGE_DEVICE_DESCRIPTOR
STORAGE_BUS_TYPE busType = BusTypeU
if (DeviceIoControl(deviceHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
&query, sizeof(query),
&devd, sizeof(devd),
&bytes, NULL))
busType = devd.BusT
std::wcout && L"Failed to define bus type for: " &&
CloseHandle(deviceHandle);
return BusTypeUsb == busT
另外msdn那种说法应该是这个?来自:
#include "stdafx.h"
#include &setupapi.h&
#include &devguid.h&
#include &cfgmgr32.h&
extern "C" __declspec(dllexport) int usb_hard_drives() {
HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, DIGCF_PRESENT);
if (hdevinfo == INVALID_HANDLE_VALUE) return -1;
DWORD MemberIndex = 0;
SP_DEVINFO_DATA sp_devinfo_
ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
int c = 0;
while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
DWORD PropertyRegDataT
DWORD RequiredS
DWORD PropertyB
if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_CAPABILITIES, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
if (PropertyBuffer && CM_DEVCAP_REMOVABLE == CM_DEVCAP_REMOVABLE) {
// do something here to identify the drive letter.
MemberIndex++;
SetupDiDestroyDeviceInfoList(hdevinfo);
我想代码应该挺清楚了。。
bool IsUsbDevice( wchar_t letter )
wchar_t volumeAccessPath[] = L"\\\\.\\X:";
volumeAccessPath[4] =
HANDLE deviceHandle = CreateFileW(
volumeAccessPath,
// no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
// default security attributes
OPEN_EXISTING,
// disposition
// file attributes
// do not copy file attributes
// setup query
STORAGE_PROPERTY_QUERY
memset(&query, 0, sizeof(query));
query.PropertyId = StorageDeviceP
query.QueryType = PropertyStandardQ
// issue query
STORAGE_DEVICE_DESCRIPTOR
STORAGE_BUS_TYPE busType = BusTypeU
if (DeviceIoControl(deviceHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
&query, sizeof(query),
&devd, sizeof(devd),
&bytes, NULL))
busType = devd.BusT
std::wcout && L"Failed to define bus type for: " &&
CloseHandle(deviceHandle);
return BusTypeUsb == busT
另外msdn那种说法应该是这个?来自:
我想代码应该挺清楚了。。
bool IsUsbDevice( wchar_t letter )
wchar_t volumeAccessPath[] = L"\\\\.\\X:";
volumeAccessPath[4] =
HANDLE deviceHandle = CreateFileW(
volumeAccessPath,
// no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
// default security attributes
OPEN_EXISTING,
// disposition
// file attributes
// do not copy file attributes
// setup query
STORAGE_PROPERTY_QUERY
memset(&query, 0, sizeof(query));
query.PropertyId = StorageDeviceP
query.QueryType = PropertyStandardQ
// issue query
STORAGE_DEVICE_DESCRIPTOR
STORAGE_BUS_TYPE busType = BusTypeU
if (DeviceIoControl(deviceHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
&query, sizeof(query),
&devd, sizeof(devd),
&bytes, NULL))
busType = devd.BusT
std::wcout && L"Failed to define bus type for: " &&
CloseHandle(deviceHandle);
return BusTypeUsb == busT
我想代码应该挺清楚了。。
我要该,理由是:

我要回帖

更多关于 windows api 的文章

 

随机推荐