阅读:1057回复:5
初级问题
1。是否可以将adddevice例程中的操作(创建设备对象、建立设备扩展,符号连接)放如driverentry例程中呢?
2。完成例程IoCompleteRequest是系统自带的吗?他的源代码在哪里? |
|
沙发#
发布于:2003-03-28 00:55
1.不可以
2.根据你驱动的需要加代码,也可以不加 |
|
板凳#
发布于:2003-03-28 10:02
这是我在本站帖子中下的程序,这个程序就将adddevice例程中的操作
放到driverentry例程中的一个createdevice函数中。 还有在该程序中他直接调用IoCompleteReques函数,但没有这个函数的定义。 |
|
|
地板#
发布于:2003-03-28 10:55
deviceentry用于初始化驱动,过后会从内存中删除.adddevice用于初始化设备,不会从内存中删除.有些时候感觉不到区别是因为我们的设备从开机后就没有变化.
IoCompleteRequest一般是由busdriver发出,由底向上询问栈内所有驱动是否可以结束,如果可以结束,驱动要把后面的IRP保存好,防止栈内有的驱动不能结束.只要有一个驱动不能结束,系统会发出cancelrequest,这时驱动必须能恢复. 内容实在太多,最好自己读DDK文档,上面说得很清楚. |
|
地下室#
发布于:2003-03-28 11:38
就是因为我知道这些,所以才不明白他为什么这样做
extern \"C\" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) {...... pDriverObject->DriverUnload = DriverUnload; pDriverObject->MajorFunctio[IRP_MJ_CREATE] =DispatchCreate; ....... status = CreateDevice(pDriverObject, ulDeviceNumber);--->1 .....} NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject, IN ULONG ulDeviceNumber) { .... status = IoCreateDevice(...... );------>2 pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; pDevExt->pDevice = pDevObj; ....... status = IoCreateSymbolicLink( &(UNICODE_STRING)symLinkName,---> &(UNICODE_STRING)devName ); ..... } |
|
5楼#
发布于:2003-03-28 11:39
就是因为我知道这些,所以才不明白他为什么这样做
extern \"C\" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) {...... pDriverObject->DriverUnload = DriverUnload; pDriverObject->MajorFunctio[IRP_MJ_CREATE] =DispatchCreate; ....... status = CreateDevice(pDriverObject, ulDeviceNumber);--->1 .....} NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject, IN ULONG ulDeviceNumber) { .... status = IoCreateDevice(...... );------>2 pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; pDevExt->pDevice = pDevObj; ....... status = IoCreateSymbolicLink( &(UNICODE_STRING)symLinkName,---> &(UNICODE_STRING)devName ); ..... } 没有adddevice 例程!! |
|