Visual Studio 2008配置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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章