Movatterモバイル変換


[0]ホーム

URL:


Skip to main content

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit focus mode

Processing a Request to Remove a Device

  • 2021-01-06
Feedback

In this article

An application receives aDBT_DEVICEQUERYREMOVE device event when a feature in the system has decided to remove a specified device. When the application receives this event, it should determine whether it is using the specified device and either cancel or prepare for the removal.

In the following example, an application maintains an open handle, hFile, to the file or device represented by FileName. The application registers for device event notification on the underlying device by calling theRegisterDeviceNotification function, using aDBT_DEVTYP_HANDLE type notification filter and specifying the hFile variable in thedbch_handle member of the filter.

The application processes theDBT_DEVICEQUERYREMOVE device event by closing the open file handle to the device that is to be removed. In the event that removal of this device is canceled, the application processes theDBT_DEVICEQUERYREMOVEFAILED device event to reopen the handle to the device. After the device has been removed from the system, the application processes theDBT_DEVICEREMOVECOMPLETE andDBT_DEVICEREMOVEPENDING device events by unregistering its notification handle for the device and closing any handles that are still open to the device.

#include <windows.h>#include <dbt.h>#include <strsafe.h>  // ...INT_PTR WINAPI WinProcCallback( HWND hWnd,                                UINT message,                                WPARAM wParam,                                LPARAM lParam ){  LPCTSTR FileName = NULL;              // path to the file or device of interest  HANDLE  hFile = INVALID_HANDLE_VALUE; // handle to the file or device  PDEV_BROADCAST_HDR    pDBHdr;  PDEV_BROADCAST_HANDLE pDBHandle;  TCHAR szMsg[80];  switch (message)  {  //...  case WM_DEVICECHANGE:    switch (wParam)    {      case DBT_DEVICEQUERYREMOVE:        pDBHdr = (PDEV_BROADCAST_HDR) lParam;        switch (pDBHdr->dbch_devicetype)        {          case DBT_DEVTYP_HANDLE:            // A request has been made to remove the device;            // close any open handles to the file or device            pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;            if (hFile != INVALID_HANDLE_VALUE)             {              CloseHandle(hFile);              hFile = INVALID_HANDLE_VALUE;            }        }        return TRUE;      case DBT_DEVICEQUERYREMOVEFAILED:        pDBHdr = (PDEV_BROADCAST_HDR) lParam;        switch (pDBHdr->dbch_devicetype)        {          case DBT_DEVTYP_HANDLE:            // Removal of the device has failed;            // reopen a handle to the file or device            pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;            hFile = CreateFile(FileName,                       GENERIC_READ,                       FILE_SHARE_READ,                       NULL,                       OPEN_EXISTING,                       FILE_ATTRIBUTE_NORMAL,                       NULL);            if (hFile == INVALID_HANDLE_VALUE)             {              StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),                                TEXT("CreateFile failed: %lx.\n"),                                GetLastError());              MessageBox(hWnd, szMsg, TEXT("CreateFile"), MB_OK);            }        }        return TRUE;      case DBT_DEVICEREMOVEPENDING:        pDBHdr = (PDEV_BROADCAST_HDR) lParam;        switch (pDBHdr->dbch_devicetype)        {          case DBT_DEVTYP_HANDLE:                      // The device is being removed;            // close any open handles to the file or device            if (hFile != INVALID_HANDLE_VALUE)             {              CloseHandle(hFile);              hFile = INVALID_HANDLE_VALUE;            }        }        return TRUE;      case DBT_DEVICEREMOVECOMPLETE:        pDBHdr = (PDEV_BROADCAST_HDR) lParam;        switch (pDBHdr->dbch_devicetype)        {          case DBT_DEVTYP_HANDLE:            pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;            // The device has been removed from the system;            // unregister its notification handle            UnregisterDeviceNotification(              pDBHandle->dbch_hdevnotify);                          // The device has been removed;            // close any remaining open handles to the file or device            if (hFile != INVALID_HANDLE_VALUE)             {              CloseHandle(hFile);              hFile = INVALID_HANDLE_VALUE;            }        }        return TRUE;      default:        return TRUE;    }  }  default:    return TRUE;}

Related topics

Device Event Types

 

 


Feedback

Was this page helpful?

YesNo

In this article

Was this page helpful?

YesNo