记录下 初次接触驱动开发的过程 及碰到的问题
来源:互联网 发布:云计算到底是什么 编辑:程序博客网 时间:2024/05/28 18:43
安装 步骤
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 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义
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 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义
- 记录下 初次接触驱动开发的过程 及碰到的问题
- 驱动开发中碰到的一些问题笔记记录一下
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 初次接触easyUI的记录贴
- 刚接触android开发时碰到的一些问题
- java开发中碰到的问题记录
- java开发中碰到的问题记录
- hive sql 开发过程碰到的问题
- 初次使用PermissionsDispatcher碰到的问题
- 记录一下使用百度Ueditor副编辑器的过程及碰到的问题
- 关于初次接触电离层的一些问题
- 接触Android Studio以来碰到的问题
- GNOME3介绍与使用技巧
- java多线程同步
- 数据库范式那些事
- 【VC编程技巧】文件☞2.1EOF的误区
- VS2010与.NET4系列 19.ASP.NET4中新的HTML编码的<%: %>语法
- 记录下 初次接触驱动开发的过程 及碰到的问题
- Emacs 基本命令整理
- Box2D 碰撞过滤规则
- 搜狗笔试题
- 页面置换、作业调度、进程调度小剖析
- 为页面上某些文本框添加离开验证输入事件
- 霍夫曼编码(Huffman Coding)
- 手机定位的总结代码
- 数据库的简单架构