簡體   English   中英

從UnitMask獲取驅動器號

[英]Get Drive Letter from UnitMask

我目前正在使用Windows服務來檢測何時插入USB設備。 插入USB時,我會成功收到通知。 但是現在我似乎無法從單元掩碼中獲得驅動器號。 我認為是由於口罩不正確。

DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(&notificationFilter, 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
    &notificationFilter,         // 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM