This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can trysigning in orchanging directories.
Access to this page requires authorization. You can trychanging directories.
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;}
Was this page helpful?
Was this page helpful?