阅读:2136回复:14
再问从驱动中启动一个应用程序的问题!
目前我已经可以通过DeviceIoControl函数将应用程序启动,但是我的目的是在驱动加载时让他启动应用程序,而不是通过DeviceIoControl函数来启动。也就是说我要达到的目的是:机器启动后改应用程序自动启动。现在如果我将DeviceIoControl中的启动应用程序的部分转移到DriverEntry函数中就会使驱动不能加载。可能的原因是什么?
是不是因为驱动加载时,ntdll.dll还没有加载进来?我用的starttype是2。别的还有什么原因吗?请给于一些提示!谢谢! |
|
最新喜欢:threeb...
|
沙发#
发布于:2002-08-07 17:53
我看了一下RtlCreateProcessParamters函数的实现,如果可选参数为0 ,他事实上就是将创建进程的PEB拷贝到新创建的进程中。但是驱动程序的进程是什么呢?他的环境块是操作系统进程的环境块吗?
|
|
|
板凳#
发布于:2002-08-07 17:50
你有没有试过在系统正在使用运行的情况下加载驱动程序啊?你要把一些可疑的问题排除掉啊!也许那个函数需要访问的资源还没有加载啊,也有可能是那个函数必须在对应的irql上面才可以运行的啊 我就是在系统正在使用运行的情况下加载驱动程序的!出现的错误是:Break Due to KeBugcheckEx(Unhandled kernel mode exception) error=1e (KMODE_EXCEPTION_NOT_HANDLED)P1=C0000005 P2=77F92E69 P3=0 P4=30 |
|
|
地板#
发布于:2002-08-06 20:37
你有没有试过在系统正在使用运行的情况下加载驱动程序啊?你要把一些可疑的问题排除掉啊!也许那个函数需要访问的资源还没有加载啊,也有可能是那个函数必须在对应的irql上面才可以运行的啊
|
|
地下室#
发布于:2002-08-06 19:04
May be trace the VxD service _SHELL_CALLDLL to port to NT kernel.
Oh..The NT4 has the ZwW32Call. [编辑 - 8/7/02 by Nouk] |
|
|
5楼#
发布于:2002-08-06 15:29
我感觉是IRQL的限制,DRIVERENTRY是在DISPATCH_LVEL的,而DeviceIOControl是在PASSIVE_LEVEL的,应用程序是在PASSIVE_LEVEL运行的;而且应用程序的代码也是在分页内存中的,它也没法在DISPATCH_LEVEL中加载 driverentry是PASSIVE_LEVEL的 |
|
|
6楼#
发布于:2002-08-06 15:25
我感觉是IRQL的限制,DRIVERENTRY是在DISPATCH_LVEL的,而DeviceIOControl是在PASSIVE_LEVEL的,应用程序是在PASSIVE_LEVEL运行的;而且应用程序的代码也是在分页内存中的,它也没法在DISPATCH_LEVEL中加载
仅供参考,我并未测试 |
|
|
7楼#
发布于:2002-08-06 14:38
在start type=3的时候,在DriverEntry中不是完全不能调用ntdll.dll的导出函数,而是RtlCreateProcessParameters函数不能调用,而且在start type=2的时候,也不是所有的ntdll.dll导出的函数不能使用,而是上面的函数不能使用,为什么?
[编辑 - 8/6/02 by quartz] [编辑 - 8/6/02 by quartz] |
|
|
8楼#
发布于:2002-08-06 10:18
[quote]肯定不行的啦。驱动程序Start Type = 2,驱动程序加载的时候,是系统初始化的时候,Win32子系统还没有启动吧,ntdll.dll肯定还没有加载呢,怎么执行应用程序? NTDLl好象很早就加载的了吧 [/quote] 果然,在进入DriverEntry时ntdll.dll已经加载,但是此时不能调用其中的导出函数,那是因为Win32子系统还没有启动,还是别的原因? |
|
|
9楼#
发布于:2002-08-06 09:43
等我实验一下就知道了。 :)
|
|
|
10楼#
发布于:2002-08-06 09:29
肯定不行的啦。驱动程序Start Type = 2,驱动程序加载的时候,是系统初始化的时候,Win32子系统还没有启动吧,ntdll.dll肯定还没有加载呢,怎么执行应用程序? NTDLl好象很早就加载的了吧 |
|
11楼#
发布于:2002-08-05 15:45
对于RtlCreateProcessParameters函数,我在DriverEntry里面设置了它的入口地址,但是只要在DriverEntry里调用这个函数就会蓝屏,而在Dispatch里调用就不会有问题。这是为什么!
|
|
|
12楼#
发布于:2002-08-05 12:40
为什么不分开启动呢?应用程序启动时检测一下驱动是否加载不就行了
|
|
13楼#
发布于:2002-08-05 10:36
谢了!
|
|
|
14楼#
发布于:2002-08-05 10:32
肯定不行的啦。驱动程序Start Type = 2,驱动程序加载的时候,是系统初始化的时候,Win32子系统还没有启动吧,ntdll.dll肯定还没有加载呢,怎么执行应用程序?
可以考虑这样,在DriverEntry中启动一个线程,在线程中尝试查找ntdll.dll,直到找到ntdll.dll再启动应用程序。 |
|
|