WDM驱动程序入门-Hello WDM - ZZ

转载 2008年10月03日 12:48:00


/***************************************************************
程序名称:Hello World for WDM                 
DDK 2000
文件名称:HelloWDM.cpp
作者:罗聪
日期:2002-8-16
***************************************************************/


//一定要的头文件,声明了函数模块和变量:
#include "HelloWDM.h"

/***************************************************************
函数名称:DriverEntry()
功能描述:WDM程序入口
***************************************************************/

//extern "C"是必须的,表示“用C链接”。如果你的文件名是HelloWDM.c的话,这句可以省略。
extern "C"
NTSTATUS DriverEntry(    IN PDRIVER_OBJECT DriverObject,
                        IN PUNICODE_STRING RegistryPath)
{
    //指定“添加设备”消息由函数“HelloWDMAddDevice()”来处理:
    DriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
    //指定“即插即用”消息由函数“HelloWDMPnp()”来处理:
    DriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;

    //返回一个NTSTATUS值STATUS_SUCCESS。几乎所有的驱动程序例程都必须返回一个NTSTATUS值,这些值在NTSTATUS.H DDK头文件中有详细的定义。
    return STATUS_SUCCESS;
}


/***************************************************************
函数名称:HelloWDMAddDevice()
功能描述:处理“添加设备”消息
***************************************************************/

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)
{
    //定义一个NTSTATUS类型的返回值:
    NTSTATUS status;
    //定义一个功能设备对象(Functional Device Object):
    PDEVICE_OBJECT fdo;

    //创建我们的功能设备对象,并储存到fdo中:
    status = IoCreateDevice(
        DriverObject,                //驱动程序对象
        sizeof(DEVICE_EXTENSION),    //要求的设备扩展的大小
        NULL,                        //设备名称,这里为NULL
        FILE_DEVICE_UNKNOWN,        //设备的类型,在标准头文件WDM.H或NTDDK.H中列出的FILE_DEVICE_xxx值之一
        0,                            //各种常量用OR组合在一起,指示可删除介质、只读等。
        FALSE,                        //如果一次只有一个线程可以访问该设备,为TRUE,否则为FALSE
        &fdo);                        //返回的设备对象

    //NT_SUCCESS宏用于测试IoCreateDevice内核是否成功完成。不要忘记检查对内核的所有调用是否成功。NT_ERROR宏不等同于!NT_SUCCESS,最好使用!NT_SUCCESS,因为除了错误外,它还截获警告信息。
    if( !NT_SUCCESS(status))
        return status;

    //创建一个设备扩展对象dx,用于存储指向fdo的指针:
    PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    dx->fdo = fdo;

    //用IoAttachDeviceToDeviceStack函数把HelloWDM设备挂接到设备栈:
    dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);

    // 设置fdo的flags。有两个“位”是必须改变的,一个是必须清除DO_DEVICE_INITIALIZING标志,如果在DriverEntry例 程中调用IoCreateDevice(),就不需要清除这个标志位。还有一个是必须设置DO_BUFFER_IO标志位:
    fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    //返回值:
    return STATUS_SUCCESS;
}


/***************************************************************
函数名称:HelloWDMPnp()
功能描述:处理“即插即用”消息
***************************************************************/

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
    //创建一个设备扩展对象dx,用于存储指向fdo的指针:
    PDEVICE_EXTENSION dx=(PDEVICE_EXTENSION)fdo->DeviceExtension;

    //首先要通过函数IoGetCurrentIrpStackLocation()得到当前的IRP,并由此得到Minor Function:
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    ULONG MinorFunction = IrpStack->MinorFunction;

    //然后把这个Minor Function传递给下一个设备栈:
    IoSkipCurrentIrpStackLocation(Irp);
    NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp);

    //处理“即插即用”次功能代码:
    //当Minor Function等于IRP_MN_REMOVE_DEVICE时,说明有设备被拔出或卸下,这时要取消资源分配并删除设备:
    if( MinorFunction==IRP_MN_REMOVE_DEVICE)
    {
        //取消设备接口:
        IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE);
        RtlFreeUnicodeString(&dx->ifSymLinkName);
        
        //调用IoDetachDevice()把fdo从设备栈中脱开:
        if (dx->NextStackDevice)
            IoDetachDevice(dx->NextStackDevice);
        //删除fdo:
        IoDeleteDevice(fdo);
    }

    //返回值:
    return status;
}



