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

安装 步骤
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 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值