NTSTATUS
EVT_WDF_DEVICE_PREPARE_HARDWARE(
__in
WDFDEVICE Device,
__in
WDFCMRESLIST ResourcesRaw,
__in
WDFCMRESLIST ResourcesTranslated
);
上面API中ResourcesRaw和ResourcesTranslated类型相同,那他们的区别是啥?
答:
EVT_WDF_DEVICE_PREPARE_HARDWARE
是 WDF (Windows Driver Framework) 中的一个回调函数,用于为设备准备硬件。在这个回调函数中,ResourcesRaw
和 ResourcesTranslated
是两个参数,它们的区别在于处理的资源列表的不同阶段。
-
ResourcesRaw
: 这个参数包含设备的原始硬件资源列表。原始资源列表表示设备被分配的物理资源,这可能包括 I/O 端口、内存区域、中断等。这个列表中的资源是在系统分配硬件资源之前的资源分配情况。因此,它反映了操作系统在分配设备资源之前为设备分配的初始资源。 -
ResourcesTranslated
: 这个参数包含设备的翻译后硬件资源列表。翻译后的资源列表表示设备在系统中实际使用的资源,经过了操作系统的翻译和重映射。这可能包括操作系统根据设备描述符进行的中断翻译、地址重映射等。翻译后的资源列表是设备在运行时实际使用的资源。
在 EVT_WDF_DEVICE_PREPARE_HARDWARE
回调函数中,驱动程序通常需要检查并使用这两个资源列表中的信息来配置设备,准备设备在系统中的运行环境。由于 ResourcesTranslated
反映了实际运行时使用的资源,通常驱动程序会更关心这个列表,因为它反映了系统在运行时为设备提供的实际硬件资源。
UINT32 dev_parse_hw_irq(WDFCMRESLIST resources)
{
// Parse the resource list and save the resource information.
PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;
for(UINT32 i = 0; i < WdfCmResourceListGetCount(resources); ++i) {
desc = WdfCmResourceListGetDescriptor(resources, i);
if(!desc) {
trace(("WdfResourceCmGetDescriptor failed"));
break;
}
if(desc->Type == CmResourceTypeInterrupt) {
// MSI Interrupt
if (desc->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {
can_trace(("MSI interrupt number: 0x%x", desc->u.MessageInterrupt.Translated.Vector));
return desc->u.MessageInterrupt.Translated.Vector;
} else { // Legacy Interrupt
trace(("Legacy interrupt number: 0x%x", desc->u.Interrupt.Level));
return desc->u.Interrupt.Level;
}
}
}
return -1;
}
下面说明 设备管理器–资源 页签中IRQ的值
此处显示的值为ResourceRaw中的值,是真实的硬件IRQ,没有经过OS翻译映射的
ResourceXlated中也有同样的IRQ,这是经过oS翻译后映射的,也是OS实际使用的IRQ,是Vector,中断向量
原文地址:https://blog.csdn.net/Wang_anna/article/details/134878808
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_50997.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!