WDM驱动程序

先说下关于WDM驱动程序一些原理。Windows2000后,微软加入了新的驱动程序模型,就是WDM。在WDM中,完成一个设备的操作,至少有两个设备共同完成。其中,一个是物理设备对象PDO,另一个是功能设备对象FDO。两者的关系是"附加"和"被附加"的关系。当PC插入某个设备时,总线驱动程序创建PDO,而设备的驱动程序创建FDO,并附加到PDO上。当FDO附加到PDO上时,PDO设备对象的子域AttachedDevice会记录FDO的位置,而FDO可以通过定义设备扩展来记录FDO下层设备,如PDO。在FDO和PDO之间还会存在过滤驱动,在FDO上的过滤驱动被称为上层过滤驱动High FiDO,而在FDO的下层过滤驱动则称为下层过滤驱动Low FiDO。下面是一个基本的WDM驱动程序结构:

 

#include "HelloWDM.h"

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
        IN PUNICODE_STRING pRegistryPath)
{
  pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
 pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
 pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
 pDriverObject->MajorFunction[IRP_MJ_CREATE] =
 pDriverObject->MajorFunction[IRP_MJ_READ] =
 pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
 pDriverObject->DriverUnload = HelloWDMUnload;

 
 return STATUS_SUCCESS;
}

 

#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)
{

......

}

 

#pragma PAGEDCODE
NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp)
{

......

}

 

#pragma PAGEDCODE
NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp)
{

......

}

 

#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{

......

}

 

#pragma PAGEDCODE
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,
         IN PIRP Irp)
{

......

}

 

#pragma PAGEDCODE
void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject)
{

......

}

 

 

简单解释下:和NT式驱动程序一样,WDM的入口函数也是DriverEntry,但是程序的初始化工作放到了AddDevice例程中,这是和NT式驱动程序不同的地方。同时,在DriverEntry中,需要设置对IRP_MJ_PNP处理的派遣函数。设置AddDevice的方式是驱动对象中有个DriverExtension子域,DriverExtension中有个AddDevice子域,该子域指向AddDevice例程的函数地址。AddDevice函数有两个输入参数,一个是驱动对象DriverObject,另一个是设备对象的PhysicalDeviceObject,驱动对象是I/O管理器创建的驱动对象,设备对象是总线驱动创建的PDO。AddDevice函数分为下面几个步骤:

1、通过IoCreateDevice等函数,创建设备对象,即FDO。

2、创建完FDO后,在设备扩展中可以将FDO的地址保存下来。

3、驱动程序将创建的FDO附加到PDO上,附加的动作依靠IoAttachDeviceToDeviceStack函数实现的。

4、设置fdo的Flags子域。

在WDM驱动中,删除设备和取消符号链接被IRP_MN_REMOVE_DEVICE IRP函数HandleRemoveDevice所负责,这个例程在HelloWDMPnp函数中设置。

1.为什么要使用海豚蓝牙音箱,能带给我什么样的音乐体验 目前市面上的蓝牙音箱基本上是一个全频段的喇叭来播放CD音质的音乐,如果是立体声的是不能通过一个喇叭来播放,无法实现空间上的立体效果,必须像漫步者的2.1级音箱一样,总共有有三个喇叭,两个卫星箱一个超重低音音箱来重现立体声,但传统的音箱体积庞大携带性比较差,于是海豚蓝牙ASIO驱动软件应运而生,解决这些让人困扰的问题。 2.使用海豚蓝牙ASIO软件有什么样的音乐体验呢? a.声音来源干净无Windows操作系统干扰,由于采用的是独占式音频通道,音频流采用的是来自于Windows的内核流,没有经过Windows的过滤器,声音采样值直接输出到声卡,声音输出比较干净未遭到破坏,满足音乐发烧友的完美音质的口味。 b.直接驱动多个蓝牙音箱实现直正的立体声效果,让您听不出来音箱放在何处,实现空间上的3D环绕效果,如果采用的蓝牙箱重低音效果不错的话,能够带给你无法语言表达的震撼效果,您可以试试播放《天之大-韩红》这首曲子。 c.适合于户外开展训练活动,您不需要携带笨重的音箱进行彩排训练,效果可以与专业级音箱相媲美,无需220V电源也可以把活动搞起来! 3. 安装必读 本版本软件是PC版本,需要安装在Windows XP/WIN7/WIN8/WIN10 操作系统上,支持主流的音乐播放软件,如百度音乐、QQ音乐、酷狗音乐、foobar2000等,只要音乐播放软件支持ASIO驱动就可以使用本软件。 硬件要求: a.适配绝大部分市面上标准音箱,像科凌的A8/A5、爱度、力勤、雅兰仕等音箱,尽量选用同款同型号音箱,否则输出延时差别较大影响音乐体验。 b.笔记本/台式机需要支持蓝牙,没有蓝牙功能可以到淘宝上购买蓝牙适配器,插在USB上即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值