能力值:
( LV2,RANK:10 )
|
-
-
2 楼
休息了一会,自己又想通了。
我错在对API一知半解上,其实_beginthead,_begintreadex最终都是调用CreateThread。CreateThread的返回值是EAX,表示线程句柄号,[ESP+18]即第6个参数才是线程ID号的地址。如
0012F900 6D189CB9 /CALL 到 CreateThread 来自 DINPUT8.6D189CB3
0012F904 00000000 |pSecurity = NULL
0012F908 00000000 |StackSize = 0
0012F90C 6D1899B1 |ThreadFunction = DINPUT8.6D1899B1
0012F910 001C2438 |pThreadParm = 001C2438
0012F914 00000000 |CreationFlags = 0
0012F918 001C2438 \pThreadId = 001C2438
CreateThread返回前,句柄号=EAX,ID号=[001C2438],这个ID号才能在OD的线程窗口中看到。
但是问题却来了,看来这个线程是DINPUT8创建的,那用户程序里究竟哪儿在处理输入信息呢?我的猜测是先DINPUT8->CreateDeviceXXX,然后才是在主进程的子线程里面无线循环读keyboard->GetDeviceState,怎么DINPUT8自己搞了个线程出来了,这样的话事件处理入口在哪儿?
|
|
|