只问耕耘
分类: WINDOWS
2007-08-29 09:37:29
写脚本遇到需要Sleep的地方借助于ping来实现,因为Windows的ping在发每个包之间都会调用KERNEL32!Sleep来挂起1秒钟。最有意思的是在给Sleep传递参数的时候还会扣掉通信往返所花的时间,所以非常精确。这部分反汇编出来是这样的:
010020fe b8e8030000 mov eax,3E8h ;1000ms
01002103 8b7608 mov esi,dword ptr [esi+8] ;取出icmp包往返所花的时间
01002106 3bf0 cmp esi,eax ;ping 127.0.0.1当然不会超过1000ms
01002108 7309 jae ping+0x2113 (01002113)
0100210a 2bc6 sub eax,esi ;减去通信耗时
0100210c 50 push eax
0100210d ff1528100001 call KERNEL32!Sleep
假设需要Sleep 10秒,就可以这样写:
SET SLEEP=ping 127.0.0.1 -n
%SLEEP% 11 > nul