驱动学习笔记一:实现一个简单的HelloDriver

枉被人叫了这么久的驱动大牛,实际上驱动差的要命,哈哈。现在来补习下驱动知识,写个笔记,反正在学校里也算是个学习的过程吧。以下代码均在VC2008 + WDK2008下编译通过。至于DDK和选择的工具什么的我也不知道怎么说,反正现在可供选择的东西还有详细配置的教程还是比较多的,所以我就不再赘述了。我就直接跳过那些配置文章,直接从代码开始说起吧。至于逆向或者分析bug,这些可能我在文章里就完全不会涉及了…毕竟这个算是我的本行出身,哈哈。另外文中代码使用了C++语言而不是常见的C语言,因为有时候会想用到C++特性而故意为之,当然,做个c版本也是可以的事情。好在两者改写起来并不算十分复杂。

头文件Driver.h:

  1. #pragma once
  2. #ifdef __cplusplus
  3. extern "C"
  4. {
  5. #endif
  6. #include <NTDDK.h>
  7. #ifdef __cplusplus
  8. }
  9. #endif 
  10. #define PAGEDCODE code_seg("PAGE")
  11. #define LOCKEDCODE code_seg()
  12. #define INITCODE code_seg("INIT")
  13. #define PAGEDDATA data_seg("PAGE")
  14. #define LOCKEDDATA data_seg()
  15. #define INITDATA data_seg("INIT")
  16. #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
  17. typedef struct _DEVICE_EXTENSION {
  18.     PDEVICE_OBJECT pDevice;
  19.     UNICODE_STRING ustrDeviceName;  //设备名称
  20.     UNICODE_STRING ustrSymLinkName; //符号链接名
  21. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  22. // 函数声明
  23. NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
  24. VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
  25. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
  26.                                  IN PIRP pIrp);

Driver.cpp:

  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.     KdPrint(("Enter HelloDDKDispatchRoutine/n"));
  110.     NTSTATUS status = STATUS_SUCCESS;
  111.     // 完成IRP
  112.     pIrp->IoStatus.Status = status;
  113.     pIrp->IoStatus.Information = 0; // bytes xfered
  114.     IoCompleteRequest( pIrp, IO_NO_INCREMENT );
  115.     KdPrint(("Leave HelloDDKDispatchRoutine/n"));
  116.     return status;
  117. }

build之后的结果如下:

driver

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值