Debug信息不能正常显示?

sunjunjie   2008-8-4 17:54 楼主
  本人是个驱动程序的初学者,写了一个简单的NT驱动例子,在其中使用KdPrint输出一些信息,但是信息不能正常显示.
  我使用的是XP,
  使用注册表的方式在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services子键下创建一个新的子项HelloDDK,再创建上相应的键值:
  DisplayName(REG_SZ)     :HelloDDK
  ErrorControl(REG_DWORD) :0x00000000
  ImagePath(REG_EXPAND_SZ):\??\e:\MyDriver\HelloDDK.sys
  Start(REG_DWORD)        :0x00000003
  Type(REG_DWORD)         :0x00000001

  在CMD中执行:
  net start HelloDDK命令      显示服务正常启动.
  net stop HelloDDK命令       显示服务正常停止.

  还有我使用的是最新的WDK,可以在Win2008上使用的.
  是使用VS2005编译的,编译路径的设置如下:
  INCLUDE:
  C:\WinDDK\6001.18001\inc\ddk
  C:\WinDDK\6001.18001\inc\api
  (提升到了最上)
  LIB:
  C:\WinDDK\6001.18001\lib\wxp\i386
  (提升到了最上)

  以下是我的源代码, 很简单,请各位帮忙:
  头文件:

  1.   #pragma once

  2.   #include

  3.   #define PAGEDCODE code_seg("PAGE")
  4. #define LOCKEDCODE code_seg()
  5. #define INITCODE code_seg("INIT")

  6. #define PAGEDDATA data_seg("PAGE")
  7. #define LOCKEDDATA data_seg()
  8. #define INITDATA data_seg("INIT")

  9. #define arraysize(p) (sizeof(p)/sizeof((p)[0]))

  10. typedef struct _DEVICE_EXTENSION {
  11.         PDEVICE_OBJECT pDevice;
  12.         UNICODE_STRING ustrDeviceName;        //设备名称
  13.         UNICODE_STRING ustrSymLinkName;        //符号链接名
  14. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

  15. // 函数声明

  16. NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
  17. VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
  18. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
  19.                                                                  IN PIRP pIrp);

  20.   


  源文件:

  1.   #include "Driver.h"

  2. /************************************************************************
  3. * 函数名称:DriverEntry
  4. * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
  5. * 参数列表:
  6.       pDriverObject:从I/O管理器中传进来的驱动对象
  7.       pRegistryPath:驱动程序在注册表的中的路径
  8. * 返回 值:返回初始化驱动状态
  9. *************************************************************************/
  10. #pragma INITCODE
  11. extern "C" NTSTATUS DriverEntry (
  12.                         IN PDRIVER_OBJECT pDriverObject,
  13.                         IN PUNICODE_STRING pRegistryPath        )
  14. {
  15.         NTSTATUS status;
  16.         KdPrint(("Enter DriverEntry\n"));

  17.         //注册其他驱动调用函数入口
  18.         pDriverObject->DriverUnload = HelloDDKUnload;
  19.         pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  20.         pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  21.         pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  22.         pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
  23.        
  24.         //创建驱动设备对象
  25.         status = CreateDevice(pDriverObject);

  26.         KdPrint(("DriverEntry end\n"));
  27.         return status;
  28. }

  29. /************************************************************************
  30. * 函数名称:CreateDevice
  31. * 功能描述:初始化设备对象
  32. * 参数列表:
  33.       pDriverObject:从I/O管理器中传进来的驱动对象
  34. * 返回 值:返回初始化状态
  35. *************************************************************************/
  36. #pragma INITCODE
  37. NTSTATUS CreateDevice (
  38.                 IN PDRIVER_OBJECT        pDriverObject)
  39. {
  40.         NTSTATUS status;
  41.         PDEVICE_OBJECT pDevObj;
  42.         PDEVICE_EXTENSION pDevExt;
  43.        
  44.         //创建设备名称
  45.         UNICODE_STRING devName;
  46.         RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
  47.        
  48.         //创建设备
  49.         status = IoCreateDevice( pDriverObject,
  50.                                                 sizeof(DEVICE_EXTENSION),
  51.                                                 &(UNICODE_STRING)devName,
  52.                                                 FILE_DEVICE_UNKNOWN,
  53.                                                 0, TRUE,
  54.                                                 &pDevObj );
  55.         if (!NT_SUCCESS(status))
  56.                 return status;

  57.         pDevObj->Flags |= DO_BUFFERED_IO;
  58.         pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  59.         pDevExt->pDevice = pDevObj;
  60.         pDevExt->ustrDeviceName = devName;
  61.         //创建符号链接
  62.         UNICODE_STRING symLinkName;
  63.         RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
  64.         pDevExt->ustrSymLinkName = symLinkName;
  65.         status = IoCreateSymbolicLink( &symLinkName,&devName );
  66.         if (!NT_SUCCESS(status))
  67.         {
  68.                 IoDeleteDevice( pDevObj );
  69.                 return status;
  70.         }
  71.         return STATUS_SUCCESS;
  72. }

  73. /************************************************************************
  74. * 函数名称:HelloDDKUnload
  75. * 功能描述:负责驱动程序的卸载操作
  76. * 参数列表:
  77.       pDriverObject:驱动对象
  78. * 返回 值:返回状态
  79. *************************************************************************/
  80. #pragma PAGEDCODE
  81. VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
  82. {
  83.         PDEVICE_OBJECT        pNextObj;
  84.         KdPrint(("Enter DriverUnload\n"));
  85.         pNextObj = pDriverObject->DeviceObject;
  86.         while (pNextObj != NULL)
  87.         {
  88.                 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
  89.                         pNextObj->DeviceExtension;

  90.                 //删除符号链接
  91.                 UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
  92.                 IoDeleteSymbolicLink(&pLinkName);
  93.                 pNextObj = pNextObj->NextDevice;
  94.                 IoDeleteDevice( pDevExt->pDevice );
  95.         }
  96. }

  97. /************************************************************************
  98. * 函数名称:HelloDDKDispatchRoutine
  99. * 功能描述:对读IRP进行处理
  100. * 参数列表:
  101.       pDevObj:功能设备对象
  102.       pIrp:从IO请求包
  103. * 返回 值:返回状态
  104. *************************************************************************/
  105. #pragma PAGEDCODE
  106. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
  107.                                                                  IN PIRP pIrp)
  108. {
  109.         //OutputDebugString(L"AAAAAAAAAAAAAAAAAA");
  110.         KdPrint(("Enter HelloDDKDispatchRoutine\n"));
  111.         NTSTATUS status = STATUS_SUCCESS;
  112.         // 完成IRP
  113.         pIrp->IoStatus.Status = status;
  114.         pIrp->IoStatus.Information = 0;        // bytes xfered
  115.         IoCompleteRequest( pIrp, IO_NO_INCREMENT );
  116.         KdPrint(("Leave HelloDDKDispatchRoutine\n"));
  117.         return status;
  118. }

  

回复评论 (4)

  对了,我使用的是DEBUGVIEW工具来查看输出信息的.
点赞  2008-8-4 17:55
生成的是checked版本吗?如果是free版本就不会有调试输出。
点赞  2008-8-4 21:57
  是Checked版本的.
点赞  2008-8-5 08:43
  问题解决,这100分给你了,嘿嘿!
点赞  2008-8-6 11:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复