vs2008配置DDK驱动开发环境

2024-03-02 01:08

本文主要是介绍vs2008配置DDK驱动开发环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.首先下载ddk开发包

Windows DDK 3790.1830 下载

安装DDK后,去http://ddkwizard.assarbad.net/ 下载ddkwizard_setup_v1.2.0a、ddkbuild_bat.zip、ddkbuild_cmd.zip。

2.拷贝 DDKBUILD.bat 和 DDKBUILD.cmd 到DDK安装根目录,如我的是D:/WinDDK.

3.. 将上述文件(DDKBUILD.bat 和 DDKBUILD.cmd )的路径添加到系统的path变量(右击我的电脑,系统属性/高级/环境变量/系统变量/path变量双击修改值)。

4. 根据你所安装的DDK的不同版本添加不同的变量到系统变量中。

  右击我的电脑,系统属性/高级/环境变量/系统变量/新建:

  2000 DDK则变量名为: W2KBASE

  XP DDK则变量名为: WXPBASE

  2003 sp1 DDK则变量名为: WNETBASE

  这里我的是WNETBASE(值为D:/WinDDK/3790.1830)

5.启动vs2008 打开菜单中的工具——选项,弹出选项对话框。选择左边的项目和解决方案——VC++目录,在右边的显示以下内容的目录下拉列表中选择可执行文件,在下面列表框中添加上面DDKBuild.bat文件所在的路径(这里是D:/WinDDK),同样设置包含文件和库文件 如下图:

 

 

设置可执行文件

 

 

设置包含文件(D:/WINDDK/3790.1830/inc/wnet D:/WINDDK/3790.1830/inc/ddk/wnet )

 

 

设置库文件(D:/WINDDK/3790.1830/lib/wnet/i386)

 

6. 开始安装DDKWizard,在安装的最后一步你可以选择编辑ddkwizard的配置文件。

7. 现在重新打开VC2008就会发现在新建项目里面有DDK Project的选项了,里面就可以建立驱动工程来编写驱动程序了。

 

8. 验证你做的工作,你可以直接新建一个Driver工程按F7编译,编译看看。

建立EmptyDriver时,

要在sources文件的第4行TARGETTYPE=后面加DRIVER

加入[源文件]后还要在sources文件里的SOURCES=后面加上[源文件名]。比如:

SOURCES=DriverDemo.cpp /

  DriverDemo.h

VS2008集成DDKWizard遇到的问题>>>>>>>>>>>>>>>>>>>>>

————————————————————————————

▲建立EmptyDriver时,

要在sources文件的第4行TARGETTYPE=后面加DRIVER

加入[源文件]后还要在sources文件里的SOURCES=后面加上[源文件名]。比如:

SOURCES=DriverDemo.cpp /

  DriverDemo.h

▲Cannot open include file: /'NTDDK.h/': No such file or directory

解决方案:VS2005/工具/选项/VC++目录/,

[显示以下内容的目录]为[包含文件],把DDK包含文件加进目录——

[D:/WINDDK/3790.1830/inc/ddk/wnet]和[D:/WINDDK/3790.1830/inc/wnet]。

[显示以下内容的目录]为[库文件],把DDK库文件加进目录——

[D:/WINDDK/3790.1830/LIB/WNET/I386]

以上DDK的路径要放到最先。

参考自:http://blog.csdn.net/jamesandy/archive/2008/03/17/2192267.aspx

结果:

▲编译提示错误:

BufferOverflowK.lib(gs_support.obj) : error LNK2019: unresolved external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8

objchk_w2K_x86/i386/Helloworld.sys : fatal error LNK1120: 1 unresolved externals

解决方案:

把[入口函数DriverEntry]前加上extern "C":

extern "C"{

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)

{ /*DriverEntry函数内容*/ }

}//extern "C"

结果:OK。编译通过,才。我靠!终于啊!

另:据说改成.c文件也可。理论上是这样,但测试失败。

测试代码如下

// sources文件

# $Id$

TARGETNAME=HelloWorld

TARGETPATH=obj

TARGETTYPE=DRIVER

# Create browse info

#BROWSER_INFO=1

#BROWSERFILE=<some path>

# Additional defines for the C/C++ preprocessor

C_DEFINES=$(C_DEFINES)

SOURCES=HelloWorld.c

//makefile文件

#

# DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source

# file to this component. This file merely indirects to the real make file

# that is shared by all the components of the Windows NT DDK

#

!INCLUDE $(NTMAKEENV)/makefile.def

//HelloWorld.h文件

#ifndef __HELLOWORLD_H__

#define __HELLOWORLD_H__

#include <ntddk.h>

#define DEVICE_HELLO_INDEX 0x860

#define START_HELLOWORLD CTL_CODE( FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS)

#define STOP_HELLOWORLD CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS)

#define NT_DEVICE_NAME L"//Device//HelloWorld"

