2016-01-08 42 views
0

我目前正在使用Windows服務來檢測USB設備何時插入。 USB連接時,我會成功收到通知。但是現在我似乎無法從單位掩碼中獲取驅動器號。我認爲是由於面具不正確。獲取UnitMask的驅動器盤符

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這似乎不正確。任何人都可以看到我是否做了任何錯誤的方式,我這樣做。

回答

0

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 
}