如何在Windows服务程序中添加U盘插拔的消息
研究了下这个问题,主要要在一般的windows服务程序中修改两个地方:
一、调用RegisterServiceCtrlHandlerEx
VOID WINAPI SvcMain( DWORD dwArgc, LPTSTR *lpszArgv )
{
// Register
the handler function for the service.
gSvcStatusHandle =
RegisterServiceCtrlHandlerEx(
SVCNAME,
SvcCtrlHandler,
NULL);
if( !gSvcStatusHandle )
{
printf("Failed to register service control handler");
return;
}
// These SERVICE_STATUS members remain as set
here.
gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
gSvcStatus.dwServiceSpecificExitCode = 0;
// Report initial
status to the SCM.
ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR,
3000 );
// Perform service-specific initialization and
work.
HDEVNOTIFY hDevNotify;
if(!DoRegisterDeviceInterface(GUID_DEVINTERFACE_VOLUME, &hDevNotify))
{
printf("DoRegisterDeviceInterface failed\n");
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
return;
}
SvcInit( dwArgc, lpszArgv );
UnregisterDeviceNotification(hDevNotify);
}
二、注册设备响应接口
/*
Routine Description:
Registers for notification of changes
in the device interfaces for
the specified interface class GUID.
Parameters:
InterfaceClassGuid - The interface class GUID for the
device
interfaces.
hDevNotify - Receives the device
notification handle. On failure,
this value is NULL.
Return
Value:
If the function succeeds, the return value is TRUE.
If the
function fails, the return value is FALSE.
*/
BOOL DoRegisterDeviceInterface(
GUID InterfaceClassGuid,
HDEVNOTIFY *hDevNotify
)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size =
sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype
= DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid =
InterfaceClassGuid;
*hDevNotify =
RegisterDeviceNotification(
gSvcStatusHandle,
&NotificationFilter,
DEVICE_NOTIFY_SERVICE_HANDLE
);
if(!*hDevNotify)
{
printf("RegisterDeviceNotification failed: %d\n",
GetLastError());
return FALSE;
}
return TRUE;
}
三、处理U盘插拔消息
DWORD WINAPI SvcCtrlHandler(DWORD dwCtrl, DWORD dwEventType, LPVOID
lpEventData, LPVOID lpContext)
{
// Handle the requested control code.
switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal
the service to stop.
SetEvent(ghSvcStopEvent);
return NO_ERROR;
case SERVICE_CONTROL_DEVICEEVENT:
if
(DBT_DEVICEARRIVAL == dwEventType)
{
FILE *fp;
DEV_BROADCAST_HDR * pHdr = (DEV_BROADCAST_HDR
*)lpEventData;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
PDEV_BROADCAST_HANDLE pDevHnd;
PDEV_BROADCAST_OEM
pDevOem;
PDEV_BROADCAST_PORT pDevPort;
PDEV_BROADCAST_VOLUME pDevVolume;
switch(
pHdr->dbch_devicetype )
{
case
DBT_DEVTYP_DEVICEINTERFACE:
pDevInf =
(PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
fp =
fopen("C:\\log.txt", "a+");
if (fp)
{
_ftprintf(fp, _T("%s\n"),
pDevInf->dbcc_name);
fclose(fp);
}
break;
case DBT_DEVTYP_HANDLE:
pDevHnd = (PDEV_BROADCAST_HANDLE)pHdr;
break;
case DBT_DEVTYP_OEM:
pDevOem =
(PDEV_BROADCAST_OEM)pHdr;
break;
case
DBT_DEVTYP_PORT:
pDevPort = (PDEV_BROADCAST_PORT)pHdr;
break;
case DBT_DEVTYP_VOLUME:
pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
break;
}
}
break;
case
SERVICE_CONTROL_INTERROGATE:
// Fall through to send current
status.
break;
default:
break;
}
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
return NO_ERROR;
}
如何在Windows服务程序中添加U盘插拔的消息的更多相关文章
- 如何在Windows服务程序中读写HKEY_CURRENT_USER注册表
在服务程序中想要对注册表HKEY_CURRENT_USER下的内容进行读写,不会返回失败,但是始终无效.原因是: 1.服务运行在系统权限之下,而不是任何一个用户 2.HKEY_CURRENT_USER ...
- 如何在windows“我的电脑”中添加快捷文件夹
如图所示,windows中打开“我的电脑”时,原来有6个默认的文件夹,访问非常便捷,自己想再增加,可以使用“ThisPCTweaker”即可完成 操作如下图,不多解释,简单操作: 文件下载:http: ...
- 如何在 Windows 10 中搭建 Node.js 环境?
[编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...
- 如何在VUE项目中添加ESLint
如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...
- 如何在Android Studio中添加注释模板信息?
如何在Android Studio中添加注释模板信息? 在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android ...
- 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本
最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...
- 文章翻译:ABP如何在EF core中添加数据过滤器
原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...
- 在Windows服务中添加定时器
创建windows服务: 在VisualStudio中用C#创建一个Windows服务,微软MSDN参考地址: http://msdn.microsoft.com/zh-cn/library/zt39 ...
- 如何在windows 11中安装WSLG(WSL2)
什么是 WSL WSL(Windows Subsystem for Linux):Windows 系统中的一个子系统,在这个子系统上可以运行 Linux 操作系统. 可以让开发人员直接在 Window ...
随机推荐
- usb_control_msg函数用法和说明
usb_control_msg是没有用到urb的在USB中简单进行发送和接收的一种机制,用于少量的数据通信.原型为: 程序代码 linux+v2.6.35/drivers/usb/core/mess ...
- 基于Consul的数据库高可用架构【转】
几个月没有更新博客了,已经长草了,特意来除草.本次主要分享如何利用consul来实现redis以及mysql的高可用.以前的公司mysql是单机单实例,高可用MHA加vip就能搞定,新公司mysql是 ...
- springcloud常见问题处理
无法在任何已知服务器上执行请求. 原因是注册中心未启动.在使用springcloud搭建微服务时,一定要先启动注册中心,再启动服务端和客户端.具体报错如下: com.netflix.discovery ...
- 二十三、springboot之session共享
通过redis实现session共享 SpringBoot集成springsession 1.引入依赖(gradle方式) dependencies { compile('org.springfram ...
- 测试开发之前端——No2.HTML5中的标签
HTML5中的标签. 标签 描述 <!--...--> 定义注释. <!DOCTYPE> 定义文档类型. <a> 定义超链接. <abbr> 定义缩写 ...
- 阿里云url解析,发布web后去除url中的端口号
归根结底就是80端口的使用,不是http的80 的 或 https的 都得加端口号 [问题描述] http://wisecores.wisers.com:8080/JsonProject/servl ...
- Connect to DB2 database in eclipse via jdbc
https://stackoverflow.com/questions/23801841/connect-to-db2-database-in-eclipse-via-jdbc
- intellj idea show "run dashboard" panel
workspace.xml edit this point <component name="RunDashboard"> <option name=" ...
- word2013 如何设置从第三页开始编码 或 如何设置封面页和正文页页码不连续
首先说明一下 “分节符”作用,它就是用来将整个文档分节的,添加一个分节符,文档就分成1.2两节:添加两个分节符,文档就分成1.2.3节. 当前页面具体是第几节,可以通过点击页眉页脚来查看: 从第三页开 ...
- JAVA-Socket通信 打造属于自己的聊天室(服务端)
我们每天都在使用着微信.QQ等聊天软件,但不知你是否有想过这些聊天软件是如何实现的?是否想过要制作一个属于自己的聊天室? 本篇博客将带你打造一个简单的属于自己的聊天室,将cmd作为聊天窗口,可通过内网 ...