3. 最简单的设备驱动程序
※ 和本章内容相关的源代码见:
KmdKit\examples\simple\Beeper
KmdKit\examples\simple\DateTime
3.1 如何编译和链接内核模式驱动程序
我总是把驱动程序的汇编源代码放到批处理文件中,这样的文件从内容上看是.asm和.bat文件的混合体,但是扩展名是.bat(注:读者在实际使用的时候是不是这样做完全可以根据个人喜好而定)
;@echo off
;goto make
.386 ; driver's code start
;::::::::::::::::::::::::::::::::
; the rest of the driver's code ;
;::::::::::::::::::::::::::::::::
end DriverEntry ; driver's code end
:make
set drv=drvname
\masm32\bin\ml /nologo /c /coff %drv%.bat
\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj
del %drv%.obj
echo.
pause
如果你运行这个”自编译”的批处理文件的话,系统会做以下的事情:
对于汇编编译器来说,前面两行的命令是被注释掉的,所以会被忽略;但是对于命令解释器来说,这两行会被执行,因为命令解释器会忽略前面的分号。这样一来,执行会跳到最后面的:make标号处,接下来下面的编译和链接命令就会被执行,跳转语句和:make标号中间的汇编源代码会被忽略。另外,对于汇编编译器来说,所有end标号后面的内容都会被忽略,所以后面的:make及其后的内容会被编译器忽略。
这种方式用起来很方便,因为源代码和如何编译、链接程序的信息都被放在一起了,如果需要的话,读者也可以自己另外加些命令上去,在我编写的所有的驱动代码中,我都使用了这种方法。
下面我来解释一下:make后面的一些命令的含义。