• 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

  • 相关阅读:
    软件使用[17]
    软件使用[20]
    软件使用[12]
    软件使用[10]
    软件使用[22]
    软件使用[06]
    软件使用[11]SlickEdit
    软件使用[19]
    uva 10717【Mint】
    uva 10791【 Minimum Sum LCM】
  • 原文地址:https://www.cnblogs.com/swordzj/p/2034717.html
Copyright © 2020-2023  润新知