|  |  |  |  |  |  | 
					            
						            
							            
								            |  | 
	Windows内核调试帖子发起人: Thomson   发起时间: 2008-08-25 22:50 下午   回复: 3
 
	 
		
			| 
					
						|         | 
						      
						        | 帖子排序: |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-25, 22:50 下午 |  
											| 
													 Thomson 
 
   注册: 2008-07-03
 发 贴: 211
 | 
													
														| ![Confused [*-)]](/emoticons/emotion-42.gif) DriverEntry的context和一个单步执行的问题? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 1. 以前的NT驱动可以以service的方式启动,比如使用"net start *",那这个相应的驱动程序的driverentry是运行在哪个context里面的呢? 是Services.exe吗? 关于启动driver的service协议是谁来实现的? 驱动本身肯定是没有实现的. 
 
 2.在用户态下,即使是single step int指令,也是跟不进去,这在硬件上是怎么做到的呢?(是不是int执行完不检查是不是处理single step模式?)
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-26, 11:15 上午 |  
											| 
													 王宇 
 
  
   注册: 2007-05-08
 发 贴: 306
 | 
													
														| Re: DriverEntry的context和一个单步执行的问题? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 现在的 Legacy Device Driver 一样可以用 net start * 启动。 
 一般来说 DriverEntry 的调用序列如下:
 _KiThreadStartup() + 0x16          [\base\ntos\ke\i386\threadbg.asm]
 call  eax        ; SystemRoutine(StartRoutine, StartContext)
 
 PspSystemThreadStartup() + 0x34    [\ntos\ps\create.c]
 (StartRoutine)(StartContext)
 
 ExpWorkerThread() + 0x100          [\base\ntos\ex\worker.c]
 ((PWORKER_THREAD_ROUTINE)WorkerRoutine) (Parameter);
 
 IopLoadUnloadDriver() + 0x45       [\base\ntos\io\iomgr\internal.c]
 status = IopLoadDriver( keyHandle, TRUE, FALSE, &driverEntryStatus );
 
 IopLoadDriver() + 0x669            [\base\ntos\io\iomgr\internal.c]
 status = driverObject->DriverInit( driverObject, ®istryPath->Name );
 
 最后一句就是负责 call 驱动导出出口的代码,导出出口对于老版本编译器来说是DriverEntry(),对于新版本build的来说是GsDriverEntry()——金丝鸟/栈下溢小甜饼。
 
 如果研究过Win句柄表或句柄对系统/驱动上下文的影响,应该清楚DriverEntry()位于SYSTEM上下文;未队列的Dispatch等位于调用者线程上下文;DPC For ISR、Timer DPC等位于任意线程上下文。如果不是很明白请参见我整理的这篇OSR经典文章:《Understanding and Using Execution Context in Windows NT Drivers》
 http://advdbg.org/dfstore/img/Understanding%20and%20Using%20Execution%20Context%20in%20Windows%20NT%20Drivers.pdf
 
 
 另外,如果想研究scm等,请参看以下链接:
 http://www.codebreakers-journal.com/downloads/cbj/2004/CBJ_1_1_2004_Reverse_Engineering_the_Service_Control_Manager.pdf
 
 http://mlabs.secniche.org/papers/Win_Xp_Svc_Int.pdf
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-26, 13:30 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: DriverEntry的context和一个单步执行的问题? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 王宇对第一个问题回答的很深入了,简单说,DriverEntry是在系统上下文中执行的,不论是PnP过程发起的,还是服务管理器(SCM)发起的,它们不过都是向系统线程的工作队列中插入一个任务。 第二个问题问的非常好。很遗憾,我在写《软件调试》时没有讨论到这么深。其实,只要看一下CPU的“代码”,就有答案了。与其它指令在末尾检查TF位然后产生#DB异常不同,INT nn指令在末尾会清除TF位,而且不会产生#DB。这样这条指令本身就不会产生#DB,开始执行对应的异常处理例程时TF位已经没有了,所以也不会产生#DB。
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-28, 20:55 下午 |  
											| 
													 Thomson 
 
   注册: 2008-07-03
 发 贴: 211
 | 
													
														| Re: DriverEntry的context和一个单步执行的问题? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 谢谢, 嗯,DriverEntry确实是在System process的context下执行的,而scm启动driver service和其它service是不一样的,它应该是直接通过了系统调用nt!NtLoadDriver,而不是去新启动进程,然后和其通信,nt!NtLoadDriver里面会判断本身在不在System process的context下,如果不在的话,就queue一个workiterm到系统线程,然后等待加载完成事件,等到再做返回...
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
		
			| 高端调试 » 软件调试 » Windows内核调试 » Re: DriverEntry的context和一个单步执行的问题? |  |  
 |  |  |  |