用DLL控制Windows中进程的方法
在Microsoft Windows中,每个进程都有它自己的私有地址空间。当使用&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针来引用内存时,&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针的值将引用你自己进程的地址空间中的一个内存地址。你的进程不能创建一銎湟用属于另一个进程的内存&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针。因此,如果你的进程存在一个错误,改写了一个随机地址系内存,那么这个错误不会影响另一个进程使用的内存。Windows 98 在Windows 98下运行的各个进程共享2 GB的地址空间,该地址空间从0x80000000至0xFFFFFFFF。只有内存映像文件和统组件才能映射到这个区域。
独立的地址空间对于编程人员和用户来说都是非常有利的。对于编程人员来说,系统更容易捕获随意的内存读取和写入操作。对于用户来说,/Article/czxt/Index.html">操作系统将变得更加健壮,因个应用程序无法破坏另一个进程或/Article/czxt/Index.html">操作系统的运行。当然,/Article/czxt/Index.html">操作系统的这个健壮特性是要冻代价的,因为要编写能够与其他进程进行通信,或者能够对其他进程进行操作的应用程序难得多。
有些情况下,必须打破进程的界限,访问另一个进程的地址空间,这些情况包括:
当你想要为另一个进程创建的窗口建立子类时。
当你需要调试帮助时(例如,当你需要确定另一个进程正在使用哪个DLL时)。
当你想要挂接其他进程时。
这里将介绍两种方法,可以用来将DLL插入到另一个进程的地址空间中。一旦你的DLL进入另一个进程的地址空间,就可以对另一个进程为所欲为。这一定会使你非常害怕,因此,究竟应该怎样做,要三思而后行。
1 插入DLL:一个例子
假设你想为由另一个进程创建的窗口建立一个子类。你可能记得,建立子类就能够改变窗口的行为特性。若要建立子类,只需要调用SetWindowLongPtr&&函数,改变窗口的内婵中的窗口过程地址,指向一个新的(你自己的) WndProc。Platform SDK文档说,应用程虿能为另一个进程创建的窗口建立子类。这并不完全正确。为另一个进程的窗口建立子类的关键问题与进程地址空间的边界有关。
当调用下面所示的SetWindowsLongPtr&&函数,建立一个窗口的子类时,你告诉系统,发送到或者显示在hwnd设定的窗口中的所有消息都应该送往MySubclassProc,而不是送往口的正常窗口过程:
进程A中代码:
EXE file:
LRESUlT WndProc(HWND hend,UNIT uMsg,...){.....}
USER32.DLL file
LONG DispatchMessage(CONST MSG*msg)
{
LONG lRet;
WNDPROC lpfnWndProc=
(WNDPROC)GetWindowLongPtr(msg,hwnd,GWLP_WNDPROC
);
lRet=lpfnWndProc(msg.hwnd,msg.message,msg.wParam,mag.
lParam);
return lRet;
}
进程B中:
EXE file
void Somefunc(void)
{
HWND hwnd=Findwindow("class A",NULL);
SetWindowLongPtr(hwnd,GWLP_WNDPROC,MySubclassProc);
}
USER32.DLL file ......
换句话说,当系统需要将消息发送到指定窗口的WndProc时,要查看它的地址,然后直接调用WndProc。在本例中,系统发现MySubclassProc&&函数的地址与窗口相关联,因此就直接调用MySubclassProc&&函数。
为另一个进程创建的窗口建立子类时遇到的问题是,建立子类的过程位于另一个地址空间中。下面举个例子,说明窗口过程是如何接受消息的。进程A正在运行,并且已经创建了一个窗口。文件User32.dll被映射到进程A的地址空间中。
- 上一篇:VC8/9中CRT函数对非法参数的处理
- 下一篇:VC程序设计中可序列化类的实现