如何在SYSTEM用户进程中侦听关机消息

贪食蛇男 2016-03-18 11:33:45
在一个窗口程序中,只需要响应 WM_QUERYENDSESSION WM_ENDSESSION 消息即可侦听到关机。
MSDN说了:
Console applications can use the SetConsoleCtrlHandler function to receive shutdown notification.

Service applications can use the RegisterServiceCtrlHandlerEx function to receive shutdown notifications in a handler routine.

即是服务和控制台子系统都有方法侦测关机,但是一个不是服务的“SYSTEM用户下的进程”(如在服务中 CreateProcessW 直接创建的)我没有找到方法来侦听关机,我在这种进程中创建了窗口线程,但未收到 WM_QUERYENDSESSION 消息,同一时刻的普通SESSION下的进程用同样的方式可以侦听到。
求教如何在SYSTEM用户下进程中侦听关机。
...全文
412 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪食蛇男 2016-03-21
  • 打赏
  • 举报
回复
好了,我来公布是如何解决的吧,方法比较笨,用了轮询检查 GetSystemMetrics(SM_SHUTTINGDOWN); 放码:

#include <Windows.h>
#include <gdcommon/cpplug.h>

#define CLASS_NAME                      L"GdSessionMonWnd"

static HMODULE gs_hThisModule = NULL;
static DWORD gs_dwPlugType = PT_UNKNOWN;

BOOL WINAPI DllMain(HMODULE hThisModule, DWORD dwReason, LPVOID reserved)
{
    if (DLL_PROCESS_ATTACH == dwReason)
    {
        gs_hThisModule = hThisModule;
        DisableThreadLibraryCalls(hThisModule);
    }

    return TRUE;
}

static void _BroadcastSessionEnd()
{
    static DWORD s_dwLastNotify = 0;
    if (GetTickCount() - s_dwLastNotify > 10000)    // 10秒内可能出现多个,没必要广播多次
    {
        CPPLUGLOG_WARNW(L"向插件系统广播 PMC_SESSIONEND");
        CpPlugBroadcastNotify(PMC_SESSIONEND);
    }

    s_dwLastNotify = GetTickCount();
}

