驱动程序(5) WDF下DMA传输的驱动程序代码详细说明之device.c

本文深入探讨了在device.c中如何枚举设备,分配和映射PCIe设备的内存资源(BARs),并详细阐述了中断资源的配置,特别是针对MSI中断的问题。代码示例展示了如何使用WDF进行硬件准备和释放,以及自定义中断处理流程。
摘要由CSDN通过智能技术生成

这一篇文章说明了在device.c文件里,驱动程序怎样枚举设备,然后获得设备资源,并将其显示出来供开发者使用。

device.c

/*++
Module Name: device.c - Device handling events for example driver.
Abstract: This file contains the device entry points and callbacks, sucn as EvtDevicePrepareHardware and EvtDeviceReleaseHardware function.
Environment: Kernel-mode Driver Framework
Time: 20181015
--*/

#include "driver.h"
//#pragma warning(disable:4013)
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, PCIe_EvtDevicePrepareHardware)
#pragma alloc_text(PAGE, PCIe_EvtDeviceReleaseHardware)
#endif

NTSTATUS
PCIe_EvtDevicePrepareHardware(
	IN WDFDEVICE Device,
	IN WDFCMRESLIST ResourceList,
	IN WDFCMRESLIST ResourceListTranslated
)
{
   
	ULONG i;
	PDEVICE_CONTEXT pDeviceContext;             //设备上下文结构体的句柄
	PCM_PARTIAL_RESOURCE_DESCRIPTOR descriptor; //设备资源描述符
	PINTERRUPT_CONTEXT pInterruptContext;    //中断上下文结构体的句柄
	NTSTATUS status;
	PAGED_CODE();

 	KdPrintEx((DPFLTR_IHVAUDIO_ID, DPFLTR_ERROR_LEVEL, "Function 'PCIe_EvtDevicePrepareHardware' begins\n"));
	pDeviceContext = GetDeviceContext(Device);
	pDeviceContext->MemBaseAddress0 = NULL;
	pDeviceContext->MemBaseAddress1 = NULL;
	pDeviceContext->MemBaseAddress2 = NULL;

	pDeviceContext->Counter_i = 0;

	for (i = 0; i < WdfCmResourceListGetCount(ResourceListTranslated); i++) {
   
		
		KdPrintEx((DPFLTR_IHVAUDIO_ID, DPFLTR_ERROR_LEVEL, "i is %0d\n", i));
		//获取到设备资源描述符
		descriptor = WdfCmResourceListGetDescriptor(ResourceListTranslated, i);
		if (!descriptor) {
   
			return STATUS_DEVICE_CONFIGURATION_ERROR;
		}
		
		//根据不同类型,将设备资源描述符转化为开发者可用的类型,这里主要用到了memory和interrupt两种资源
		switch (descriptor->Type) 
		{
   
		case CmResourceTypeMemory:
			if (i == 0) {
   
				//获取到设备存储资源的物理地址
				pDeviceContext->PhysicalAddressRegister0 = descriptor->u.Memory.Start.LowPart;
				//获取到设备存储资源在系统内核模式下的虚拟地址(后续对于寄存器的访问也将用到这个地址)
				pDeviceContext->MemBaseAddress0 = MmMapIoSpace(
					descriptor->u.Memory.Start,
					descriptor->u.Memory.Length,
					MmNonCached);
				if (!pDeviceContext->MemBaseAddress0) {
   
					return STATUS_INSUF
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值