How To get the usbdisk's drive letter properly

通过DeviceIoControl获取U盘或移动硬盘的出品商、制造商和版本号等信息 本文通过DeviceIoControl获取插入计算机的USB设备的vender、producter和version 阅读详情

Sample image

Introduction

We know USB disk should be a removable disk just like floppy disk, and be used more and more widely now. Because, the USB disk is more faster, reliable, and affordable than old floppy disk.

So, when we want to check one disk or drive of target system is removable or not, we may be thinking of using API function "GetDriveType()". Yes, it really works on some USB device, such as 16MB, 32MB, 64MB, and 128MB. ;-) Here, how about removable hard disk which is connected to system by USB channel? - Windows will report them as 'Fix Disk', and we would get the same result using 'GetDriveType()' function.

How can we differentiate between these USB ‘Fix Disk’ and Those IDE ‘Fix Disk’? Here is the solution for this event.

Background

(Why do I want get the USB disks' drive letter properly? Because I want to check the virus while one new USB drive is inserted. We should not be remiss of the virus which is more and more technical day by day:)

Since we can get the base information about the disk type (using API Function ‘GetDriveType()’), we may only want to check the ‘Removable Hard Disk’ to verify its bus-type. Well, we’ll have two steps to get the USB disk’s drive letters:

Code Thoughts

1. Get the disks base information:

switch ( GetDriveType( szDrvName ) ) 
{
 case 0: // The drive type cannot be determined.
 case 1: // The root directory does not exist.
 drivetype = DRVUNKNOWN;
 break;
 case DRIVE_REMOVABLE: // The drive can be removed from the drive.
 drivetype = DRVREMOVE;
 break;
 case DRIVE_CDROM: // The drive is a CD-ROM drive.
 break;
 case DRIVE_FIXED: // The disk cannot be removed from the drive.
 drivetype = DRVFIXED;
 break;
 case DRIVE_REMOTE: // The drive is a remote (network) drive.
 drivetype = DRVREMOTE;
 break;
 case DRIVE_RAMDISK: // The drive is a RAM disk.
 drivetype = DRVRAM;
 break;
}

These codes above are based on ‘Article ID: Q161300 HOWTO: Determine the Type of Drive Using Win32’ from MSDN.

2. Determinate the bus type of the ‘Fix Disk’:

Now, we may embed our codes at the ‘case = DRIVE_FIXED’:

Open the drive which we get now:

hDevice = CreateFile(szBuf, 
  GENERIC_READ, 
  FILE_SHARE_READ | FILE_SHARE_WRITE, 
  NULL, OPEN_EXISTING, NULL, NULL);

If we opened this drive, check its BUSTYPE, using API GetDisksProperty():

if(GetDisksProperty(hDevice, pDevDesc))
{
 if(pDevDesc->BusType == BusTypeUsb) // This is the ‘Check Point’!!! ;-)
 {
  // We store the drive letter here
  szMoveDiskName[k] = chFirstDriveFromMask(temp); 
  szMoveDiskName[0]=k;
  k++;
 }
}

Close this drive when we finished our work on it:

CloseHandle(hDevice);

3. How does the GetDisksProperty() work?

/********************************************************
*
* FUNCTION: GetDisksProperty(HANDLE hDevice, 
* PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
*
* PURPOSE: get the info of specified device
*
******************************************************/
BOOL GetDisksProperty(HANDLE hDevice, 
  PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
 STORAGE_PROPERTY_QUERY Query; // input param for query
 DWORD dwOutBytes; // IOCTL output length
 BOOL bResult; // IOCTL return val

 // specify the query type
 Query.PropertyId = StorageDeviceProperty;
 Query.QueryType = PropertyStandardQuery;

 // Query using IOCTL_STORAGE_QUERY_PROPERTY 
 bResult = ::DeviceIoControl(hDevice, // device handle
 IOCTL_STORAGE_QUERY_PROPERTY, // info of device property
  &Query, sizeof(STORAGE_PROPERTY_QUERY), // input data buffer
  pDevDesc, pDevDesc->Size, // output data buffer
  &dwOutBytes, // out's length
  (LPOVERLAPPED)NULL); 

 return bResult;
}

Comments

  1. There are some structures not commented, see usbdisks_src for them.;
  2. Floppy drive (A: or B:) is reported as USB Disks by this demo, -And- it is easy to correct this, just putting some codes to the ‘case = DRIVE_REMOVABLE:‘;

History

  • 2004-03-29 - 1st GO
Delphi硬盘ID检索教程与实战 Delphi,作为现代软件开发领域中的一种历史悠久的编程语言,以其快速开发能力、强大的编译器和丰富的组件库而闻名。本章节旨在为读者提供对Delphi语言的基本了解和它在软件开发中的应用概述。硬盘ID是硬盘制造时由厂商分配的一个唯一标识符,类似于硬盘的”指纹”。它是一个用于识别硬盘的物理地址,通常由一系列字母和数字组成。在系统中,硬盘ID可以用于区分不同的存储设备,尤其是在有多个硬盘的计算机系统中。了解硬盘ID对于硬盘的管理和维护具有重要意义。 阅读详情

相关推荐

DELPHI获取硬盘物理ID源代码

DELPHI获取硬盘物理ID,全球唯一ID,无重复,DELPHI开发源代码

DELPHI 查询硬盘厂商、型号、ID号

直接上代码,不是原创,我不过是扒老外衣,供自己取暖。需要注意的是,以下代码在D7完美运行,DELPHI XE10.2 ,需要改字符类型。也可完美运行,本人亲测。 引用单元 unit hddinfo; interface uses Windows, SysUtils, Classes; const   IOCTL_STORAGE_QUERY_PROPERTY = $2D1400; type TH...

qq457565758的博客 1170

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 507

IOCTL_STORAGE_QUERY_PROPERTY

最近学习scsi和DeviceIoControl,下载了微软WDK一些例子,以下代码精简自Windows-driver-samples-master\storage\tools\spti\src\spti.c ,略有修改。 #include <windows.h> #include <stdio.h> #include <strsafe.h> voi...

weixin_30632899的博客 3431

CKAD-CN 考试知识点分享(12) Secret - 1

步骤操作完成1提取 Deployment 中的硬编码 Secret 值✅2创建名为postgres的 Secret✅3修改 Deployment 使用引用 Secret✅4验证新 Pod 正常运行✅❌未删除原 Deployment✅(遵守要求)✅任务完成。敏感信息已从环境变量移出,安全地存储在 Kubernetes Secret 中。

轻的博客 634

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9313

实时获得USB磁盘(再次更新)

by czy10分感谢sinister老大指点,程序流层:先通过设备消息得到新加入的盘符并且排除映射盘(net use/subst).然后通过DeviceIoControl函数发送IOCTL_STORAGE_BASE equ FILE_DEVICE_MASS_STORAGE得到盘符的总线类别,而不是通过一般的GetDirverTyte,或是网上有些人说的IOCTL_STORAGE_GET_ME

1463

【C++】auto关键字(C++11,超详细解析,小白必看系列)

本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。

m0_73494049的博客 6万+

Windows下如何获取usb device信息

Windows provided some API to get the device's detail information, include USB STORAGE HID PCI etc #include #include // for GUID_DEVCLASS_CDROM etc #include #include // for MAX_DEVICE_ID_

chrovery的专栏 1万+

2024年最全scrapy+scrapyd+gerapy 爬虫调度框架,字节跳动面试时间

scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们方便地控制爬虫运行直观地查看爬虫状态实时地查看爬取结果简单地实现项目部署统一地实现主机管理轻松地编写爬虫代码。

2401_84140653的博客 1203

(一)激光线扫描-三维成像原理

激光线扫描是一种使用激光作为光源,通过特定的扫描设备(如光学镜头、电机驱动的镜头或电子扫描设备)将激光束引导到目标表面,并按照预定的路径进行扫描的技术。这种技术通常用于测量、检测、打印、切割等多种应用中。

FlyWine的博客 3634

获取磁盘总线类型和厂商信息以及产品信息的

以下是从群聊天中整理的代码 #ifndef VolumeType_h__ #define VolumeType_h__ #pragma once #include  #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCE

FrankieWang008的专栏 1667

RK3588多核NPU并行加速yolo优化教程:基于线程池的高性能推理实现

本教程详细介绍了RK3588多核NPU的并行加速优化方法。RK3588搭载三个独立NPU核心,总计算能力达6TOPS,但传统单线程方式无法充分发挥其性能。文章从硬件架构分析入手,详细讲解了三核心独立处理架构和多种工作模式,并通过代码示例展示了线程池技术的实现原理。线程池通过预创建工作线程、任务队列和条件变量等核心组件,避免了频繁创建线程的开销,能显著提升NPU的并行处理效率。教程还提供了性能计算公式和内存带宽优化策略,帮助开发者最大化利用RK3588的硬件算力,实现高性能AI推理。

LXY_LOVE36的博客 1025

实战DeviceIoControl 之五:列举已安装的存储设备

P.bhw98{ PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 5px; LINE-HEIGHT: normal; PADDING-TOP: 0px; FONT-FAM

1万+

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7621

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

获取硬盘和卷或分区相关信息(容量,ID,卷标名字等)

1、枚举所有硬盘 这里主要借助了setup API,这些API主要是NT4.0之后提供的一些用于操作设备的API。 枚举所有硬盘借助了SetupDiGetClassDevs与SetupDiEnumDeviceInterfaces和 SetupDiGetDeviceInterfaceDetail这三个API。 #pragma once #ifndef DEVICE_DISK_H #define DEVICE_DISK_H #include <Windows.h> #include &l

lengye7的博客 3628

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

USBView & How to get the Serial Number from a USB disk & qextserialport

说明:码农的福音,实现查找 USB 设备序列号的文章,对于操作USB的码农或许有些帮助。[佐料:整理这篇的代码,并将其整合到工程的代码中时,另外找到了一个更好的资源,https://code.google.com/p/qextserialport/,  qextserialport,一个为Qt写的USB enumerate & discover库,轻量而灵敏,强烈推荐] 原文:http://ww

暧暧远人村,依依墟里烟 ... 3371

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

delphi 硬盘特理序列号

unit DiveID; interface //{$I CnPack.inc} uses Classes, Windows, SysUtils, ExtCtrls; const RelationCache = 2; RelationNumaNode = 1; RelationProcessorCore = 0; RelationProcessorPackage = 3; type TCacheType = (CacheUnified, CacheInstruction,

yygyyygy1233的博客 859

判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘))

判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘)) // CheckMoveDisk.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <Windows.h> #include <vector> #include <string> #include "AsStringUtil.h" #include <stdio.h> using namespace s

