首页
社区
课程
招聘
[原创]纠正天书夜读中KeSetTimer例子的一点小错误,顺便贴上自己对KeSetTimer的封装代码
发表于: 2011-3-8 22:26 11332

[原创]纠正天书夜读中KeSetTimer例子的一点小错误,顺便贴上自己对KeSetTimer的封装代码

2011-3-8 22:26
11332
如果下面说的存在错误之处,恳请大家指正。希望能帮助遇到同样问题的童鞋~
    昨天调试了这个函数好长时间,就是模仿了书上的例子,调试了很多遍都得不到想要得效果,最后才发现问题出现在一个
类型运算上的错误,自己的C语言基础不太好,是看WinDBG中对应的汇编代码才发现的。
    书上的例子函数如下:
    BOOLEAN MyTimerSet(PMY_TIMER timer,ULONG msec,PVOID context)
    {
      LARGE_INTERGE due;
      due.QuadPart = -10000 * msec;    [B][COLOR="Red"]//这是问题代码,msec是ULONG型的,这是无符号运算,结果为正数[/COLOR][/B]
      timer->Private_context = context;
      return KeSetTimer(&timer->timer,due,&timer->dpc);
    };

    自己模仿的代码:
    BOOLEAN MyTimerSet(PMYTIMER pMyTimer)
    {
      LARGE_INTEGER DueTime;
      DueTime.QuadPart = -10000 * pMyTimer->WaitTime;   [COLOR="Red"][B]//WaitTime是ULONG型的,也存在同样的问题[/B][/COLOR]
      return KeSetTimer(&pMyTimer->KTimer,DueTime,&pMyTimer->KDpc);
    }

    下面从汇编发现问题:
    fad45266 8b4508          mov     eax,dword ptr [ebp+8] ss:0010:fadefc24={MyDriverTest!MyTimer (fad47000)}
    fad45269 8b484c          mov     ecx,dword ptr [eax+4Ch]
    fad4526c 69c9f0d8ffff    imul    ecx,ecx,0FFFFD8F0h       ;-10000 * pMyTimer->WaitTime
    fad45272 33d2            xor     edx,edx                  ;运算高32位清0
    fad45274 894df8          mov     dword ptr [ebp-8],ecx    ;运算低32位存放在DueTime.LowPart
    fad45277 8955fc          mov     dword ptr [ebp-4],edx    ;DueTime.HighPart = 0,很明显结果总是正数


    参数2中,如果是正数的话,表示指定的时间于1061/01/01期经过的纳秒数,单位为100NS,负数才是我们要求的。
   
    昨天真是头晕了,调试了很久才发现问题,解决方法很简单,在运算时使用LONG做强制类型转换就可以了。
    BOOLEAN MyTimerSet(PMYTIMER pMyTimer)
    {
      LARGE_INTEGER DueTime;
      [COLOR="Red"]DueTime.QuadPart = -10000 * (LONG)pMyTimer->WaitTime;[/COLOR]
      return KeSetTimer(&pMyTimer->KTimer,DueTime,&pMyTimer->KDpc);
    }

    强制类型转换后对应的结果:
    fad3d286 8b4508          mov     eax,dword ptr [ebp+8]
    fad3d289 8b404c          mov     eax,dword ptr [eax+4Ch]
    fad3d28c 69c0f0d8ffff    imul    eax,eax,0FFFFD8F0h
    fad3d292 99              cdq                            ; 强制类型转换后的符号扩展,
    fad3d293 8945f8          mov     dword ptr [ebp-8],eax
    fad3d296 8955fc          mov     dword ptr [ebp-4],edx  ;扩展符号位后存放,

    从来没有觉得CDQ指令这么美丽~~~
****************************************************************************************************************************************   
    对于书上的例子封装的还不够傻瓜化(要实现反复执行,用户自己需要在回调函数中再次调用KeSetTimer),因此自己封装了
一遍,比较傻瓜化,效果还算可以,用法如下:
    定义一个全局结构MYTIMER,然后调用函数MySetTimer就可以实现反复周期运行了,参数意义在文件中有说明。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
很好 不错
2011-3-10 08:37
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
BOOLEAN MyTimerSet(PMY_TIMER timer,ULONG msec,PVOID context)  这里直接定义LONG不行吗?
2011-3-10 08:39
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
4
嗯嗯~,主要是考虑到传入的是毫秒数,一定为正数~,LONG的话,如果用户传入一个负数的话就造成错误了。所以用了ULONG~~~。见笑了~
2011-3-10 12:53
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
DueTime
Specifies the absolute or relative time at which the timer is to expire. If the value of the DueTime parameter is negative, the expiration time is relative to the current system time. Otherwise, the expiration time is absolute. The expiration time is expressed in system time units (100-nanosecond intervals). Absolute expiration times track any changes in the system time; relative expiration times are not affected by system time changes.
2011-3-10 13:32
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
人家是正确的~
2011-3-10 13:33
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
7
其实我想表达的是due.QuadPart = -10000 * msec这个运算结果只能是正数~
2011-3-10 18:26
0
雪    币: 236
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏,感谢分享
2011-3-26 11:01
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
VOID fnSetTimer()
{
	LARGE_INTEGER Due;
	int s = -10000;
	int x = 5000;
	Due.QuadPart = s * x;
	KeSetTimer(timer, Due, dpc);
}

    7 f8ad8490 8bff            mov     edi,edi
    7 f8ad8492 55              push    ebp
    7 f8ad8493 8bec            mov     ebp,esp
    7 f8ad8495 83ec10          sub     esp,10h
    9 f8ad8498 c745f8f0d8ffff  mov     dword ptr [ebp-8],0FFFFD8F0h
   10 f8ad849f c745fc88130000  mov     dword ptr [ebp-4],1388h
   11 f8ad84a6 8b45f8          mov     eax,dword ptr [ebp-8]
   11 f8ad84a9 0faf45fc        imul    eax,dword ptr [ebp-4]
   11 f8ad84ad 99              cdq
   11 f8ad84ae 8945f0          mov     dword ptr [ebp-10h],eax
   11 f8ad84b1 8955f4          mov     dword ptr [ebp-0Ch],edx
   12 f8ad84b4 a10c87adf8      mov     eax,dword ptr [DriverTest!dpc (f8ad870c)]
   12 f8ad84b9 50              push    eax
   12 f8ad84ba 8b4df4          mov     ecx,dword ptr [ebp-0Ch]
   12 f8ad84bd 51              push    ecx
   12 f8ad84be 8b55f0          mov     edx,dword ptr [ebp-10h]
   12 f8ad84c1 52              push    edx
   12 f8ad84c2 a10887adf8      mov     eax,dword ptr [DriverTest!timer (f8ad8708)]
   12 f8ad84c7 50              push    eax
   12 f8ad84c8 ff150086adf8    call    dword ptr [DriverTest!_imp__KeSetTimer (f8ad8600)]
   14 f8ad84ce 8be5            mov     esp,ebp
   14 f8ad84d0 5d              pop     ebp
   14 f8ad84d1 c3              ret

人家是对的
2011-11-14 20:43
0
雪    币: 96
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
一如既往的支持!
2011-11-14 21:12
0
游客
登录 | 注册 方可回帖
返回
//