在NT中,如果没有管理员权限,应如何编程才能准确判断出两个不同的盘符是否对应于相同的物理驱动器?

解决方案 »

  1.   

    首先CreateFile打开分区,注意没有管理员权限应该用只读方式打开,然后使用DeviceIoControl,使用的控制码是IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,得到一个VOLUME_DISK_EXTENTS结构的数据类型,该结构中有一个DISK_EXTENT Extents结构的东西,在这个结构里有一个 DWORD DiskNumber,它表明了该分区是哪个硬盘,0表示PhysicalDrive0,类推。
      

  2.   

    感谢idAnts的答复!我有些不明白的地方:1. 我所指的盘符(如:C:\dir1 和 D:\dir2 中的 C: 和 D:)如何对应到你所指的分区?2. 你所指的打开分区是用 CreateFile("\\.\C:", ...) 吗?如果是的话,MSDN中说:"The caller must have administrative privileges.",并且没有提到有方法可以不用管理员权限。3. 你所指的只读方式是 GENERIC_READ 吗?如果是的话,MSDN中没有说明它与管理员权限之间存在的关系。请你详加指点!
      

  3.   

    我试了下,不是管理员确实不行,但是你可以把它放在服务程序来实现就可以了。
    代码如下,打开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!");
      

  4.   

    我的程序是一个只有30K左右的命令行程序,请问idAnts还有没有其它方法可以实现此功能呢?