gpt4 book ai didi

winapi - 如何从 Windows 7 中的驱动器号中获取可移动设备的物理驱动器号?

转载 作者:行者123 更新时间:2023-12-05 00:04:38 25 4
gpt4 key购买 nike

我正在尝试从 Windows 7 上的 CDROM 驱动器的驱动器号中查找物理驱动器号(例如,我需要 N 中的 \\.\PhysicalDriveN 才能打开块设备进行读取)。This page表示 IOCTL_STORAGE_GET_DEVICE_NUMBER 应该可以工作,但它为 C: 和 D: 的驱动器号返回 0(其中 D: 是可移动驱动器),所以这不可能是正确的。还建议使用 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,但由于 D: 上的 ERROR_INVALID_FUNCTION 而失败。

我不禁觉得我在某处错过了一个关键概念。

这是我的代码:

#include "stdafx.h"
#include "Windows.h"


void printLastError(){
DWORD lastError;
DWORD bytesReturned;
WCHAR outbuf[2048];

lastError = GetLastError();

bytesReturned = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, lastError, LANG_USER_DEFAULT, outbuf, 2048, NULL);

if (bytesReturned > 0){
wprintf(outbuf);
} else {
printf("Error %d while formatting error %d\n", GetLastError(), lastError);
}
}

void readDeviceNumberByExtents(HANDLE hFile){
BOOL ioctlSuccess;
DWORD bytesReturned;

VOLUME_DISK_EXTENTS vde;

ioctlSuccess = DeviceIoControl(hFile,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL);

if (ioctlSuccess != 0){
printf("%d\n", vde.Extents->DiskNumber );
} else {
printLastError();
}
}

void readDeviceNumberByStorage(HANDLE hFile){
BOOL ioctlSuccess;
DWORD bytesReturned;

STORAGE_DEVICE_NUMBER sdn;

ioctlSuccess = DeviceIoControl(hFile,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &sdn, sizeof(sdn), &bytesReturned, NULL);

if (ioctlSuccess != 0){
printf("%d\n", sdn.DeviceNumber );
} else {
printLastError();
}
}

void runTest(WCHAR* driveName){
HANDLE driveHandle;
DWORD diskNumber;

driveHandle = CreateFile(driveName,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (driveHandle != INVALID_HANDLE_VALUE){
wprintf(L"Opened %s\n", driveName);

printf("Device number by extents: ");
readDeviceNumberByExtents(driveHandle);
printf("Device number by storage: ");
readDeviceNumberByStorage(driveHandle);

CloseHandle(driveHandle);
} else {
printf("Failure!\n");
}
}

int _tmain(int argc, _TCHAR* argv[])
{
runTest(L"\\\\.\\C:");
printf("\n");
runTest(L"\\\\.\\D:");

getc(stdin);
return 0;
}

...以及我运行它时的输出,无论是否以管理员身份运行:
Opened \\.\C:
Device number by extents: 0
Device number by storage: 0

Opened \\.\D:
Device number by extents: Incorrect function.
Device number by storage: 0

最佳答案

"\\.\PhysicalDriveN"仅适用于(类似的东西)硬盘驱动器,不适用于可移动磁盘。如果某些东西类似于可移动磁盘(或软盘、CD-ROM 等),"\\.\X:"打开原始驱动器(其他驱动器不支持分区,因此 "\\.\x:""\\.\PhysicalDiskN" 之间的区别对它们不存在)。您通常希望使用 GetDriveType找出您拥有哪种类型的磁盘,并且仅当它表明它是 DRIVE_FIXED 时您是否尝试查找驱动器号并使用 "\\.\PhysicalDriveN"用它。

关于winapi - 如何从 Windows 7 中的驱动器号中获取可移动设备的物理驱动器号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5501749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com