[英]Get Drive Letter from UnitMask
我目前正在使用Windows服務來檢測何時插入USB設備。 插入USB時,我會成功收到通知。 但是現在我似乎無法從單元掩碼中獲得驅動器號。 我認為是由於口罩不正確。
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;
HDEVNOTIFY hDeviceNotify = RegisterDeviceNotification(
handle, // events recipient
¬ificationFilter, // type of device
DEVICE_NOTIFY_SERVICE_HANDLE // type of recipient handle
);
PDEV_BROADCAST_DEVICEINTERFACE deviceInterface = static_cast<PDEV_BROADCAST_DEVICEINTERFACE>(lpEventData);
switch (dwEventType)
{
case DBT_DEVICEARRIVAL:
if (deviceInterface->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
if (::IsEqualGUID(deviceInterface->dbcc_classguid, GUID_DEVINTERFACE_VOLUME))
{
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)deviceInterface;
// Here is where i would process the unitmask
}
}
因此,我上面的代碼應該在pVol變量中具有單位掩碼。 但是我收到的掩碼是1408590605,這似乎不正確。 誰能看出我的操作方式是否有錯。
1408590605
不正確,但只有您可以肯定知道。 您可以使用此功能對其進行測試:
char FirstDriveFromMask(ULONG unitmask)
{
for (char i = 0; i < 26; ++i, unitmask >>= 1)
if (unitmask & 0x1)
return i + 'A';
return 0;
}
char c = FirstDriveFromMask(1408590605); //result = 'A'
您的窗口過程應如下所示:
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HDEVNOTIFY hDeviceNotify = 0;
if (msg == WM_CREATE)
{
DEV_BROADCAST_DEVICEINTERFACE filter = { sizeof(DEV_BROADCAST_DEVICEINTERFACE) };
filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
filter.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;
hDeviceNotify = RegisterDeviceNotification(hWnd, &filter,
DEVICE_NOTIFY_WINDOW_HANDLE);
return 0;
}
if (msg == WM_DEVICECHANGE && wParam == DBT_DEVICEARRIVAL)
{
OutputDebugString(L"DBT_DEVICEARRIVAL\n");
PDEV_BROADCAST_HDR header = (PDEV_BROADCAST_HDR)lParam;
if (header && (header->dbch_devicetype == DBT_DEVTYP_VOLUME))
{
PDEV_BROADCAST_VOLUME volume = (PDEV_BROADCAST_VOLUME)lParam;
if (volume)
{
wchar_t buf[100];
swprintf_s(buf, 100, L"drive %d %c: ", volume->dbcv_unitmask,
FirstDriveFromMask(volume->dbcv_unitmask));
OutputDebugString(buf);
}
}
}
//... UnregisterDeviceNotification
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.