ningxk
驱动牛犊
驱动牛犊
  • 注册日期2003-06-05
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1665回复:2

如何截获USB设备“无法停止通用卷设备”消息?

楼主#
更多 发布于:2008-09-23 15:35
在USB设备有文件打开的时候停止,会弹出“现在无法停止通用卷”设备,请稍候再停用”的提示? 想拦截这个通知,在哪个层次或哪个进程做好呢?
iamblizzardboy
驱动牛犊
驱动牛犊
  • 注册日期2008-12-11
  • 最后登录2008-12-18
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-12-13 00:17
#include <windows.h>
#include <dbt.h>
#include <strsafe.h>

LPCTSTR FileName;   // path to the file or device of interest
HANDLE  hFile;      // handle to the file or device

PDEV_BROADCAST_HDR pDBHdr;
PDEV_BROADCAST_HANDLE pDBHandle;
char szMsg[80];

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, 80, "CreateFile failed: %lx.\n",
                           GetLastError());
                        MessageBox(hwnd, szMsg, "CreateFile", MB_OK);
                    }
            }
            return TRUE;

        case DBT_DEVICEREMOVEPENDING:
            pDBHdr = (PDEV_BROADCAST_HDR) lParam;
            switch (pDBHdr->dbch_devicetype)
            {
                case DBT_DEVTYP_HANDLE:
                    // All queries for removal of the device were
                    // successful; device removal is pending

                    ;
            }
            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);
            }
            return TRUE;

        default:
            return TRUE;
    }
ningxk
驱动牛犊
驱动牛犊
  • 注册日期2003-06-05
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-26 16:24
如何拦截某个USB设备的“无法停止通用卷设备”消息,直接跳过而能够停止? 有大虾知道吗?
游客

返回顶部