怎样判断不同的盘符是否对应相同的物理驱动器?

xaybzc 2005-05-19 12:53:02
在NT中,如果没有管理员权限,应如何编程才能准确判断出两个不同的盘符是否对应于相同的物理驱动器?
...全文
208 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xaybzc 2005-05-20
  • 打赏
  • 举报
回复
感谢idAnts的答复!

我有些不明白的地方:

1. 我所指的盘符(如:C:\dir1 和 D:\dir2 中的 C: 和 D:)如何对应到你所指的分区?

2. 你所指的打开分区是用 CreateFile("\\.\C:", ...) 吗?如果是的话,MSDN中说:"The caller must have administrative privileges.",并且没有提到有方法可以不用管理员权限。

3. 你所指的只读方式是 GENERIC_READ 吗?如果是的话,MSDN中没有说明它与管理员权限之间存在的关系。

请你详加指点!
xaybzc 2005-05-20
  • 打赏
  • 举报
回复
我的程序是一个只有30K左右的命令行程序,请问idAnts还有没有其它方法可以实现此功能呢?
idAnts 2005-05-20
  • 打赏
  • 举报
回复
我试了下,不是管理员确实不行,但是你可以把它放在服务程序来实现就可以了。
代码如下,打开c盘的,在win2k+vc6里写的,因为一些数据结构在vc6的头文件里没定义,所以自己定义。

#include "Winioctl.h""
typedef struct _DISK_EXTENT { DWORD DiskNumber; LARGE_INTEGER StartingOffset; LARGE_INTEGER ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;

typedef struct _VOLUME_DISK_EXTENTS { DWORD NumberOfDiskExtents; DISK_EXTENT Extents[1];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;

#define IOCTL_VOLUME_BASE ((DWORD) 'V')

#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)


HANDLE hFile = CreateFile("\\\\.\\C:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox("Open error!");
return;
}
VOLUME_DISK_EXTENTS vde;
DWORD readed;
BOOL ret = DeviceIoControl(hFile,IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,NULL,0,
&vde,
sizeof(VOLUME_DISK_EXTENTS),&readed,NULL);
CloseHandle(hFile);
if(!ret)
{
MessageBox("DeviceIoControl error!");
return;
}
MessageBox("OK!");
idAnts 2005-05-20
  • 打赏
  • 举报
回复
这个……要不就单独写个服务,然后你的程序向服务查询,如何?
idAnts 2005-05-19
  • 打赏
  • 举报
回复
首先CreateFile打开分区,注意没有管理员权限应该用只读方式打开,然后使用DeviceIoControl,使用的控制码是IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,得到一个VOLUME_DISK_EXTENTS结构的数据类型,该结构中有一个DISK_EXTENT Extents结构的东西,在这个结构里有一个 DWORD DiskNumber,它表明了该分区是哪个硬盘,0表示PhysicalDrive0,类推。

2,643

社区成员

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

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