无忧启动论坛
标题: 有没有显示磁盘类型的命令行工具? [打印本页]
作者: liuzhaoyzz 时间: 2020-11-10 14:55
标题: 有没有显示磁盘类型的命令行工具?
本帖最后由 liuzhaoyzz 于 2020-11-10 15:02 编辑
有没有显示磁盘类型的命令行工具?
遍历所有的盘符,并且显示出其磁盘类型,磁盘类型有:
GetDriveType函数#GetDriveType函数用于判断一个磁盘驱动器的类型。
函数声明如下
| UINT WINAPI GetDriveType( |
| _In_opt_ LPCTSTR lpRootPathName |
| ); |
参数lpRootPathName包含了根目录路径的字符串指针。
如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型
[td]
常数 含义
DRIVE_UNKNOWN 未知的磁盘类型
DRIVE_NO_ROOT_DIR 说明lpRootPathName是无效的
DRIVE_REMOVABLE 可移动磁盘
DRIVE_FIXED 固定磁盘
DRIVE_REMOTE 网络磁盘
DRIVE_CDROM 光驱
DRIVE_RAMDISK RAM映射磁盘
C++ 如何判断一个驱动卷是本地硬盘,还是USB接入的移动硬盘?电脑机子上本来有C,D,E,F 四个盘,当USB接入一个移动硬盘后会增加 H ,I两个盘,我用GetDriveType()来获取各个盘的类型时,则得到返回值都是DRIVE_FIXED,无法区分这六个盘的类型。有什么办法可以区分H ,I盘属于USB接入的移动硬盘?我查了MSDN很久也无法解决,有人提出系统分区数+驱动卷判断,这个方法看似可行,然而我却不懂获取磁盘的分区表,请高手赐教。
有没有用c++或者pecmd之类写好的现成的,小巧的命令行工具?
作者: 江南一根葱 时间: 2020-11-10 15:33
百草的fbinstplus不是可以列出usb磁盘吗
作者: 红毛樱木 时间: 2020-11-10 15:36
- CALL $--ret:&&GetDriveTypeWRet Kernel32.dll,GetDriveTypeW,#0
- MESS. %&&GetDriveTypeWRet%
复制代码
lpRootPathName为空,A trailing backslash is required. If this parameter is NULL, the function uses the root of the current directory.
lpRootPathName怎么表示C:盘,不太明白
作者: liuzhaoyzz 时间: 2020-11-10 16:03
你给的这段代码,怎么显示所有盘符?#0表示0号分区吗?
我在csdn上面还看到个例子:VC下获取各个驱动器路径,分类及其获取其信息的资料整理
作者: 红毛樱木 时间: 2020-11-10 16:09
- CALL $--ret:&&GetDriveTypeWRet Kernel32.dll,GetDriveTypeW,#0
复制代码
#0是PECMD里的NULL
我试着用
CALL $--ret:&&GetDriveTypeWRet Kernel32.dll,GetDriveTypeW,$C://
不行,不知道怎么传盘符到这个里面,可能格式不对
作者: CodeHz 时间: 2020-11-10 16:14
本帖最后由 CodeHz 于 2020-11-10 16:17 编辑
简单用c整了一个
- #include <windows.h>
- #include <stdio.h>
- char fetchbit(int mask, int idx) {
- return mask & (1 << idx) ? 'A' + idx : 0;
- }
- char *showtype(int res) {
- switch (res) {
- #define X(x) case DRIVE_##x: return #x
- X(UNKNOWN);
- X(NO_ROOT_DIR);
- X(REMOVABLE);
- X(FIXED);
- X(REMOTE);
- X(CDROM);
- X(RAMDISK);
- #undef X
- default: return "ERROR";
- }
- }
- int main() {
- int mask = GetLogicalDrives();
- char buf[] = "?:\";
- for (int i = 0; i < 26; i++) {
- char c = fetchbit(mask, i);
- if (!c) continue;
- buf[0] = c;
- char *type = showtype(GetDriveType(buf));
- printf("%c:\\ -> %s\n", c, type);
- }
- }
复制代码 可以用我的tjs来调用或者编译它(http://bbs.wuyou.net/forum.php?mod=viewthread&tid=422705)
直接运行:
- <div>import { Compiler } from "builtin:c"</div><div>const compiler = new Compiler("memory");</div><div>compiler.link("kernel32");</div><div>compiler.compile(String.raw`
- <就上面那段C>
- `);
- compiler.run();</div>
复制代码
编译:
- <div>import { Compiler } from "builtin:c"</div><div>const compiler = new Compiler("exe");</div><div>compiler.link("kernel32");</div><div>compiler.compile(String.raw`
- <就上面那段C>
- `);
- compiler.output("listdrive.exe");</div>
复制代码 附带一个编译好的
test.exe
(3.5 KB, 下载次数: 13)
作者: liuzhaoyzz 时间: 2020-11-10 16:15
本帖最后由 liuzhaoyzz 于 2020-11-10 16:36 编辑
【Fbinst Plus V1.5.1703.13】Fbinst增强版,2017年重大更新 - USB启动区 - 无忧启动论坛
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=187865
果然是可以!多谢!
--hdlist: 获取磁盘列表功能
fbinst --hdlist [输出格式] [磁盘类型] [是否是移动磁盘] [--UD]
fbinst --hdlist 默认格式获取所有磁盘列表
fbinst --hdlist "" 默认格式获取所有磁盘列表
fbinst --hdlist "(hd%N) %T_%R_%I (%P) %Sg %U" 按指定格式输出磁盘列表
得到类似结果:(hd1) SATA_FIXED_WDC-WD5000AAKX-001CA0 (C: D: E: L: ) 466 G
其中:%N 表示磁盘号 (特别注意,命令行下直接输命令是%N,批处理中是%%N,下同)
%T 表示磁盘类型,具体类型稍候给出
%R 表示是否是移动磁盘,是显示为REMOVABLE,否则显示为固定磁盘FIXED
%I 表示磁盘型号(ID),例如WDC-WD5000AAKX-001CA0
%P 表示包含的分区
%S 表示磁盘大小,单位G,小于1G的统一显示为0G
%U 标识磁盘是否为ud盘,是ud盘标识为*号,不是为空。
不需要每次都显示所有项目,可以选择需要的项目显示,例如 fbinst --hdlist "(hd%N): %Sg"
fbinst --hdlist "(hd%N): %Sg %U" --USB --FIXED 按规定格式输出磁盘类型为USB的固定磁盘
fbinst --hdlist "" --USB USB磁盘列表
fbinst --hdlist "(hd%N): %Sg" --USB --REMOVABLE U盘列表
fbinst --hdlist "(hd%N): %Sg" --USB --FIXED 移动硬盘列表
fbinst --hdlist "(hd%N): %Sg" --SATA SATA磁盘列表
fbinst --hdlist "(hd%N): %Sg" --ALL --FIXED 所有硬盘列表(注意磁盘和硬盘的区别)
fbinst --hdlist "(hd%N): %U" --ALL --ALL --UD 所有ud盘列表
fbinst --hdlist "(hd%N): %U" --ALL --REMOVABLEL --UD 所有UD格式的U盘列表
如果用到 [磁盘类型] 参数,那么前面的 [输出格式]不可以省略,但可以为""
如果用到[是否是移动磁盘],那么前面的两个参数都不可以省略,[输出格式]可以为"",磁盘类型可以为--ALL
磁盘类型:(相应的参数为 --类型)
"Unknown","SCSI","Atapi","Ata","1394","Ssa","Fibre","USB","RAID","iSCSI",
"SAS","SATA","SD","MMC","Virtual","FileBackedVirtual","Max","MaxReserved"
-
QQ截图20201110163625.jpg
(30.96 KB, 下载次数: 151)
作者: liuzhaoyzz 时间: 2020-11-10 16:24
这个还需要进一步区分移动硬盘和固定硬盘才行啊。现在没有区分开来。
-
QQ截图20201110162208.jpg
(16.53 KB, 下载次数: 146)
作者: CodeHz 时间: 2020-11-10 16:39
test.exe
(4 KB, 下载次数: 17)
大概这个可以检测了(
作者: liuzhaoyzz 时间: 2020-11-10 16:43
大神就是大神!果然可以了!感谢!请把源代码传上来,谢谢!
-
QQ截图20201110164301.jpg
(26.82 KB, 下载次数: 151)
作者: CodeHz 时间: 2020-11-10 16:47
本帖最后由 CodeHz 于 2020-11-10 16:53 编辑
- #include <windows.h>
- #include <stdio.h>
- char fetchbit(int mask, int idx) {
- return mask & (1 << idx) ? 'A' + idx : 0;
- }
- char *showtype(int res) {
- switch (res) {
- #define X(x) case DRIVE_##x: return #x
- X(UNKNOWN);
- X(NO_ROOT_DIR);
- X(REMOVABLE);
- X(FIXED);
- X(REMOTE);
- X(CDROM);
- X(RAMDISK);
- #undef X
- default: return "ERROR";
- }
- }
- char *busType(char c) {
- char volumeAccessPath[] = "\\\\.\\?:";
- volumeAccessPath[4] = c;
- HANDLE deviceHandle = CreateFileA(
- volumeAccessPath,
- 0,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- 0,
- NULL
- );
- STORAGE_PROPERTY_QUERY query = {};
- query.PropertyId = StorageDeviceProperty;
- query.QueryType = PropertyStandardQuery;
-
- DWORD bytes;
- STORAGE_DEVICE_DESCRIPTOR devd;
- STORAGE_BUS_TYPE busType = BusTypeUnknown;
-
- if (DeviceIoControl(deviceHandle, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &devd, sizeof(devd), &bytes, NULL)) {
- busType = devd.BusType;
- } else {
- return "UNKNOWN";
- }
-
- CloseHandle(deviceHandle);
- switch (busType) {
- #define X(v, a) case v: return #a
- X(0x1, SCSI);
- X(0x2, ATAPI);
- X(0x3, ATA);
- X(0x4, 1394);
- X(0x5, SSA);
- X(0x6, FIBRE);
- X(0x7, USB);
- X(0x8, RAID);
- X(0x9, iSCSI);
- X(0xA, SAS);
- X(0xB, SATA);
- X(0xC, SD);
- X(0xD, MMC);
- X(0xE, VIRTUAL);
- X(0xF, FILE_BACKED_VIRTUAL);
- X(0x10, SPACES);
- #undef X
- default: return "UNKNOWN";
- }
- }
- int main() {
- int mask = GetLogicalDrives();
- char buf[] = "?:\";
- for (int i = 0; i < 26; i++) {
- char c = fetchbit(mask, i);
- if (!c) continue;
- buf[0] = c;
- char *type = showtype(GetDriveType(buf));
- char *usb = busType(c);
- printf("%c:\\ -> %s %s\n", c, type, usb);
- }
- }
复制代码 源码在这里,顺便改进了下,把更多的细节属性都暴露了
test.exe
(4.5 KB, 下载次数: 27)
作者: 红毛樱木 时间: 2020-11-10 17:00
原来你是要这种效果 - -
- FORM ,&BUSNAME=C:
- MESS. %&BUSNAME%
复制代码
总线类型 BusTypeUnknown = 0 BusTypeScsi=1, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeSd, BusTypeMmc, BusTypeVirtual,BusTypeFileBackedVirtual,BusTypeSpaces,BusTypeNvme,BusTypeSCM,BusTypeUfs,BusTypeMax,BusTypeMaxReserved
作者: liuzhaoyzz 时间: 2020-11-10 17:04
不能遍历所有盘符,然后显示具体类型吗?
作者: liuzhaoyzz 时间: 2020-11-10 17:05
本帖最后由 liuzhaoyzz 于 2020-11-10 17:07 编辑
这个显示效果更好了,更加便于过滤!高手在民间啊!
-
QQ截图20201110170521.jpg
(21.65 KB, 下载次数: 143)
作者: 红毛樱木 时间: 2020-11-10 17:06
自己再套代码呀。要搞全套吗?
作者: liuzhaoyzz 时间: 2020-11-10 17:06
我是pecmd白痴啊,楼上的两个方案都能够达到目的。
作者: 红毛樱木 时间: 2020-11-10 17:15
- ENVI^ EnviMode=1
- ENVI$ &NL=0d 0a
- ENVI$ &TAB=09
- ENVI &AllInfos=
- FDRV &AllDrvs=*:
- FORX *v &AllDrvs,&Drv,
- {*
- FORM ,&BUSNAME=%&Drv%
- CALL Translation_STORAGE_BUS_TYPE %&BUSNAME% &BUSNAMEType
- ENVI< &ALLInfos=%&Drv%%&TAB%%&&BUSNAMEType%%&NL%
- }
- MESS. %&ALLInfos%
- _SUB Translation_STORAGE_BUS_TYPE
- ^IFEX $%1=0, TEAM ENVI-ret %2=Unknown| EXIT _SUB
- ^IFEX $%1=1, TEAM ENVI-ret %2=Scsi| EXIT _SUB
- ^IFEX $%1=2, TEAM ENVI-ret %2=Atapi| EXIT _SUB
- ^IFEX $%1=3, TEAM ENVI-ret %2=Ata| EXIT _SUB
- ^IFEX $%1=4, TEAM ENVI-ret %2=1394| EXIT _SUB
- ^IFEX $%1=5, TEAM ENVI-ret %2=Ssa| EXIT _SUB
- ^IFEX $%1=6, TEAM ENVI-ret %2=Fibre| EXIT _SUB
- ^IFEX $%1=7, TEAM ENVI-ret %2=Usb| EXIT _SUB
- ^IFEX $%1=8, TEAM ENVI-ret %2=RAID| EXIT _SUB
- ^IFEX $%1=9, TEAM ENVI-ret %2=iScsi| EXIT _SUB
- ^IFEX $%1=10, TEAM ENVI-ret %2=Sas| EXIT _SUB
- ^IFEX $%1=11, TEAM ENVI-ret %2=Sata| EXIT _SUB
- ^IFEX $%1=12, TEAM ENVI-ret %2=Sd| EXIT _SUB
- ^IFEX $%1=13, TEAM ENVI-ret %2=Mmc| EXIT _SUB
- ^IFEX $%1=14, TEAM ENVI-ret %2=Virtual| EXIT _SUB
- ^IFEX $%1=15, TEAM ENVI-ret %2=FileBackedVirtual| EXIT _SUB
- ^IFEX $%1=16, TEAM ENVI-ret %2=Spaces| EXIT _SUB
- ^IFEX $%1=17, TEAM ENVI-ret %2=Nvme| EXIT _SUB
- ^IFEX $%1=18, TEAM ENVI-ret %2=SCM| EXIT _SUB
- ^IFEX $%1=19, TEAM ENVI-ret %2=Ufs| EXIT _SUB
- ^IFEX $%1=20, TEAM ENVI-ret %2=Max| EXIT _SUB
- ^IFEX $%1=0x7F, TEAM ENVI-ret %2=MaxReserved| EXIT _SUB
- _END
复制代码 B站直播间地址:https://live.bilibili.com/22611892
B站帐号:系统总裁官方帐号
每天下午不定时直播,固定直播时间每周五晚八点
欢迎各位PECMD开发爱好者一起交流学习
作者: caocaofff 时间: 2020-11-10 17:52
支持推广PECMD
作者: 9zhmke 时间: 2020-11-10 18:07
本帖最后由 9zhmke 于 2020-11-10 18:25 编辑
VBS也很简单,把里面查硬盘的DriveType从多换成1就是U盘了。
- Set colDrives = CreateObject("Scripting.FileSystemObject").Drives
- For Each objDrive in colDrives
- if objDrive.DriveType=2 then '0:"未知"/1:"可移动"/2:"固定"/3:"网络"/4:"CD-ROM"/5:"RAM 磁盘"
- msgbox objDrive.DriveLetter
- end if
- Next
复制代码
disk.7z
(333 Bytes, 下载次数: 4)
如果想直接写到批处理中,这样写可以直接列出磁盘列表,前面是类型,后面字母是盘号:
- mshta VBScript:Execute("For Each objDrive in CreateObject(""Scripting.FileSystemObject"").Drives:msgbox objDrive.DriveType&objDrive.DriveLetter:Next:close")
复制代码
作者: slore 时间: 2020-11-10 21:15
本帖最后由 slore 于 2020-11-10 21:18 编辑
https://github.com/stevedonovan/ ... irectory-operations
- drives = winapi.get_logical_drives()
- for _, drive in ipairs(drives) do
- print(drive .. ' ' .. winapi.get_drive_type(drive))
- end
复制代码
- C:\ fixed
- D:\ fixed
- E:\ fixed
- F:\ fixed
- H:\ cdrom
- I:\ cdrom
- K:\ removable
- Z:\ fixed
复制代码
lua可以自由扩展C函数,API, 封装。
https://github.com/stevedonovan/winapi/blob/master/winapi.c#L2228
作者: 永远的大象 时间: 2020-11-10 21:57
fbinst
作者: liuzhaoyzz 时间: 2020-11-11 08:19
本帖最后由 liuzhaoyzz 于 2020-11-11 17:09 编辑
代码准确,谢谢!
另外想问下,怎么搞成命令行的?
-
QQ截图20201111081727.jpg
(6.38 KB, 下载次数: 142)
作者: liuzhaoyzz 时间: 2020-11-11 08:20
VBS适用性不太好,有的PE里面没有。
作者: liuzhaoyzz 时间: 2020-11-11 17:06
本帖最后由 liuzhaoyzz 于 2020-11-11 17:08 编辑
没有看明白,lua环境是怎么调用的?winapi怎么用?怎么运行?github上面,我没有看到release版本的exe文件啊?
作者: plusv 时间: 2020-11-11 21:40
>github上面,我没有看到release版本的exe文件啊?
github上面,通常要自己编译为 EXE.
作者: slore 时间: 2020-11-11 23:18
lua.exe你可以从
https://sourceforge.net/projects/luabinaries/files/5.4.0/Tools%20Executables/
下载。
winpai.dll需要自己编译。。。
WinXShell.exe已经把lua和winapi.dll编译了,上面的代码可以 -script xxx.lua 执行,
但是WinXShell.exe是Windows程序,输出外部程序捕获不到,
lua中写文件,或者lua代码处理都可以。
给你个附件,你双击运行就可以了。
lua_winapi.7z
(1.79 MB, 下载次数: 14)
最新版是5.4,但是我的winapi.dll是当时5.3版本,所以需要5.3的lua.exe
作者: liuzhaoyzz 时间: 2020-11-12 07:25
本帖最后由 liuzhaoyzz 于 2020-11-12 08:22 编辑
代码还需要改进下,没有把本地硬盘和移动硬盘区分开来,都显示的是fixed。
complate拼写应该是complete吧。
-
QQ拼音截图20201112072447.png
(9.56 KB, 下载次数: 143)
作者: liuzhaoyzz 时间: 2020-11-12 07:27
有时候搭建编译环境挺麻烦的,不同的Visual studio版本什么的。有时候出错挺麻烦。
作者: plusv 时间: 2020-11-12 08:16
说的没错.
通常 非必要 或 非常喜欢那个程序 我也是懒的去编译,
我的 10 余年老 PC 不给力这样大工程,老 PC 会归西.
作者: CodeHz 时间: 2020-11-12 08:40
liuzhaoyzz 发表于 2020-11-12 07:27
有时候搭建编译环境挺麻烦的,不同的Visual studio版本什么的。有时候出错挺麻烦。
这也是我整tjs的一个目的,目前可以算是半个c语言开发环境了(当然兼容现有项目不是我的目标,这个整下去没完)
作者: liuzhaoyzz 时间: 2020-11-12 09:00
不明觉厉!
作者: slore 时间: 2020-11-12 09:47
complete是批处理(lua脚本)里面的,随便改不用编译。就是个例子可以写个Windows API的库封装,用脚本调用。做小工具比较方便。lua和lib是C语言,集成到任何程序都很容易,体积也不增加多少。
因为是C语言,只需要TCC(Tiny C Compiler)就可以编译。TCC不到500kb。没必要用Visual Studio。
作者: plusv 时间: 2020-11-12 15:53
通常我会先看 Readme,
会有编译的说明,
当看到要用 MS VS 去编译,我就会懒,
除非我非常喜欢那个程序.
当看到要是纯 C 我第一时间是比较开心的,
因为不用动用大家伙.
作者: 红毛樱木 时间: 2020-11-12 16:36
把
换成
- WRIT *fv --,$+0,&ALLInfos
复制代码 再把PECMD.exe换成PECMD原始_cli.EXE (在PECMD包里)
效果
作者: liuzhaoyzz 时间: 2020-11-13 08:12
哦,试了下,可以了!
作者: liuzhaoyzz 时间: 2020-11-19 15:33
本帖最后由 liuzhaoyzz 于 2020-11-19 15:45 编辑
1、还要友情楼主出手下,这个程序,不支持xp吗?能否做静态编译?我在xp里面试了下无法运行啊?
2、为了测试,我特意下载了360安全卫士,结果这个程序一下子就被360咔嚓掉了,如果夹在批处理里面发给别人,被杀掉就没法用,是不是因为你用了你自己的tjs编译器导致的360不认识?能不能用vc做个静态编译?
-
VXP-2020-11-19-15-29-17.png
(43.43 KB, 下载次数: 80)
作者: CodeHz 时间: 2020-11-19 15:39
这个错误看起来就是用了64位的版本,但是xp是32位的(360误报这个我不负责解决,这事得交保护费
作者: liuzhaoyzz 时间: 2020-11-19 15:45
哦,看了下,drivetype果然是64位PE文件。恳请楼主编译个32位的。
作者: liuzhaoyzz 时间: 2020-11-19 22:58
本帖最后由 liuzhaoyzz 于 2020-11-19 23:03 编辑
527104427 发表于 2020-11-19 20:27
再给你增强一下ChkMbrPbr吧,来个一箭四雕。 -ChkAllDrvType 列出所有磁盘, -ChkDrvType L: 仅列出L ...
感谢5大出手!chkmbrpbr32位的发给别人总是被360干掉可有解决办法?给小白解释没有病毒和风险太累了,所以我更喜欢VC编译的小程序。我曾经在360病毒误报网站反馈,结果客服回复还是不给过,说是有风险,好郁闷,这世道就是流氓当道!
作者: liuzhaoyzz 时间: 2020-11-20 06:51
本帖最后由 liuzhaoyzz 于 2020-11-20 11:26 编辑
2020.11.20版本,似乎360不报了。感谢5大!顺便说下,2020.11.20版本,32位的加壳报毒,不加壳的原始文件不报毒(编辑)。
作者: liuzhaoyzz 时间: 2020-11-20 08:16
我尝试用vs2015编译这个程序,想请问下大神,这一句出错了,应该怎么修改?
char buf[] = "?:\";
提示没有右引号。
作者: CodeHz 时间: 2020-11-20 11:08
hmmm,多加一个\
char buf[] = "?:\\"
作者: liuzhaoyzz 时间: 2020-11-20 13:35
我用visual studio2015静态编译了下,平台工具集选择v140_xp模式,亲测支持XP WIN10。通过了360流氓卫士的检测。看样子VC编译的程序,360识别的好呀!不会误报。
上传源代码和编译后的exe程序。
-
VXP-2020-11-20-13-29-29.png
(25.5 KB, 下载次数: 90)
-
-
drivetype.rar
1.01 MB, 下载次数: 24, 下载积分: 无忧币 -2
-
-
判断磁盘类型.rar
102.47 KB, 下载次数: 21, 下载积分: 无忧币 -2
欢迎光临 无忧启动论坛 (http://wuyou.net./) |
Powered by Discuz! X3.3 |