CM_Request_Device_Eject fails with PNP_VetoIllegalDeviceRequ



我尝试了下面的代码。当设备名称包含"San"时,它要求弹出,因为我插入了SanDisk USB驱动器。然而它失败了,原因似乎是PNP_VetoIllegalDeviceRequest。我查了一下原因,这一页说是

设备不支持指定的操作。

但是我可以使用Windows的菜单手动弹出SanDisk,所以这个理由看起来很荒谬。我叫正常工作了吗?在呼叫CM_Request_Device_Eject之前,我是否需要呼叫其他电话?

输出为

....
SanDisk Ultra USB Device
Removing Sandisk
rejected.
type:8
name:USBSTORDisk&Ven_SanDisk&Prod_Ultra&Rev_1.00....

代码为(Devinst的值为3)

if (wcsstr(buffer, L"San") != 0)
{
wcout << "Removing Sandisk" << endl;
PNP_VETO_TYPE vType;
WCHAR vName[MAX_PATH];
result = CM_Request_Device_Eject(Devinst, &vType, vName, MAX_PATH, NULL);
if (result == CR_SUCCESS)
{
cout << "ejected" << endl;
}
else
{
wcout << "rejected." << endl;
wcout << "type:"<< vType << endl;
wcout << "name:" << vName << endl;
}
}

在网上搜索后,我找到了这个页面:https://www.winvistatips.com/threads/removal-of-usb-disk.179677/

提问者有完全相同的错误,并且有一个回复说他需要将该函数调用到父节点,而不是u盘节点。所以,我像下面这样修改代码,它工作了。

DEVINST parent;
CM_Get_Parent(&parent, Devinst, NULL);
PNP_VETO_TYPE vType;
WCHAR vName[MAX_PATH];
result = CM_Request_Device_Eject(parent, &vType, vName, MAX_PATH, NULL);

最新更新