WDM驱动加载方式理解
2024-09-15 07:46:20
当PC得知有新设备插入时,总线驱动会创建相应的物理驱动PDO,然后提示有新设备插入,这时候调用相应Driver的AddDevice方法创建功能驱动FDO
下面是一个典型的AddDevice方法
#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
PAGED_CODE();
KdPrint(("Enter HelloWDMAddDevice\n")); NTSTATUS status;
PDEVICE_OBJECT fdo;
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyWDMDevice");
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
,
FALSE,
&fdo);
if( !NT_SUCCESS(status))
return status;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
pdx->fdo = fdo;
pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\HelloWDM"); pdx->ustrDeviceName = devName;
pdx->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName); if( !NT_SUCCESS(status))
{
IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
status = IoCreateSymbolicLink(&symLinkName,&devName);
if( !NT_SUCCESS(status))
{
return status;
}
} fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING; KdPrint(("Leave HelloWDMAddDevice\n"));
return STATUS_SUCCESS;
}
细心的人也许会觉得这个方法的第二个参数PhysicalDeviceObject,即PDO,来的有些莫名其妙,没有交代类型等
这个对象在inf可以指定它的类型,比如
ServiceType=1
最新文章
- px、dp和sp,这些单位有什么区别?
- socket编程
- javascript的实践
- 网络之OSI&;&;TCP/IP比较
- 第 6 章 贴近servlet
- 第一章 CLR的执行模型
- Android 改变标题栏的背景色
- .net平台是什么?.net平台的组成,.net平台的好处
- C++sort函数使用总结
- 让你的字ScrollView、ListView充分伸展
- 转接口IC GM7150BN/ GM7150BC:CVBS转BT656芯片 低功耗NTSC/PAL 视频解码器
- Ubuntu热键控制spotify播放和音量调节
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'user'
- ffmpeg 获得视频的时间长度, 仅仅学习一下
- node.js 从入门到。。。
- (C/C++)区别:数组与指针,指针与引用
- loadrunner基础学习笔记二
- 如何用C#动态编译、执行代码
- PostgreSQL 自动输入密码
- 13.纯 CSS 创作一个冒着热气的咖啡杯