/*
* 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;
};
* 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;
};