weixin_37724132的博客 3148

U盘检测的程序

#include "stdafx.h"#include "test.h"#include "usbhead.h"int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){ int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::Get

dijkstar的专栏 3359

IOCTL_STORAGE_PROPERTY_QUERY

Thanks.I also find some thing :1)use drive letter, use createfile2)use IOCTL_STORAGE_PROPERTY_QUERY, query some property of thestorage device3)if device's Bustype is BusTypeUsb, it's based on usb device4)vid & pid is obvious in out data

mayahw1983的专栏 2766

利用IOCTL_STORAGE_QUERY_PROPERT获取总线类型

<br />#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE<br />// IOCTL控制码<br />#define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)<br /> <br />// 存储设备的总线类型<br />typedef enum _STORAGE_BUS_TYPE {<br

youyun01的专栏 2833

DeviceIoControl获取max transfer长度

最近在调试一个PC操作USB Massstorage设备的工具,通过DeviceIoControl()函数读取约1-2M的数据,但是传入数据长度以后函数返回错误,原因是长度超过了规定的transfer len。从网上找了半天,在国外论坛发现一个类似的问题解决,即:用IOCTL_STORAGE_QUERY_PROPERTY 命令得到一个Max transfer length,然后根据实际情况解决

抱一归元 1052
上一篇: Cisco路由器的安全配置方案
下一篇: 穿透代理服务器编程
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值