阅读:2589回复:17
如何在win2k WDM驱动程序中显示对话框(类似于WIN2K登陆框)
曾经有位老外告诉我imposible,我觉得imposible imposible。请问各位高手及斑竹有何高招?我以前发过一个类似的贴子,一位仁兄告诉我用IoRaiseInformationalHardError函数,但这只能弹出一个消息框,而我要的是对话框,就是说可以用户可以输入某类参数!我认为,如果按照图形设备驱动编程的方法从底层编写,理论上是行的通的(想想windows2000启动时的登陆框就知道);但是我始终认为利用已有的对框资源,加上一些未公开的内核api(或许公开了但我不知道)应该有捷径可走。希望各位前辈指点迷津,让我们一起对老外说possible!
|
|
最新喜欢:![]() |
沙发#
发布于:2003-07-18 09:33
windows2000启动时的登陆框 是用GINA,标准的APP的win 32 DLL。
我给你回信了。 |
|
板凳#
发布于:2003-07-18 09:36
如果真的可以在内核弹dialog,那内核如何实现消息机制???。
真的是那样的话,我觉得MS的设计师要抓来枪毙的。 至于图形系统,你看inside windows 2000,我觉得你完全理解错了。 |
|
地板#
发布于:2003-07-18 14:53
vcmfc兄,您的意思是:在内核模式驱动程序中也能调用标准的App的win32 DLL?
|
|
地下室#
发布于:2003-07-18 17:38
是你理解错了,在windows启动过程中,启动等级高的80个驱动再出现>>>>>>>>>>>>>>>>字符的时候已经装载完毕,而此后图形界面启动下面的进度条,直接对应着包括对象管理器、电源管理、PNP等功能的启动。到你看到登陆框时,已经启动的是非驱动的认证进程和用户进程了,是dll而非驱动。
|
|
|
5楼#
发布于:2003-07-18 17:39
另外,关于内核驱动能否调DLL,以前讨论过,这要看你的驱动的启动等级,如果最高那是不可能,子系统尚未建立,根本没有dll可调。
|
|
|
6楼#
发布于:2003-07-18 20:00
我想驱动里面是没法调用win32 api的。
win32 api都从dll导出,每个dll在每个进程的加载地址不一定一样,你怎么去定位,就算可以通过pe格式来,但是驱动不是属于某一个进程的。 就算你全调用ring0下的函数,也未必可以,因为一些复杂的消息机制可能很难实现。 |
|
7楼#
发布于:2003-07-18 22:17
驱动程序通过apc,可以直接调用用户态函数,其中可以做任何事情,但这种调用,只是在用户态线程执行时,有系统在用户线程环境下执行的,本质上还是有应用程序调用的。
但是,从表面上来看,让驱动程序谈出一个对话框是可以的,需要一个应用程序来配合。做法如下,后台运行一个应用程序,其中,定义了几个函数,该函数内探出对话框,等等任何你想做的工作。然后,在程序运行指出,告诉驱程这些函数的地址。这样差不多完工了。当驱程需要弹出对话框时,可以采用apc调用这些函数。 |
|
|
8楼#
发布于:2003-07-19 11:33
To xxyln兄:
那就是说,在>>>>>>>>>>>>>>>>>出现之后,登陆框之前,我们就可以启动系统进程或用户进程;而在这些系统进程或用户进程中,我们又可以“随心所欲”的调用dll――这岂不是too perfect太完美了?! 于是,关键的问题就是:如何在windows2000或xp登陆框出现之前启动一个系统进程或用户进程呢?具体而言就是:(1)由谁启动?如何启动(2)何时启动(如何把握启动时机)?(3)对系统进程dll编程有何限制? 对于问题1,我认为从内核驱动启动至少是一种方法。对于问题2,利用驱动程序的启动顺序也能解决。焦点现在就集中到第三点,即:既然系统进程是在驱动程序中创建的,那么该系统程序能否调用win32 DLL就是一个值得尝试的事情。 按照类推的原则,我现在迫切想知道的是――正如vcmfc兄所言:windows2000登陆框是由GINA调用win32 dll(对应winlogon.exe进程)生成的――则,如果winlogon.exe确是由某个“驱动”生成的系统进程,那么答案就有了;但如果winlogon.exe不是由某个所谓的“驱动”生成的,而是由别的什么组件或机制生成的,那么唯一要做的事情就是找到这种组件或机制。 呵呵,不知道本人分析的对不对,请各位指教。 |
|
9楼#
发布于:2003-07-19 17:50
建议看一下inside win2k ,启动过程讲的很清楚。从引导扇区开始,调用ntldr,ntldr讲座很多很多事,包括将很多驱程调入系统,最后一部是调用ntoskrnl的主函数,ntoskrnl又进行了若干艰苦操作,包括初始化很多驱程,最后调用smss过程。smss向用户提供可见界面的用户环境(注意,之前都是在黑窗口下进行的),smss将加载win32k子系统,最终将调用winlogn,winlong 见创建窗口桌面对象,此后,才能出现我们通常意义上的窗口.winlogon此后调用了gina。注意,smss是用户模式进程,他和普通的用户模式进程不同的是他是系统信赖组建,他家在了win32k子系统,此后,才能进行我们所说的窗口操作。当winlogon调出登陆界面是,这一切都与内核无关了,他们都是用户进程。
请注意调用的顺序,除非你能够重写smss,或者winlogon,否则,你不能中断他们。 好像有人从写过winlogon |
|
|
10楼#
发布于:2003-07-20 21:43
我并不十分关注启动顺序问题,因为在登陆框出现之前启动一个系统线程(注意:不是系统进程)是完全可能的。winlogon实际上是一个特殊的系统支持用户态进程。现在的问题是:(1)我并不想中断winlogon的执行或者干脆替换之,而是想再创建一个类似的“winlogon”用来显示我自己的对话框――于是请问,这种创建机制是否存在?如果存在则如何实现?(2)如果在登陆框出现之前创建“系统线程”是可能的解决办法之一,那么,“线程”的上下文环境是否限制它对win32 dll的调用?这里的线程是从驱程中创建的。(我正在做实验)
|
|
11楼#
发布于:2003-07-20 23:23
问题已经很清楚了,当登陆之后,有很多方法可以创建进程或先程,但是,在启动阶段,究竟什么程序运行,都是有个严格的顺序的,所以,除非你自己写一个程序代替其中一个,你没有其他方法运行一个额外的线程或进程。
另外,服务程序都是在登陆之前就运行了。 |
|
|
12楼#
发布于:2003-07-21 12:37
在登陆之前创建系统线程是可能的。
|
|
13楼#
发布于:2003-07-23 18:01
登陆之前可以创建线程,但是不能显示任何窗口,除非是Gina
|
|
14楼#
发布于:2003-07-23 21:02
可以显示窗口,只要创建的进程关联到winlogon桌面
|
|
|
15楼#
发布于:2003-07-31 15:15
直接弹出对话框也是possible的,条件:
1、过滤显卡驱动,这样就可以在屏幕画你的对话框了 2、过滤键盘驱动,接受按键信息 3、如果还没累死,再过滤鼠标驱动,实现鼠标点击! |
|
16楼#
发布于:2003-07-31 15:35
hehe,那样不是实现的另一个softice界面?
|
|
|
17楼#
发布于:2005-01-06 00:37
jinricksha
|
|