#define DOS_DEVICE_NAME L"//DosDevices//HelloWorld"

NTSTATUS HelloWorldDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp);

VOID HelloWorldUnload(IN PDRIVER_OBJECT DriverObject);

#endif

// HelloWorld.c文件

#ifndef __HELLOWORLD_C__

#define __HELLOWORLD_C__

#define DEBUGMSG

#include "HelloWorld.h"

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)

{

  NTSTATUS ntStatus=STATUS_SUCCESS;

  PDEVICE_OBJECT IpDeviceObject=NULL;

  UNICODE_STRING DeviceNameString;

  UNICODE_STRING DeviceLinkString;

  #ifdef DEBUGMSG

  DbgPrint("hi, Starting DriverEntry()/n");

  #endif

 

  RtlInitUnicodeString(&DeviceNameString,NT_DEVICE_NAME);

  ntStatus=IoCreateDevice(DriverObject,0,&DeviceNameString,FILE_DEVICE_UNKNOWN,0,FALSE,&IpDeviceObject);

  if(!NT_SUCCESS(ntStatus))

  {

  #ifdef DEBUGMSG

  DbgPrint("hi, Error IoCreateDevice()/n");

  #endif

  goto Error;

  }

  RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);

  ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&DeviceNameString);

  if(!NT_SUCCESS(ntStatus))

  {

  #ifdef DEBUGMSG

  DbgPrint("hi, Error IoCreateSymbolicLink()/n");

  #endif

  goto Error;

  }

  DriverObject->MajorFunction[IRP_MJ_CREATE]=HelloWorldDispatch;

  DriverObject->MajorFunction[IRP_MJ_CLOSE]=HelloWorldDispatch;

  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=HelloWorldDispatch;

  DriverObject->DriverUnload=HelloWorldUnload;

  return ntStatus;

Error:

  #ifdef DEBUGMSG

  DbgPrint("hi, Error DriverEntry()/n");

  #endif

  return ntStatus;

}

NTSTATUS HelloWorldDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp)

{

  NTSTATUS ntStatus=STATUS_SUCCESS;

  ULONG IoControlCodes=0;

  PIO_STACK_LOCATION IrpStack=NULL;

  pIrp->IoStatus.Status=STATUS_SUCCESS;

  pIrp->IoStatus.Information=0;

  #ifdef DEBUGMSG

  DbgPrint("hi, Starting HelloWorldDispatch()/n");

  #endif

  IrpStack=IoGetCurrentIrpStackLocation(pIrp);

  switch(IrpStack->MajorFunction)

  {

  case IRP_MJ_CREATE:

  #ifdef DEBUGMSG

  DbgPrint("hi, IRP_MJ_CREATE/n");

  #endif

  break;

  case IRP_MJ_CLOSE:

  #ifdef DEBUGMSG

  DbgPrint("hi, IRP_MJ_CLOSE/n");

  #endif

  break;

  case IRP_MJ_DEVICE_CONTROL:

  #ifdef DEBUGMSG

  DbgPrint("hi, IRP_MJ_DEVICE_CONTROL/n");

  #endif

  IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode;

  switch(IoControlCodes)

  {

  case START_HELLOWORLD:

  DbgPrint("hi, Starting /"Hello World /"/n");

  break;

  case STOP_HELLOWORLD:

  DbgPrint("hi, Stoping /"Hello World /"/n");

  break;

  default:

  pIrp->IoStatus.Status=STATUS_INVALID_PARAMETER;

  break;

  }

  break;

  default:

  break;

  }

  ntStatus=pIrp->IoStatus.Status;

  IoCompleteRequest(pIrp,IO_NO_INCREMENT);

  return ntStatus;

}

VOID HelloWorldUnload(IN PDRIVER_OBJECT DriverObject)

{

  UNICODE_STRING DeviceLinkString;

  PDEVICE_OBJECT DeviceObjectTemp1=NULL;

  PDEVICE_OBJECT DeviceObjectTemp2=NULL;

  #ifdef DEBUGMSG

  DbgPrint("hi,Starting HelloWorldUnload()/n");

  #endif

  RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);

  IoDeleteSymbolicLink(&DeviceLinkString);

  if(DriverObject)

  {

  DeviceObjectTemp1=DriverObject->DeviceObject;

  while(DeviceObjectTemp1)

  {

  DeviceObjectTemp2=DeviceObjectTemp1;

  DeviceObjectTemp1=DeviceObjectTemp1->NextDevice;

  IoDeleteDevice(DeviceObjectTemp2);

  }

  }

}

#endif

手动编译命令如下:

 

打开:开始/程序/……/Windows Server 2003 Checked x86 Build Environment

输入如下:

D:/WINDDK/3790~1.183>cd ..//uu

D:/WINDDK/uu>build

这篇关于vs2008配置DDK驱动开发环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764448

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推