static LRESULT CALLBACK _WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_QUERYENDSESSION)
    {
        _BroadcastSessionEnd();
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

static void WINAPI _MessageLoop()
{
    WNDCLASSEX wcex     = {sizeof(wcex)};
    wcex.lpszClassName  = CLASS_NAME;
    wcex.hInstance      = gs_hThisModule;
    wcex.lpfnWndProc    = _WndProc;
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hIcon          = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);

    if (RegisterClassExW(&wcex))
    {
        HWND hWindow = CreateWindowExW(
            0,
            CLASS_NAME,
            CLASS_NAME,
            WS_OVERLAPPEDWINDOW,
            0,
            0,
            0,
            0,
            NULL,
            NULL,
            gs_hThisModule,
            NULL
            );

        if (IsWindow(hWindow))
        {
            UpdateWindow(hWindow);

            MSG msg = {0};
            while (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
}

static DWORD WINAPI _SessionMonThread(void* lpParam)
{
    if (PT_PROXY == gs_dwPlugType)
    {
        _MessageLoop();
    }
    else
    {
        for ( ; ;)
        {
            if (GetSystemMetrics(SM_SHUTTINGDOWN))
            {
                _BroadcastSessionEnd();
                break;
            }

            Sleep(SEC_TOMILLISEC(1));   // 快一点,可能有电脑关机特别迅速
        }
    }

    return 0;
}

BOOL WINAPI CpPlugStart(DWORD dwPlugType)
{
    gs_dwPlugType = dwPlugType;

    CPPLUGLOG_CLOSETHREAD(_SessionMonThread, NULL, L"SESSION监测线程");

    return TRUE;
}

// 32位服务插件
void WINAPI PR_b35bdb82() {}
// 32位代理插件
void WINAPI PR_5fe0a478() {}
// 64位服务插件
void WINAPI PR_26e6dcd5() {}
// 64位代理插件
void WINAPI PR_ca5da32f() {}

贪食蛇男 2016-03-18
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
MSDN 的注释部分有说明 Console applications can use the SetConsoleCtrlHandler function to receive shutdown notification. Service applications can use the RegisterServiceCtrlHandlerEx function to receive shutdown notifications in a handler routine.
请仔细看题……RegisterServiceCtrlHandlerExW 必须在服务中,而我的问题是“普通”的进程,只是以SYSTEM身份运行,我已经试过 RegisterServiceCtrlHandlerEx 不传服务名会失败。
由于很多功能在内核完成,所以如果发生由本工具直接或者间接导致的问题,本人概不负责。 非常感谢 看雪论坛的我是土匪, 卡饭的dl123100,leisong,zxjzwy,曲求,紫瞳魔圣,tawny2008,天月来了,wo1234,FreeEquFraT 嬴政天下的橡树, 非凡论坛的gda1139等热心朋友, 提供出现蓝屏时的dump文件,帮助我找到很多问题, 希望大家如果不幸遇到蓝屏时,把dump文件发到我的邮箱(ithurricane@126.com)以便分析修改, 谢谢大家~~~ 还要特别感谢一下hi百度的uruan,特意为PowerTool做了一个非常漂亮的Logo,很喜欢这个Design,多谢了~~~ 应用平台:for WindowsXp/Windows2003/Vista/Windows7(32 bit)(我只在这四个上面测试过,其他的系统上可能会出现问题) 联系作者: Email: ithurricane@126.com QQ: 20158686 Blog: http://hi.baidu.com/ithurricane 目前版本主要功能: 1. 所有进程的枚举(包括内核隐藏的进程) 2. 所有文件的枚举(包括内核隐藏的文件) 3. 进程所有模块的枚举(包括内核隐藏的模块) 4. 进程的强制结束 5. 进程模块的强制卸载 6. 模块被哪些进程加载的检索 7. 查看文件/文件夹被占用的情况 8. 可以Unlock占用文件的进程 9. 文件/文件夹的粉碎(可强删Unlocker1.8.9/金山/超级巡警文件粉碎机无法删除的顽固文件) 10. 阻止文件粉碎后用还原软件还原(采用美国国防部DOD 5220.22-m标准阻止文件还原) 11. 用磁盘解析技术检索硬盘数据 12. 内核模块和驱动的查看和管理 13. 启动项的查看和管理 14. 系统服务的查看和管理 15. 集成文件粉碎功能到系统右键菜单 16. 消息钩子的查看和卸载 17. SSDT/Shadow SSDT钩子的查看和卸载 18. 各种内核回调的查看和卸载 19. 多国语言版本的对应(文和英文) 20. 暂停进程运行和恢复进程运行 21. 进程模块的内存的dump 22. 进程的线程的查看和结束 23. 进程的窗口的查看和控制 24. 进程的定时器的查看和摘除(该功能还没对应Windows2003) 25. 内核定时器的查看和摘除 26. 上传文件在线扫描病毒 27. 查看和摘除用户层的钩子 28. 查看和结束内核线程 29. 关机回调的清除 30. 查看和摘除mini文件驱动 31. 系统恢复功能(检测项目包括注册表关键部位,已安装的杀毒软件,AutoRun文件,Windows漏洞检测,共享文件夹) 32. 流氓快捷方式的检测和删除 33. 镜像劫持的检测和删除 34. 文件关联的检测和删除 35. IE相关的检测和删除 36. FSD Hook的检测和删除 37. Object Hook的检测和删除 38. 部分CPU/硬盘/显卡/主板的温度检测 39. 部分硬件信息的确认 40. 修复漏洞功能,可以下载和安装Windows补丁 41. IDT钩子的检测和恢复 42. 禁止进城创建,新建文件,注册表修改等配置 43. 注册表功能,几乎可以无视一切隐藏注册表的钩子 44. SPI的检测 45. 通过磁盘解析进行文件浏览 46. 文件强制拷贝功能,可拷贝网络视频的缓存文件 47. 通过磁盘解析取得和拷贝ADS流文件 48. 添加和查看文件重启删除信息 49. Disk/Atapi驱动钩子的检测和恢复 50. 进程权限的枚举和摘除 51. 检测键盘侦听软件 52. 检测被监视的文件 2010-12-05 PowerTool V3.2 增加: 1. 新增过滤驱动的检测,不仅可以显示驱动名还能显示设备名 2. 新增检测键盘侦听软件 3. 新增检测被监视的文件 4. 新增组策略关机脚本的解析(感谢天月来了和wo1234指点思路) 改善: 1. 修改了启动时大量占用内存的BUG(感谢曲求的提醒) 2. 加强了文件厂商的取得,修正文件不存在的BUG(感谢tawny2008的提醒) 3. 改进了列表的现实,当显示不下,鼠标移动到上面去就可以完整显示(感谢FreeEquFraT的意见) 2010-11-17 PowerTool V3.1.2 改善: 1. 修改了加载驱动失败后无法启动的BUG 2. 修改了无法显示某些进程的BUG 2010-11-16 PowerTool V3.1 增加: 1. 新增Disk/Atapi驱动钩子的检测和恢复 2. 新增进程权限的枚举和摘除 改善: 1. 修改了与COMODO等HIPS不兼容,导致无法启动等问题 2. 加强了防止注入的逻辑 3. 加强了进程粉碎的逻辑 4. 修改了进程路经过长无法显示的bug 2010-11-03 PowerTool V3.0 增加: 1. 新增通过磁盘解析取得和拷贝ADS流文件 2. 新增动态切换多国语言界面(考虑到文件大小,没有把EnglishDll.dll绑定到PowerTool里面去,不需要英文界面的朋友,把EnglishDll.dll删掉也没关系) 3. 新增添加和查看文件重启删除信息 改善: 1. 重要的系统文件可以在PT直接编辑保存(保存之前会先备份文件) 2. 修改了文件和注册表的跳转 3. 区别文件夹颜色,隐藏属性的是蓝色,非正常文件夹是红色 2010-10-24 PowerTool V2.9 增加: 1. 新增通过磁盘解析进行文件浏览 2. 新增文件强制拷贝功能,可拷贝网络视频的缓存文件 改善: 1. 模块列表里默认不显示微软模块 2. 加强了文件粉碎的功能,可强删SysReveal删不掉的文件 3. 加强了目录删除的功能,可删除畸形目录 2010-10-10 PowerTool V2.8 增加: 1. 新增SPI的检测 2. 新增窗口置顶,快速重启,释放内存,监视带有Auturun.inf的U盘等小功能 3. 新增进程的EAT钩子检测 改善: 1. 将启动时检测新版本改为了点击[在线升级]是下载新版本 2. 修正了文件和注册表跳转的BUG 3. 修正了安全模式下无法加载驱动的BUG 4. 修正了XP下畸形目录无法浏览的BUG 5. 修正了一键修复时报错的BUG 2010-09-26 PowerTool V2.7 增加: 1. 新增注册表功能,几乎可以无视一切隐藏注册表的钩子 2. 新增重要文件夹的快速跳转功能 3. 可备份windows服务和启动项 4. 新增自动检测新版本并且下载 改善: 1. 修正了禁止进程创建,注册表修改等配置的BUG 2. 修正了文件粉粹里无法浏览System Volume Information目录的BUG 3. 修正了Windows服务里菜单状态的BUG 4. 修正了无法上传到filterbit的BUG 2010-08-22 PowerTool V2.6 增加: 1. 新增修复漏洞功能,可以下载和安装Windows补丁 2. 新增IDT钩子的检测和恢复 3. 新增禁止进城创建,新建文件,注册表修改等配置 改善: 1. 修正了内存,文件大小排序的BUG 2. 修正了删除不存在的文件导致explorer.exe崩溃的问题 3. 修正了文件检索默认乱码的问题 4. 增加服务能跳转到对应的注册表 5. 修改下拉箭头不能正常显示的问题 6. 把所有的文件绑定到PowerTool.exe上 2010-08-11 PowerTool V2.5 改善: 1. 修正由于硬件检测导致无法启动的BUG 2010-08-10 PowerTool V2.5 增加: 1. 部分CPU/硬盘/显卡/主板的温度检测 CPU:(Intel "Core Duo", "Core Solo", "Core 2 Duo", "Core 2 Solo", "Core 2 Quad", " Pentium", "Core i3/i5/i7/i9", "Celeron" series (Conroe/Merom architecture and newer)) AMD的CPU的温度检测方法和Intel的不一样,而且我手头也没有AMD的CPU,所以这次只写了Intel的CPU的温度检测 显卡: Nvidia 和 ATI的温度,主板集成的显卡无法检测 硬盘:支持S.M.A.R.T. 特性的硬盘 主板:目前该检测功能较弱,以后会继续加强,包括主板芯片组,风扇的转速等等 2. 部分硬件信息的确认 改善: 1. 进程的父ID和用户名 2. 修正XP里面无法显示进程运行时间 3. 修正删除文件夹时多次弹框 4. 修正Autorun.inf文件夹误报问题 5. 进程和模块的窗口可以拉伸 6. 共享文件夹可以取消共享 7. 修正定位文件只能定位到文件夹的BUG 8. 暂时删除了皮肤库 2010-08-01 PowerTool V2.4 增加: 1. FSD Hook的检测和删除 2. Object Hook的检测和删除 改善: 1. 进程右键单击的话不再会自动刷新 2. 修正模块排序问题 3. 修正进程排序问题 2010-07-27 PowerTool V2.3加强版 增加: 1. 系统重要文件的确认 2. 问题反馈功能 改善: 1. 加强了广告图标/流氓快捷方式的检测 2. 增加了7种启动项目的检测 3. 增加了IE的BHO插件和ActiveX插件 4. 微软进程被插入其他模块希望能用红色显示,区别于未插入其他模块的微软进程和其他应用程序进程 2010-07-18 PowerTool V2.3 增加: 1. 系统恢复功能(检测项目包括注册表关键部位,已安装的杀毒软件,AutoRun文件,Windows漏洞检测,共享文件夹) 2. 流氓快捷方式的检测和删除 3. 镜像劫持的检测和删除 4. 文件关联的检测和删除 5. IE相关的检测和删除 改善: 1. 修改了mini文件驱动的蓝屏BUG 2. 修改了自我保护导致蓝屏的问题(感谢dl123100) 2010-07-11 PowerTool V2.2 增加: 1. 查看和摘除mini文件驱动 2. 查看和摘除文件/鼠标/键盘/网络等过滤驱动 改善: 1. 和微点无法共存的BUG 2. 改进了进程API钩子检测的逻辑 3. 可调整窗体的大小 4. 增加导出功能 2010-06-27 PowerTool V2.1 增加: 1. 查看和摘除用户层的钩子 2. 查看和结束内核线程 3. 关机回调的清除 改善: 1. 文件刷新显示错误的BUG 2010-06-10 PowerTool V2.0 改善: 1. 浏览文件时程序崩溃的BUG 2. Win2003下看内核定时器时蓝屏的BUG 2010-06-09 PowerTool V2.0 增加: 1. 上传文件在线扫描病毒 改善: 1. 超长路径名导致无法显示和删除的BUG 2. 注册表遗留项目忘记删除BUG 3. 修改驱动增强稳定性 2010-06-06 PowerTool V2.0 增加: 1. 暂停进程运行和恢复进程运行 2. 进程模块的内存的dump 3. 进程的线程的查看和结束 4. 进程的窗口的查看和控制 5. 进程的定时器的查看和摘除(该功能还没对应Windows2003) 6. 内核定时器的查看和摘除 改善: 1. 加入皮肤库,美化了界面 2010-05-23 PowerTool V1.9 增加: 1. SSDT/Shadow SSDT钩子的查看和卸载 2. 各种内核回调的查看和卸载 2010-05-13 PowerTool V1.8 增加: 1. 集成文件粉碎功能到系统右键菜单 2. 新增消息钩子的查看和卸载 2010-05-03 PowerTool V1.7 修改: 1. 加强了文件粉碎的强度 2. 改进了通配符检索文件的逻辑 3. 所有的功能内,所有不属于Microsoft的文件均以蓝色显示,以示区别 增加: 1. 新增文件夹为单位的删除功能 2. 新增内核模块和驱动的查看和管理 3. 新增启动项的查看和管理 4. 新增系统服务的查看和管理 2010-04-18 PowerTool V1.6 修改: 1. 支持批量删除文件 增加: 1. 可以在所有NTFS格式硬盘的数据检索文件,并可将检索结果删除 2010-04-03 PowerTool V1.5 修改: 1. 强化进程粉碎功能 增加: 1. 采用美国国防部DOD 5220.22-m标准阻止文件还原 2. 可以从其它进程里强制卸载模块 3. 可以检索模块被哪些进程使用了 2010-03-27 PowerTool V1.3 修改: 1. 改进了Unlock功能,可解锁/强删Unlocker/超级巡警文件粉碎机/金山文件粉碎机等 无法解锁的文件 增加: 1. 增加了简易的自我保护功能 2010-03-21 PowerTool V1.2 修改: 1. 改进了文件粉碎的逻辑,基本上可以删除顽固文件 2. 改进了进程粉碎的逻辑,基本上可以关闭顽固进程 增加: 1. 增加了文件的管理,可以彻底检测所有隐藏文件,安全可靠 2. 可以查看文件锁定/被占用的情况,并可以解锁/unlock 2010-03-16 PowerTool V1.1 改进: 1. 增加了进程管理,枚举隐藏进程/模块的功能,基本上所有的进程都能看到了 2010-03-01 PowerTool V1.0 功能: 1. 简易的文件/进程粉碎机

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