WEB开发网
开发学院软件开发汇编语言 实战DeviceIoControl系列之一:通过API访问设备驱... 阅读

实战DeviceIoControl系列之一:通过API访问设备驱动程序

 2010-01-10 09:37:34 来源:WEB开发网   
核心提示:Q 可是,我怎么知道设备名称是什么呢?A 一些存储设备的名称是 微软规定好的,实战DeviceIoControl系列之一:通过API访问设备驱动程序(2),不可能有什么变化,大体列出如下软盘驱动器 A:, B:逻辑驱动器 C:, D:, E:, ……物理驱动器 PHYSICALDRIVExC

Q 可是,我怎么知道设备名称是什么呢?

A 一些存储设备的名称是 微软规定好的,不可能有什么变化。大体列出如下

软盘驱动器 A:, B:

逻辑驱动器 C:, D:, E:, ……

物理驱动器 PHYSICALDRIVEx

CD-ROM, DVD/ROM CDROMx

磁带机 TAPEx

其中,物理驱动器不包括软驱和光驱。逻辑驱动器可以是 IDE/SCSI/PCMCIA/USB接口的硬盘分区(卷)、光驱、MO、CF 卡等,甚至是虚拟盘。x=0,1,2 ……

其它的设备名称需通过驱动接口的 GUID 调用设备管理函数族取得,这里暂不讨论。

Q 请举一个简单的例子说明如何通过DeviceIoControl 访问设备驱动程序。

A 这里有一个从 MSDN 上摘抄来的 demo 程序,演示在 NT/2000/XP 中如何通过DeviceIoControl 获取硬盘的基本参数 。

/* The code of interest is in the subroutine GetDriveGeometry. The
code in main shows how to interpret the results of the IOCTL call. */
#include
#include BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
hDevice = CreateFile(.PhysicalDrive0, // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
CloseHandle(hDevice);
return (bResult);
}
int main(int argc, char *argv[])
{
DISK_GEOMETRY pdg; // disk drive geometry structure
BOOL bResult; // generic results flag
ULONGLONG DiskSize; // size of the drive, in bytes
bResult = GetDriveGeometry (&pdg);
if (bResult)
{
printf(Cylinders = %I64d
, pdg.Cylinders);
printf(Tracks per cylinder = %ld
, (ULONG) pdg.TracksPerCylinder); printf(Sectors per track = %ld
, (ULONG) pdg.SectorsPerTrack);
printf(Bytes per sector = %ld
, (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf(Disk size = % I64d (Bytes) = %I64d (Mb)
, DiskSize,
DiskSize / (1024 * 1024));
} 
else
{
printf (GetDriveGeometry failed. Error %ld.
, GetLastError ());
}
return ((int)bResult);
}

Q 如果将设备名换成“A:”就可以取 A 盘参数,换成“CDROM0”就可以取CDROM参数,是这样吗?

A 这个问题暂不回答你。请动手试一下看看。

现在我们总结一下通过 DeviceIoControl访问设备驱动程序 的“三步曲”:首先用 CreateFile 取得设备句柄,然后用DeviceIoControl 与设备 进行 I/O,最后别忘记用 CloseHandle 关闭设备句柄

上一页  1 2 

Tags:实战 DeviceIoControl 系列

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接