怎样判断不同的盘符是否对应相同的物理驱动器? 在NT中,如果没有管理员权限,应如何编程才能准确判断出两个不同的盘符是否对应于相同的物理驱动器? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先CreateFile打开分区,注意没有管理员权限应该用只读方式打开,然后使用DeviceIoControl,使用的控制码是IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,得到一个VOLUME_DISK_EXTENTS结构的数据类型,该结构中有一个DISK_EXTENT Extents结构的东西,在这个结构里有一个 DWORD DiskNumber,它表明了该分区是哪个硬盘,0表示PhysicalDrive0,类推。 感谢idAnts的答复!我有些不明白的地方:1. 我所指的盘符(如:C:\dir1 和 D:\dir2 中的 C: 和 D:)如何对应到你所指的分区?2. 你所指的打开分区是用 CreateFile("\\.\C:", ...) 吗?如果是的话,MSDN中说:"The caller must have administrative privileges.",并且没有提到有方法可以不用管理员权限。3. 你所指的只读方式是 GENERIC_READ 吗?如果是的话,MSDN中没有说明它与管理员权限之间存在的关系。请你详加指点! 我试了下,不是管理员确实不行,但是你可以把它放在服务程序来实现就可以了。代码如下,打开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!"); 我的程序是一个只有30K左右的命令行程序,请问idAnts还有没有其它方法可以实现此功能呢? 改变程序两个模块的执行顺序引起的问题,求前辈指点 求助:不规则登录窗口 CDC::BitBlt中Bit和Blt是什么意思? 如何融合多个project成为一个solution? 散分 1 请问一个vc的消息传递问题 Help!Help!就剩下3个小时交差了了,关于打印方面 如何获取一个已知程序的某一个控件的内容,请教高手指点!谢谢!!! 如何实现程序中的两个视之间的交互。(可能很简单的问题) 如何让为图填满对话的所有控件,guostong(笨驴)在吗? 也给我发一份原码。 如何修改对话框形式的应用程序颜色(再现等待) 简单小问题,请您帮忙,函数Arc()说明
代码如下,打开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!");