关于驱动加载的几种方式,请教!

micjevons   2010-6-7 13:04 楼主
又一个礼拜过去了,终于把Windows驱动开发技术详解看完了,前半部分还好,看的认真,也还算顺利,后面几章就有点模糊了,嘛~ 以后用的到的时候再回头来看吧~


我想请教一下,驱动可以通过哪些方法加载到内核中运行。

书中介绍了NT驱动 是通过SCM组件,以服务的方式加载驱动,这是一个办法,还有其他的吗?


书中介绍了WDM驱动是通过手动安装驱动,就是那个 找到新的硬件向导, 我想问有没有办法通过编程的手段实现驱动的自动加载,因为类似杀毒软件一类的软件不可能让用户自己去安装驱动吧.


谢谢

回复评论 (8)

无非就是修改注册表,复制驱动文件的操作。
点赞  2010-6-7 13:20
WDM驱动可以使用setupapi来加载,代码参见:
http://bbs.pediy.com/showthread.php?t=101270
点赞  2010-6-7 13:23
我是这本书的作者张帆,这本书后半部分写的的确有些仓促。
关于WDM加载可以参考DDK中的例子C:\WINDDK\6000\src\setup\devcon

我建了个驱动开发群,QQ群:49944346。希望一起交流。
点赞  2010-6-7 13:24
真是作者? 真的假的?
点赞  2010-6-7 13:31
加群了,是真的啊  哇考,激动不已。。


后面看的模糊有3方面原因啦,1是我不是那么特别感兴趣USB驱动之类的,2是我看的确实不够详细,3嘛我功底还很弱啦  


书是好书啊
点赞  2010-6-7 13:40
load_sysfile()
{
        SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;

        WCHAR daPath[] = L"\\??\\D:\\kernel.SYS";

        //////////////////////////////////////////////////////////////
        // get DLL entry points
        //////////////////////////////////////////////////////////////
        if(        !(RtlInitUnicodeString = (RTLINITUNICODESTRING)
                        GetProcAddress( GetModuleHandle("ntdll.dll")
                        ,"RtlInitUnicodeString"
                        )))
        {
                return false;
        }

        if(!(ZwSetSystemInformation = (ZWSETSYSTEMINFORMATION)       
                                GetProcAddress(
                                        GetModuleHandle("ntdll.dll")
                                        ,"ZwSetSystemInformation" )))
        {
                return false;
        }

        RtlInitUnicodeString(
                &(GregsImage.ModuleName)
                ,daPath
        );

        if(
                !NT_SUCCESS(
                        ZwSetSystemInformation(
                                SystemLoadAndCallImage
                                ,&GregsImage
                                ,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE))))
        {
                return false;
        }

        return true;
}

还可以这样
将全部代码拷贝至非分页内存中,不推荐此法加载内核驱动
当然还可以通过ZwLoadDriver,ZwSetSystemInformation这些方式来加载内核驱动~!
还是服务保险些`!~!~!呵呵~
点赞  2010-6-7 22:29
没看明白你是要加载还是安装。
如果要让驱动程序在系统启动后自动加载,在安装时将驱动程序的启动方式(注册表中的Start值,CreateService的dwStartType参数,两者相同)设置为适当的值即可。如果要使用应用程序加载驱动,建议用StartService。
点赞  2010-6-8 01:23
我是做嵌入式系统中的驱动的,开始迷迷糊糊,现在还是迷迷糊糊。共勉吧。
点赞  2010-6-8 08:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复