/***************************************************************
程序名称:Hello World for WDM
文件名称:HelloWDM.h
作者:罗聪
日期:2002-8-16
***************************************************************/


//头文件,只是声明一些函数和变量,比较简单就不多说了,请读者自行研究:

#ifdef __cplusplus

extern "C"
{
#endif

#include "ntddk.h"

#ifdef __cplusplus
}
#endif

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    fdo;
    PDEVICE_OBJECT    NextStackDevice;
    UNICODE_STRING    ifSymLinkName;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject);

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp);



    第一个WDM版的“Hello World”,虽然实际上它什么都没有做,但是它包含了完整的框架。

WDM驱动程序入门-Hello WDM

/一定要的头文件,声明了函数模块和变量: #include "HelloWDM.h" /****************************************************...
  • junjie1595
  • junjie1595
  • 2013年05月30日 20:09
  • 317

编写WDM驱动,如何写AddDevice例程

AddDevice例程 在前一节中,我讲述了当WDM驱动程序被第一次装入时如何初始化。通常,一个驱动程序可以被多个设备利用。WDM驱动程序有一个特殊的AddDevice函数,PnP管理器为每个设...
  • kinhum
  • kinhum
  • 2013年10月19日 02:44
  • 804

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的...
  • whatday
  • whatday
  • 2015年03月28日 15:27
  • 2756

驱动编程(一),NT - WDM - WDF 驱动概念

NT是驱动模型:NT式驱动程序模型是一种比较老式的驱动程序模型,但适用于现有的Windows系统。NT式驱动模型没有固定的形式,最简单的NT式驱动程序模型这一特点,程序开发者可以编写一个完全不支持硬件...
  • msk10k
  • msk10k
  • 2016年04月26日 16:02
  • 1455

windows 驱动开发 DDK与WDK WDM的区别

最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料。   1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要...
  • swanabin
  • swanabin
  • 2014年11月22日 14:54
  • 2116

一个简单的WDM驱动程序

1 #ifdef __cplusplus 2 extern "C" 3 { 4 #endif 5 #include // 不同点之一 6 #ifdef __cpl...
  • hellogmh
  • hellogmh
  • 2013年11月19日 01:09
  • 708

C++程序安装卸载WDM驱动

编译环境:VS2012 + WIN8 64 测试环境:VM WIN7 测试对象:WDM驱动 (sys文件 和 inf文件) 项目类型:Win32 Console Application 代码如下...
  • whatday
  • whatday
  • 2013年07月31日 21:56
  • 8616

WDM Filter 驱动的一点基础知识

By Fanxiushu ,引用和转载请注明原作者 WDM Filter是一类驱动的总称,它把自己挂载到功能设备(FDO)之下或者之上,拦截所有的IRP,对这些IRP分析处理,从而达到过滤的目的。 ...
  • fanxiushu
  • fanxiushu
  • 2013年04月22日 14:30
  • 2806

WDM 视频捕获介绍

WDM 视频捕获介绍
  • chenlycly
  • chenlycly
  • 2016年09月26日 16:26
  • 668

WDF与WDM区别 之一

from the site:http://blog.csdn.net/autumn20080101/article/details/7583716 WDF与WDM区别 之一 2010-06...
  • u014042758
  • u014042758
  • 2015年09月27日 11:00
  • 549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WDM驱动程序入门-Hello WDM - ZZ
举报原因:
原因补充:

(最多只允许输入30个字)