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

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1