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

相关文章

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Gradle在国内配置镜像加速的实现步骤

《Gradle在国内配置镜像加速的实现步骤》在国内使用Gradle构建项目时,最大的痛点就是依赖下载贼慢,甚至卡死,下面教你如何配置国内镜像加速Gradle下载依赖,主要是通过改写repositori... 目录引言一、修改 build.gradle 或 settings.gradle 的 reposito

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件