问题:
5 f; u+ x p, ]% I3 v9 L 使用vtoolsd写vxd时,在vxd中如何使用postmessage向ring3层的应用程序发送消息?
- _$ J/ a0 U3 l9 `" y 解答:, \) y) W, }% B, Z
no1:8 y7 J: o! H7 F \$ z( I$ d7 g" }
哈哈,这问题太简单了:; X) t0 f& }* f5 W
shell_postmessage(g_hwnd, (spm_um_donotwaitforcrit16 and g_umousemsg),( H: Y' ~7 R7 k$ H
(word)state,(dword)(wdeltay16 and wdeltax),null,0);
- N& T1 z- k' I, e; t4 T g_hwnd为ring 3环的窗口句柄,g_umousemsg为消息值(如果消息是自定义的话,要在ring 3的程序中给登记上)。state是wparam,为16位,,(dword)(wdeltay16 and wdeltax)为32位的lparam,至于null,0就看看帮助啦,一般用不上。 这一句是向ring 3程序发送鼠标数据。8 e+ ] }1 b5 f
问题:
* V+ i2 j0 ?8 B, l$ a 应用程序的hwnd如何传给vxd? 而且,用mfc时得到的是hwnd类型的m_hwnd,它是一个结构而非16bit的窗口句柄。
0 |' F8 W2 {" u ~ 解答: n5 E3 G1 _; V
hwnd可以用deviceiocontrol函数来传递到vxd中,; }# d* H2 ^( T$ O
ring 3程序:
; O0 e5 q9 Y3 Z9 X# D hwnd hwnd = ::afxmainwnd()-getsafehwnd();
% ?; v( t$ ~- @, W- w9 M deviceiocontrol(m_hvxd,vxd_set_hwnd,&hwnd,sizeof(handle),null,0,null,null,0);
+ a9 `2 M, [1 F6 P vxd中:9 N0 ~6 f9 a/ s% e: n5 `
dword xdevice::onw32deviceiocontrol(pioctlparams pdiocparams)
- j8 }. j* O' ~8 w& r1 ` {
8 F1 {3 Y# j+ N8 N switch(pdioparams-dioc_ioctlcode)) J6 D" }9 m( F7 H
{5 N2 _' W& k' y3 R7 x L
case vxd_set_hwnd:. J& [1 Z1 ~+ U; F9 F
memcpy(&g_hwnd,pdiocparams-dioc_inbuf,sizeof(handle));
2 K- f$ F. J8 x# k {2 w2 r1 V break; ...
2 x2 K1 ?- Y% C' k! A7 j }
- d' D0 z9 e" }; v }
+ f ?0 V8 s5 p8 ] jadesun ps:; y8 H4 E- F5 f5 x$ S
(ring 0 与 ring3)ring 0组件是受到处理器结构保护的,即在ring 0中的软件受到硬件(芯片)保护,以防止互写。ring 0 组件执行所有特权操作,如与硬件直接通可系统中的任何资源。
2 h/ }$ V Y) H" z* U 如果在ring 0中的软件出现问题,就会导致整个系统崩溃。(ring 3) 当一个软件组件在ring 3时,就不会受到处理器的保护。但可受到操作系统和虚拟机管理器的保护。ring 3中的进程不具有与ring 0同样的权限,例如,ring 3中的进程不能直接写硬件,这些进程必须与ring 0中的进程通然后由ring 0中的进程对硬件进行操作。
! L" g) t) L1 k" l 这种在权限上的限制意味着如果一个软件在ring 3上出现失败,它也不会破坏整个系统。即在ring 3上的软件组件出现问题不会影响到系统正在运行的其它软件。正是这个原因,所有的应用程序都放在ring 3上运行。 |