Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1521回复:13

关于DLL装载的问题

楼主#
更多 发布于:2003-02-09 22:02
DLL可以被装载到内存中的任何地址空间,但是PELOADER是怎么对DLL中的变量进行重定位的呢?
易水
lzhui
驱动牛犊
驱动牛犊
  • 注册日期2001-04-27
  • 最后登录2004-01-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-10 14:43
为什么会单独对变量重定位?我觉得只是对基地址重新设置,DLL内部的变量地址用的都是偏移量应该是固定的。
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-10 20:26
学习
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-02-11 09:58
对变量的引用都是用绝对地址
易水
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-11 10:18
PIC code 里的变量应该都是相对地址,通过GOT table定位.
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-12 11:50
见.reloc section的说明
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
attaya
驱动牛犊
驱动牛犊
  • 注册日期2002-06-21
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-12 21:28
通过dll的rebasing

programming Applications for Microsoft Windows 里有详细介绍
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-13 14:35
如何在系统启动的时候自动加载一个DLL?
在注册表run目录里调用rundll32.exe是可以的.但是觉得有些dirty,正规方法是什么?
sisisisi
驱动牛犊
驱动牛犊
  • 注册日期2003-02-12
  • 最后登录2003-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-13 15:36

DLL只是动态连接库,用的时候会自然被load到内存里.
DLL自己没有生命力,是使用进程的内存空间为进程服务而已.
听你的意思应该是想自动启动一个进程,
在NT/2000下一般都是写一个的Service,设置为自动模式就和
系统挂接起来了.驱动程序比Service更靠近硬件底层,可以在
更早的时候被加载.选择那一种方法要根据你要做的事情.
除了导致操作系统不能正常运行的方法,没有dirty和不dirty
之分,run注册表也是正常用户接口之一.不同之处在于被启动
的先后和所运行的级别有别而已.
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-14 18:45
谢谢,第一次接触service这个概念,是不是相当于linux里的deamon?

我现在写好了DLL,在注册表里用rundll32.exe启动它.可是rundll32.exe的参数不明白:
rundll32.exe myDLL.dll,arguement(我瞎写的是rundll32)---------这里的arguement不知道是什么,SDK和DDK里查不到.这样做,会弹出messagebox:error load myDLL.dll,invalid access to memory location----------这是在load的时候出错,还是在mydll运行时出错?
在我的概念里,动态连接库在内存里的地址应该是有规定的,不能自己随便放,可是在windows下面我什么也摸不到.这个地址是怎么指定的呢?
sisisisi
驱动牛犊
驱动牛犊
  • 注册日期2003-02-12
  • 最后登录2003-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-16 06:01

对。类似于deamon.
不需要用rundll32来做,写NT Service需要遵循MS的规范,其实很简单,MSDN里边有现成的例子来改改就好了。rundll32是用来执行DLL的一些function,可以用rundll32来运行的dll必须满足一些条件。
俺把MSDN的描述贴在下面给你参考一下。
DLL在内存中的地址并不是固定的,在连接的时候PE文件relocation table决定了每个section的相对地址,在load的时候windows会根据当前memory状况装入内存,起始的地址就作为基地址,然后所有变量,函数的地址就是这个基地址在加上相对地址来定位。在不同的机器上加载的地址是不同的。
另外,MS SDK还是resource SDK里面有一个srvany的tool可以把一般
程序作为service运行,简单的做法是你把你的APP用它来包装一下就行了。具体使用方法可以很容易从MSDN.MICROSFT.COM查到。

Platform SDK: Tools

Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:

void CALLBACK EntryPoint(
  HWND hwnd,        // handle to owner window
  HINSTANCE hinst,  // instance handle for the DLL
  LPTSTR lpCmdLine, // string the DLL will parse
  int nCmdShow      // show state
);
Note that EntryPoint is a placeholder for the actual function name. For a list of possible show states, see WinMain.

The following is the command-line syntax for Rundll32:

rundll32 DllName,FunctionName [Arguments]
DllName
Specifies the name of the DLL. The name cannot contain spaces, commas, or quotation marks. The utility searches for the DLL using the search criteria documented for the LoadLibrary function. Therefore, it is best to use the short name and provide a full path for the DLL.
FunctionName
Specifies the name of the function to call in DllName. Requires a comma (without no spaces) between DllName and FunctionName.
Arguments
Optional arguments for FunctionName.
Rundll32 loads the specified DLL using LoadLibrary, obtains the address of the function using the GetProcAddress function, and calls the function with the specified arguments, if any. When the function returns, Rundll32 unloads the DLL and exits.

Windows NT/2000/XP: It is possible to create a Unicode version of the function. Rundll32 first tries to find a function named EntryPointW. If it cannot find this function, it tries EntryPointA, then EntryPoint. To create a DLL that supports ANSI on Windows 95/98/Me
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-19 20:36
我在driver里调用IoReportTargetDeviceChangeAsynchronous(),结果蓝屏.softice跟进去,发现是IoReportTargetDeviceChangeAsynchronous函数内部的第一个保护性判断,看我传进去的DEVICE_OBJECT参数里关联的什么东西为空,就把我给踢出来了.
先问个比较过分的问题:IoReportTargetDeviceChangeAsynchronous()接受的DEVICE_OBJECT参数有什么限制吗?----可是即便有限制,除了把自己的DEVICE_OBJECT传进去,我还能怎么办?
我第一次作这玩艺,我想问一下,你们在windows下写驱动,也是黑洞瞎火的,只是照着DDK的样码研究吗?碰到这种问题,你们会怎么办?
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-19 23:04
我想根据irp的机制,应该这里给IoReportTargetDeviceChangeAsynchronous传递进去一个最底层的device_object参数(我的driver的device对象基于这个底层的对象)

大家说是吗?


还有,sisisisisi兄,多谢指点,搞清了一些基本概念。
bx_bird
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-20 13:40
//我想根据irp的机制,应该这里给IoReportTargetDeviceChangeAsynchronous传递进去一个最底层的device_object参数(我的driver的device对象基于这个底层的对象)

又看了ddk,上面的意思的确是这样.但是底层对象PDO的指针如何拿到呢?DriverEntry被包装起来了,代码我看不到,那么我该走什么路径拿到PDO指针呢?
游客

返回顶部