_1234 发表于 2005-12-31 17:13

【原创】ShockAlarm2 - IBM硬盘保护系统警报器及其原理简介

这个是全新版本的ShockAlarm,赶在2006年前完成了。^u^

[+]这个版本采用了自己写的API hook来监控硬盘的状态,
[+]对使用中文繁简体用户界面的支持

详细的使用说明可以参考:
http://www.thinkpad.cn/forum/viewthread.php?tid=206440&fpage=1&highlight=

实现原理:
下面把上个帖子中没有写的实现原理部分补充完整(假定了解Win32和C/C++编程)

这个程序利用了一个user mode的API hook来实现对硬盘的监控。
当IBM硬盘保护系统(kernel mode部分)监测到足够强的震动时,
将硬盘挂起,同时通知user mode的程序Tpshocks.exe,而这个程序
将调用一个API函数,Shell_NotifyIconW相应地改变系统托盘的图标。

我的这个程序ShockAlarm.exe, 将一个API hook driver(ShockAlarm.dll)注入到
Tpshocks.exe,并实现对Shell_NotifyIconW的hook, 使得每当Tpshocks.exe调用
Shell_NotifyIconW来改变图标时ShockAlarm.exe就会收到一个自定义的windows消息
这样ShockAlarm.exe就可以得到硬盘的当前状态,然后相应地做出反应。还是很简单的。^u^

附:ShockAlarm.dll的源代码

//==================================
//
//        ShockAlarm.dll Module
//
//==================================
#include <windows.h>

#define cWM_TPSHOCKNOTIFY        (WM_USER + 0x000D)
//----------------------------------------------------
//
//        Hook_Shell_NotifyIconW()
//
//----------------------------------------------------
BOOL
WINAPI
Hook_Shell_NotifyIconW(
                                           DWORD dwMessage,
                                           PNOTIFYICONDATAW lpdata
                                           )
{
        WPARAM wParam;
      /* we only need to check the first character */
        switch(lpdata->szTip)
        {
        case L'S':
        case L'检':
        case L'偵':
                /* Shock detected; Hard drive stopped */
                wParam = 0;
                break;

        case L'N':
        case L'没':
        case L'未':
                /* No shock detected; Hard drive running */
                wParam = 1;
                break;

        case L'M':
        case L'手':
        //case L'手':
                /* Manually suspended ; Hard drive running */
                wParam = 2;
                break;

        default:
                wParam = (WPARAM)-1;
                break;
        }

        /* Get the ShockAlarm thread ID */
        HANDLE hMapObject = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "ShockAlarm_TID");
        LPDWORD lpdwTid = (LPDWORD)MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);

        /* Post the message to ShockAlarm */
        PostThreadMessage(*lpdwTid, cWM_TPSHOCKNOTIFY, wParam, (LPARAM)dwMessage);
        CloseHandle(hMapObject);

        return Shell_NotifyIconW(dwMessage, lpdata);
}

xlaser 发表于 2005-12-31 17:34

第一个顶!!!!!!

对楼主的钻研精神表示由衷的敬意。

[ 本帖最后由 xlaser 于 2005-12-31 18:15 编辑 ]

VanLife 发表于 2005-12-31 17:48

我c~太nb了。原谅我说粗口,太激动了。。送花!!!

aysf 发表于 2005-12-31 18:10

很强很实用,从第一版出来就关注了
联想应该和你联系,将此功能加入随机软件中

aznarble 发表于 2005-12-31 18:16

此真正的原创,强顶之。

那些动不动就声称自己帖子是“原创”的伪原创们,是否为之感到脸红呢?

xlaser 发表于 2005-12-31 18:19

楼上1000贴,帮你纪念一下

[ 本帖最后由 xlaser 于 2005-12-31 18:20 编辑 ]

zhaobf 发表于 2007-2-6 23:22

呵呵,正需要!谢了,楼主!

bush-911 发表于 2007-7-20 19:19

下载了测试通过。谢谢楼主

huangxinghua123 发表于 2008-7-31 02:10

fdvf
页: [1]
查看完整版本: 【原创】ShockAlarm2 - IBM硬盘保护系统警报器及其原理简介