rt
因为全局 hook 可以读写任意进程,所以对这前两个问题搞不清楚
而且,不论是 WinMain 的 hInstance 参数,还是用
GetWindowLong( hwnd, GWL_HINSTANCE );
取得其它应用程序的 instance ,结果都是 0x400000,why?

解决方案 »

  1.   

    一般你的钩子代码都是在调用GetMessage和PeekMessage那个线程的context中运行的。new的数据当然放在调用钩子代码的那个进程的free store中。 至于hInstance,那是exe文件在进程地址空间中默认的加载地址,只要你不显式地指定,windows在启动你的程序的时候总是把exe文件加载到从这个地址开始的空间中。
      

  2.   

    多谢
    补问几句:
        一个程序里 loadlibrary( x.dll ), 那么 x.dll 被读入到哪里?进程的空间里吗?这样岂不是每次都复制了一份 x.dll ,太过浪费了?
        dll 中的静态数据,以及 dll 函数中 new 的数据,分别放在哪里呢?
      

  3.   

    一般 EXE 加载的基址都是 0x00400000;全局 Hook 会加载到所有拥有 GUI 线程的进程里,Hook 所在的 dll 也会映射到这些进程的地址空间;loadlibrary(dll) 映射到当前的进程空间,dll 中 new 的数据是从当前进程的默认堆分配的,而静态变量在 Win9x 下为每个进程复制一份,WinNT/2000 和代码页面一样用 copy-on-write 保护。
      

  4.   

    一个程序里 loadlibrary( x.dll ), 那么 x.dll 被读入到哪里?进程的空间里吗?这样岂不是每次都复制了一份 x.dll ,太过浪费了?
        -------------------------------------------
    没有复制,而是映射过去.其实就是共享了.
      

  5.   

    不是每个Exe的hInstance=0x00400000的。比如Notepad就是0x01000000的。