现在的位置: 首页 > 综合 > 正文

记录下 初次接触驱动开发的过程 及碰到的问题

2013年01月07日 ⁄ 综合 ⁄ 共 2310字 ⁄ 字号 评论关闭

安装 步骤
1  安装vs2008
2 安装 msdn
3 安装 winxp_ddk_3790_1830.iso
4 xp下配置环境变量WXPBASE=ddk根目录
5 vs2008下 工具--选项-项目解决方案-vc++目录
   可执行文件【自动找配置的目录下的bin目录】 添加 ddk根目录 F:\WINDDK\3790.1830
   包含文件【即要包含的头文件 也就是定义】 添加F:\WINDDK\3790.1830\inc\ddk\wxp ,F:\WINDDK\3790.1830\inc\wxp 这两个目录 前面的根目录为你安装的目录
   引用文件【记头文件中定义的方法的实现】 添加F:\WINDDK\3790.1830\lib\wxp\i386   前面的根目录为你安装的目录

6 安装ddkwizard_setup_v1.3.0a.exe
双击程序运行 安装完毕
拷贝 ddkbuild.cmd 和 ddkbuild.bat文件到 你的ddk根目录 这两个文件也是ddkwizard_setup_v1.3.0a.exe 下载的时候一并下下来的 搜索一下

这样全部安装完毕
打开vs2008  vc++下超级 驱动工程
新建好工程后 在 souce file目录下 创建 firstDriver.c
修改special file下的 SOURCES
改成你的代码文件 如下

SOURCES=firstDriver.c \
        drvversion.rc

firstDriver.c代码如下 本人写的第一个驱动  基本理解流程 作为记录
#include <ntddk.h>
#include <string.h>
typedef struct _DEVICE_EXTENT{
UNICODE_STRING symoName;
} *PDEVICE_EXTENT;
void DDK_UNLOAD(PDRIVER_OBJECT obj);
NTSTATUS createFirstDevice(PDRIVER_OBJECT obj){
NTSTATUS status;
UNICODE_STRING deviceName;
UNICODE_STRING linkName;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENT de;
RtlInitUnicodeString(&deviceName,L"\\Device\\MyFirstDevide1");
status=IoCreateDevice(obj,sizeof(PDEVICE_EXTENT),&deviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj);
if(!NT_SUCCESS(status)>0){
if(status==STATUS_INSUFFICIENT_RESOURCES){
DbgPrint("资源不足");
}
if(status==STATUS_OBJECT_NAME_EXISTS){
DbgPrint("对象名称已存在");
}
if(status==STATUS_OBJECT_NAME_COLLISION){
DbgPrint("资源冲突");
}
return status;
}

DbgPrint("创建设备成功");
RtlInitUnicodeString(&linkName,L"\\??\\MyFirstLink1");
status=IoCreateSymbolicLink(&linkName,&deviceName);
if(!NT_SUCCESS(status)){
DbgPrint("创建设备链接失败");
IoDeleteDevice(pDevObj);

return status;
}
de=(PDEVICE_EXTENT)pDevObj->DeviceExtension;
de->symoName=linkName;

DbgPrint("创建设备链接成功");
return STATUS_SUCCESS;

}
NTSTATUS DriverEntry(PDRIVER_OBJECT obj,PUNICODE_STRING str){
   DbgPrint("驱动被加载了+++++++++饺子");
   createFirstDevice(obj);
   obj->DriverUnload=DDK_UNLOAD;
   return (1);
}
void DDK_UNLOAD(PDRIVER_OBJECT obj){
PDEVICE_EXTENT de;
PDEVICE_OBJECT curDevice;
PDEVICE_OBJECT deviceObj=obj->DeviceObject;
UNICODE_STRING tmpLikName;
    WCHAR*  abb;
while(deviceObj!=NULL){
        de=(PDEVICE_EXTENT)deviceObj->DeviceExtension;
tmpLikName=de->symoName;
abb =(WCHAR* )tmpLikName.Buffer;
DbgPrint("卸载链接成功%s",abb);
IoDeleteSymbolicLink(&tmpLikName);
  

curDevice=deviceObj;
deviceObj=deviceObj->NextDevice;
DbgPrint("卸载设备成功");
   IoDeleteDevice(curDevice);

}

DbgPrint("驱动被卸载了--------饺子");
}

作为一个初学者 我总结了三点 问题 有高手解释下
1 一句语句需要换行必须 带有/
2 文件名必须是.c后缀 不然一大堆错误
3 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义

抱歉!评论已关闭.