鱼C论坛

 找回密码
 立即注册
查看: 2204|回复: 0

一个WDM驱动开发框架

[复制链接]
发表于 2015-3-31 16:11:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是我起初学习WDM的时候的一个驱动开发框架。分享之。。。。。
  1. #include "DriverWDM.h"

  2. #pragma INITCODE
  3. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING RegistryPath)
  4. {
  5.         NTSTATUS status;
  6.         KdPrint(("enter DriverEntry\n"));

  7.         pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
  8.         pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
  9.         pDriverObject->MajorFunction[IRP_MJ_CREATE] =
  10.         pDriverObject->MajorFunction[IRP_MJ_READ] =
  11.         pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  12. }

  13. NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT pDriverObject,IN PDEVICE_OBJECT pPhysicalDeviceObject)
  14. {
  15.         PAGED_CODE();
  16.         KdPrint(("Enter HelloWDMAddDevice\n"));
  17.         UNICODE_STRING devName;                //设备名字
  18.         NTSTATUS status        ;
  19.         PDEVICE_OBJECT fdo;        //功能设备对象
  20.         PDEVICE_EXTENSION pdx;        //设备扩展

  21.         RtlInitUnicodeString(&devName,L"\\Device\\MyWDMDevice");
  22.         status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN,0,false,&fdo);
  23.         //判断是否成功创建设备
  24.         if(!NT_SUCCESS(status))
  25.         {
  26.                 return status;
  27.         }

  28.         //得到设备扩展,然后填充它
  29.         pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
  30.         pdx->fdo = fdo;

  31.         UNICODE_STRING symLinkName;
  32.         RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\HelloWDM");
  33.         status = IoCreateSymbolicLink(&symLinkName,&devName);

  34.         //如果创建符号连接失败。则进行相应的删除操作
  35.         if (!NT_SUCCESS(status))
  36.         {
  37.                 //再一次创建符号连接
  38.                 IoDeleteSymbolicLink(&symLinkName);
  39.                 status = IoCreateSymbolicLink(&symLinkName,&devName);
  40.                 if(!NTSTATUS(status))
  41.                 {
  42.                         return status;
  43.                 }
  44.         }

  45.         //在设备扩展中记录设备的符号名字和设备名字
  46.         pdx->ustrSymLinkName = symLinkName;
  47.         pdx->ustrDeviceName = devName;

  48.         //设置设备标志
  49.         fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
  50.         fdo->Flags &= ~DO_DEVICE_INITIALIZING;

  51.         KdPrint(("leave HelloWDMDevice\n"));
  52.         return STATUS_SUCCESS;

  53. }
复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-6 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表