又一个礼拜过去了,终于把Windows驱动开发技术详解看完了,前半部分还好,看的认真,也还算顺利,后面几章就有点模糊了,嘛~ 以后用的到的时候再回头来看吧~
我想请教一下,驱动可以通过哪些方法加载到内核中运行。
书中介绍了NT驱动 是通过SCM组件,以服务的方式加载驱动,这是一个办法,还有其他的吗?
书中介绍了WDM驱动是通过手动安装驱动,就是那个 找到新的硬件向导, 我想问有没有办法通过编程的手段实现驱动的自动加载,因为类似杀毒软件一类的软件不可能让用户自己去安装驱动吧.
谢谢
WDM驱动可以使用setupapi来加载,代码参见:
http://bbs.pediy.com/showthread.php?t=101270
我是这本书的作者张帆,这本书后半部分写的的确有些仓促。
关于WDM加载可以参考DDK中的例子C:\WINDDK\6000\src\setup\devcon
我建了个驱动开发群,QQ群:49944346。希望一起交流。
加群了,是真的啊 哇考,激动不已。。
后面看的模糊有3方面原因啦,1是我不是那么特别感兴趣USB驱动之类的,2是我看的确实不够详细,3嘛我功底还很弱啦
书是好书啊
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这些方式来加载内核驱动~!
还是服务保险些`!~!~!呵呵~
没看明白你是要加载还是安装。
如果要让驱动程序在系统启动后自动加载,在安装时将驱动程序的启动方式(注册表中的Start值,CreateService的dwStartType参数,两者相同)设置为适当的值即可。如果要使用应用程序加载驱动,建议用StartService。
我是做嵌入式系统中的驱动的,开始迷迷糊糊,现在还是迷迷糊糊。共勉吧。