驱动开发学习(3)

来源:互联网 发布:网络营销优化公司 编辑:程序博客网 时间:2024/04/29 08:04
 
1.增加了AddDevice
(1) 只有一个IoCreateDevice
效果:使设备管理器中的停用和卸载不能使用。(说明驱动开发响应系统的查询)
EzDriverInstaller 中的Add New Device 会调用跟据你加的设备数量会调用相同数量函数 AddDevice。如你点第三回Add New Device 时系统会连续调用三回AddDevice函数。
但是除第一回调用DriverEntry,其它几回都不会调用。
总结:DriverEntry只在加载时调用一回,向系统中插入一个可以用来识别硬件信息,并知道此硬件要调用哪个AddDevice
 
由于无法卸载所以直接删除SYS文件。下回启动 设备管理器中仍然有其驱动,只是加了“!”号,这回可以卸载了。说明,硬件信息放在了注册表中,如果系统无法从驱动程序中查询到任何信息时,就允许其停用和制裁,这也是只做了一个入口函数时,也可以卸载的原因。
(2)增加了IoAttachDeviceToDeviceStack
设备管理器中提示此设备有问题(前面加了“!” 代码为10)。
总结:说明此驱动已加入到了设备列表中,只不过因为对系统所发的查询没有任何的反应所有是一个有问题的设备。因为有问题所以可以随时停用或卸载。
2. 响应PNP 对代码还一知半解,先抄一个PNP响应。
3.  
NTSTATUS Pnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
    NTSTATUS status;
    // Remember minor function
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    ULONG MinorFunction = IrpStack->MinorFunction;
   
    // Just pass to lower driver
    IoSkipCurrentIrpStackLocation(Irp);
    //status = IoCallDriver( dx->NextStackDevice, Irp);
    //CompleteIrp(Irp,STATUS_UNSUCCESSFUL,0);
 
    // Device removed
    if( MinorFunction==IRP_MN_REMOVE_DEVICE)
    {
        // delete our fdo
        IoDeleteDevice(fdo);
        return STATUS_SUCCESS;
    }
    else
    {
        return CompleteIrp(Irp,STATUS_SUCCESS,0);
 
    }
}
增加了PNP的响应之后,安装此驱动,“!”号消失了。设备管理器中再没有显示异常,并且显示出了可以停用或卸载的菜单。说明驱动程序第一次对系统的IRP进行了响应。
但是在卸载时会使用系统崩溃(呵呵,能让系统崩溃了,有进步)。
原创粉丝点击