|
发表于 2005-12-31 17:13:54| 字数 1,691| - 中国–四川–绵阳 联通
|
显示全部楼层
|阅读模式
这个是全新版本的ShockAlarm,赶在2006年前完成了。
[+]这个版本采用了自己写的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就可以得到硬盘的当前状态,然后相应地做出反应。还是很简单的。
附: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[0])
- {
- 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 [0.5 min]; 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);
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|