VC实现驱动程序的开发和编译的完整步骤:
前提: 事先装好DDK编译环境,各个操作系统不同,WIN2K装WIN2K的DDK,WINXP装WINXP SP1 DDK,WIN2003装WIN2003的DDK。DDK在安装后会自动创建一个环境变量%DDKROOT%
1) 创建批处理文件 build.bat, 其代码如下:
//<--------------build.bat------------------
if "%1" == "" goto InvalidParameter
if not exist %1\bin\setenv.bat goto SetenvNotFound
call %1\bin\setenv.bat %1 %2
%3
cd %4
build
goto exit
:InvalidParameter
echo InvalidParameter.
goto exit
:SetenvNotFound
echo Can't found setenv.bat.
goto exit
:exit
//>--------------build.bat------------------
说明: %1表示DDK的安装路径,默认为%DDKROOT%,你也可以写绝对路径,如:G:\NTDDK。 %2表示编译模式,checked为DEBUG模式,free为REREASE模式。 %3 表示用来存放DDK源代码的磁盘盘符,如E:。%4 是存放DDK源代码的完整路径,如:E:\ATMP\VCPROG\DDK\DDKTest\test1
2)
执行VC并建立一个空的MakeFile工程,如图:
3)
在Debug的Command栏里输入
" build.bat %DDKROOT% checked E: E:\ATMP\VCPROG\DDK\DDKTest\test1 “
4)
在Release的Command栏里输入
" build.bat %DDKROOT% free E: E:\ATMP\VCPROG\DDK\DDKTest\test1 “
5)
创建完工程后,把第1步创建的build.bat文件copy到新建工程的目录下,本例为DDKTest。
6)
在..\test1目录下编写自己的源程序(.c ,.h )和工程文件( makefile , source )。
本例中为: MinDriver.c , MinDriver.h , MAKEFILE , Sources .
//<------------------ Sources 文件-------------------------
TARGETNAME = MinDriver
TARGETPATH = obj
TARGETTYPE = DRIVER
SOURCES = MinDriver.c
//>------------------ Sources 文件-------------------------
//<------------------ MAKEFILE 文件-------------------------
!INCLUDE $(NTMAKEENV)\makefile.def
//>------------------ MAKEFILE 文件-------------------------
//<------------------ MinDriver.h 文件-------------------------
//输出调试宏
#define DBGPRINT(Fmt) \
{ \
DbgPrint("MinDriver debug: %s(%d)", __FILE__, __LINE__ ); \
DbgPrint(Fmt); \
}
//驱动程序入口函数
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
//驱动程序卸载函数
VOID
PacketUnload(
IN PDRIVER_OBJECT DriverObject
);
//>------------------ MinDriver.h 文件-------------------------
//<------------------ MinDriver.c 文件-------------------------
#include <ndis.h>
#include "MinDriver.h"
//驱动程序入口函数
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
//输入调试信息
DBGPRINT(" DriverEntry Loading...\n" );
//指定卸载程序的函数指针,卸载程序会直接调用PacketUnload完成卸载
DriverObject->DriverUnload = PacketUnload;
return(0);
}
//驱动程序卸载函数
VOID
PacketUnload(
IN PDRIVER_OBJECT DriverObject
)
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT OldDeviceObject;
DBGPRINT("DriverEntry unLoading...\n");
//将驱动程序创建的设备保存到临时变量中
DeviceObject = DriverObject->DeviceObject;
//一个驱动程序可以创建多个设备,循环删除这个驱动程序创建的所有设备
while( DeviceObject != NULL )
{
OldDeviceObject = DeviceObject;
DeviceObject = DeviceObject->NextDevice;
IoDeleteDevice( OldDeviceObject );
}
}
//>------------------ MinDriver.c 文件-------------------------
7)
至此,用VC环境对驱动程序进行编译的过程就已经完成了。执行编译在目录\test1\objchk\i386下可以得到文件MinDriver.sys。