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

  /*  
    *     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;  
          };  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值