WinAPI调用访问没有驱动器号的USB存储?

aka*_*vel 7 windows winapi usb-drive wpd

我注意到,有些USB存储设备没有在Windows中注册为常规驱动器,因为它们甚至没有分配驱动器号.因此,我无法使用标准文件操作C API显然访问它们.

我可以使用什么WinAPI调用在这些奇怪的设备上执行一些正常的文件操作 - 所以:

  • 查找/枚举这些设备,
  • 浏览设备上的文件/目录树并获取一些文件统计信息(大小,修改日期等),
  • 读/写文件内容,
  • 创建/删除文件/目录?

此外,已知/调用这些类型的设备/协议的一般关键字是什么?

zak*_*ter 5

如果你在谈论移动设备出现像安装卷,但没有任何安装点,以及他们被称为Windows便携设备他们没有安装卷

Windows 不直接访问文件系统,它仅通过媒体传输协议( MTP ) 或图片传输协议( PTP )与它们通信,并创建外壳命名空间扩展以向用户呈现虚拟文件夹。

如果您想与这些类型的设备进行通信,那么您很可能想使用WPD API


zak*_*ter 0

如果您谈论的是没有分配任何驱动器号的USB 大容量存储设备,那么它只是一个没有挂载点的卷。您需要在读取/写入之前安装该卷。

您可以使用卷管理功能

下面是一个用 C语言快速编写的示例,其中列出了所有现有卷、安装未安装的卷并显示有关每个卷的一些信息:

char volumeID[256], volumePathName[256], volumeName[256], volumeFS[256];
char newMountPoint[4] = " :\\";
unsigned long volumeSerialNumber;
unsigned long size;
HANDLE handle = FindFirstVolume(volumeID, 256);
do {
    printf("Volume GUID = %s\n", volumeID);
    GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
    if(strlen(volumePathName) == 0) {
        printf("Not mounted\n");
        newMountPoint[0] = firstFreeLetter();
        if(SetVolumeMountPoint(newMountPoint, volumeID)) {
            GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
            printf("Now mounted on %s\n", volumePathName);
        }
    }
    else {
        printf("Mounted on %s\n", volumePathName);
    }
    GetVolumeInformation(volumePathName, volumeName, 256, &volumeSerialNumber,
                         NULL, NULL, volumeFS, 256);
    printf("Volume name = %s, FS = %s, serial = %lu\n\n",
           volumeName, volumeFS, volumeSerialNumber);

}while(FindNextVolume(handle, volumeID, 256));

FindVolumeClose(handle);
Run Code Online (Sandbox Code Playgroud)

我特意简化了这个例子,但是一个卷可以有多个挂载点(volumePathName实际上是一个多字符串)。它使用此函数获取第一个可用字母(之后'C')来安装驱动器:

char firstFreeLetter() {
    unsigned long freeLetters = GetLogicalDrives();
    if(freeLetters < 4) return 0;
    char letter = 'C';
    for(unsigned long i=4; (freeLetters & i) != 0; ++letter, i <<= 1);
    return letter;
}
Run Code Online (Sandbox Code Playgroud)