gpt4 book ai didi

c++ - 使用 IOCTL_CHANGER_GET_PRODUCT_DATA 调用 DeviceIoControl 时出现 ERROR_ACCESS_DENIED

转载 作者:可可西里 更新时间:2023-11-01 11:47:21 29 4
gpt4 key购买 nike

我的任务是获取安装为磁盘的设备的 VendorId 和 ProductId。代码看起来像这样:

int main() {
HANDLE hDevice;
char cDisk = 'c'; // Get metadata about the C:\ disk

// Build the logical drive path and get the drive device handle
std::wstring logicalDrive = L"\\\\.\\";
wchar_t drive[3];
drive[0] = cDisk;
drive[1] = L':';
drive[2] = L'\0';
logicalDrive.append(drive);

hDevice = CreateFile(
logicalDrive.c_str(),
FILE_READ_ATTRIBUTES,
0,
NULL,
OPEN_EXISTING,
0,
NULL);

_tprintf(_T("%s\n"), logicalDrive.c_str());

if (hDevice == INVALID_HANDLE_VALUE)
{
std::cerr << "CreateFile error #" << GetLastError() << std::endl;
system("pause");
return -1;
}

// Now that we have the device handle for the disk, let us get disk's metadata

CHANGER_PRODUCT_DATA dg = { 0 };
DWORD ioctlJnk;

if (!DeviceIoControl(hDevice,
IOCTL_CHANGER_GET_PRODUCT_DATA,
NULL,
0,
&dg,
sizeof(dg),
&ioctlJnk,
NULL)
)
{
std::cerr << "DeviceIoControl error #" << GetLastError() << std::endl;
CloseHandle(hDevice);
system("pause");
return -1;
}

// Success, now print the device manufacturer's name
std::cout << dg.VendorId << std::endl;
CloseHandle(hDevice);
}

问题在于 DeviceIoControl 函数失败并且 GetLastError 返回 ERROR_ACCESS_DENIED。它发生在任何磁盘上。

我该怎么做才能使这段代码正常工作?还有其他想法如何通过挂载设备的字符获取 VID 和 PID 吗?

提前致谢!

最佳答案

您可能需要以足够的访问权限和/或足够的权限打开设备才能使用该 I/O 控制功能,但您的根本问题是您在错误类型的设备上使用它。 IOCTL_CHANGER_* 函数仅适用于转换器设备,这些设备的文件名格式为 \\.\Changer#。来自CreateFile MSDN 上的文档:

Changer Device

The IOCTL_CHANGER_* control codes for DeviceIoControl accept a handle to a changer device. To open a changer device, use a file name of the following form: "\\.\Changerx" where x is a number that indicates which device to open, starting with zero. To open changer device zero in an application that is written in C or C++, use the following file name: "\\\\.\\Changer0".

请注意,您不是第一个犯此错误的人。 Juan Pablo reported on the MinGW mailing list使用类似的代码得到相同的错误。 Luke Dunstan 指出,在该线程中修复代码以使用 GENERIC_READ 会将失败更改为 ERROR_INVALID_FUNCTION。

最后,我还注意到您使用的文件名 \\.\C: 不是物理磁盘的名称。它是物理磁盘上卷的名称。一个物理磁盘上可以有多个卷,一个卷可以跨越多个物理磁盘。

关于c++ - 使用 IOCTL_CHANGER_GET_PRODUCT_DATA 调用 DeviceIoControl 时出现 ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41795210/

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