FAQ: 如何列出系统中安装的光盘驱动器(包括未分配盘符的光驱)及其接口类型

xstring 2004-04-17 09:42:45
问:如何列出系统中安装的光盘驱动器(包括未分配盘符的光驱)及其接口类型
答:
以下方法是通过注册表来得到的。在cdrom这个kernel service的注册表项下有相关内容。代码如下:


/*
* enum-cdrom.c - 列出系统中的光盘驱动器
*
* 作者: xstring@csdn
* 日期: 2004.04.16
*
* 说明:
* 使用GetLogicalDrives也可以列出系统中的光驱, 但无法知道其接口
* 性质; 而且无法列出没有分配盘符的光驱。
* 如果你要得到每个光驱的更多硬件信息, 请自己查看程序中所涉及到
* 的注册表位置。
*/

#define _WIN32_WINNT 0x400
#define STRICT

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h>

#pragma comment (lib, "advapi32.lib")
#pragma comment (lib, "user32.lib")

void print_msg (LPCTSTR api, DWORD error)
{
LPTSTR str = NULL;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, 0, (LPTSTR)&str, 0, 0);
_tprintf (TEXT ("%s 调用失败,错误代码: %u\n %s\n"),
api, error, str);
LocalFree (str);
};

#define CHECK_ERROR(apiname) \
if (error != ERROR_SUCCESS) \
{ \
api = TEXT (apiname); \
goto failed; \
}


int main (void)
{
HKEY keyServ = NULL;
HKEY keyEnum = NULL;
HKEY key = NULL;
DWORD error = 0;
LPCTSTR api = NULL;
DWORD type, count, size, i;

setlocale (LC_ALL, ".ACP");

error = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
TEXT ("SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum"),
0, KEY_READ, &keyServ);

CHECK_ERROR ("RegOpenKeyEx");

error = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
TEXT ("SYSTEM\\CurrentControlSet\\Enum"),
0, KEY_READ, &keyEnum);

CHECK_ERROR ("RegOpenKeyEx");

size = sizeof (count);
error = RegQueryValueEx (keyServ, TEXT ("Count"),
0, &type, (LPBYTE)&count, &size);

CHECK_ERROR ("RegQueryValueEx");

_tprintf (TEXT ("您的系统上共有 %u 个光盘驱动器: \n\n"), count);

for (i=0;i<count;++i)
{
TCHAR sz [0x200];
TCHAR name [0x40];
static TCHAR dtname [] [16] =
{ TEXT ("USB"), TEXT("IDE"), TEXT ("SCSI"), TEXT ("Unknown") };
int dt;

wsprintf (name, TEXT ("%d"), i);
size = sizeof (sz);
error = RegQueryValueEx (keyServ, name,
0, &type, (LPBYTE)sz, &size);

CHECK_ERROR ("RegQueryValueEx");

error = RegOpenKeyEx (keyEnum, sz,
0, KEY_READ, &key);

CHECK_ERROR ("RegOpenKeyEx");

for (dt=0;dt<3;++dt)
{
if (_tcsncmp (sz, dtname [dt], _tcslen(dtname [dt])) == 0)
break;
}

size = sizeof (sz);
error = RegQueryValueEx (key, TEXT ("FriendlyName"),
0, &type, (LPBYTE)sz, &size);

CHECK_ERROR ("RegQueryValueEx");

_tprintf (TEXT (" CDROM %d - %s [%s]\n"),
i, sz, dtname [dt]);
RegCloseKey (key);
key = NULL;
};

RegCloseKey (keyEnum);
RegCloseKey (keyServ);
return 0;

failed:
if (keyServ)
RegCloseKey (keyServ);
if (keyEnum)
RegCloseKey (keyEnum);
if (key)
RegCloseKey (key);
print_msg (api, error);
return error;
};

在我的系统上运行结果如下:

您的系统上共有 5 个光盘驱动器:

CDROM 0 - DVD-ROM [IDE]
CDROM 1 - Generic STEALTH DVD SCSI CdRom Device [SCSI]
CDROM 2 - Generic STEALTH DVD SCSI CdRom Device [SCSI]
CDROM 3 - Generic STEALTH DVD SCSI CdRom Device [SCSI]
CDROM 4 - Generic STEALTH DVD SCSI CdRom Device [SCSI]
...全文
204 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
taianmonkey 2004-04-17
  • 打赏
  • 举报
回复
我知道了,我是通过软件把注册表锁了!
开了后,试试准确!
Sorry!
:-)
xstring 2004-04-17
  • 打赏
  • 举报
回复
我就是在xp上运行的。

哪儿不准确?
taianmonkey 2004-04-17
  • 打赏
  • 举报
回复
在XP上不准确!
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