window 显示驱动开发-处理 E_INVALIDARG 返回值

通常,用户模式显示驱动程序不能通过返回E_INVALIDARG来使任何函数失败。 但是,如果用户模式显示驱动程序由于驱动程序中的编程错误或操作系统 () 中运行的恶意代码而调用 Microsoft Direct3D 运行时提供的函数 之一时收到E_INVALIDARG返回值,则驱动程序必须在运行时调用其中一个驱动程序函数后,将E_INVALIDARG返回到 Direct3D 运行时。 否则,用户模式显示驱动程序绝不应将E_INVALIDARG返回到 Direct3D 运行时。

1. 核心规则

  • 禁止主动返回 E_INVALIDARG

用户模式驱动(UMD)不得在任何函数中主动返回 E_INVALIDARG,即使参数明显无效(如 NULL 指针、越界值)。

例外:仅当 Direct3D 运行时本身返回 E_INVALIDARG 时,UMD 可传递此错误。

  • 必须传递运行时返回的 E_INVALIDARG

如果 UMD 调用运行时提供的回调函数(如 pfnAllocateCb)时收到 E_INVALIDARG,必须将错误 原样返回 给运行时。

2. 适用场景与示例

(1) 合法传递 E_INVALIDARG 的场景

复制代码
HRESULT APIENTRY CreateResource(
    D3D10DDI_HDEVICE hDevice,
    CONST D3D10DDIARG_CREATERESOURCE* pArgs
) {
    // 调用运行时提供的函数
    HRESULT hr = pDeviceFuncs->pfnAllocateCb(hDevice, &allocInfo);
    if (hr == E_INVALIDARG) {
        return hr; // 必须传递运行时的E_INVALIDARG
    }
    // 其他错误处理...
}

(2) 禁止返回 E_INVALIDARG 的场景

复制代码
HRESULT APIENTRY SetVertexShader(
    D3D10DDI_HDEVICE hDevice,
    D3D10DDI_HSHADER hShader
) {
    if (hShader == NULL) {
        // 错误!即使参数无效,也不能返回E_INVALIDARG
        return S_OK; // 应静默处理或返回其他错误(如E_FAIL)
    }
}

3. 设计原理

  • 安全性优先:防止恶意代码利用驱动返回的 E_INVALIDARG 探测系统漏洞。
  • 稳定性保障:避免应用因参数检查不严而崩溃。
  • 调试友好性:强制驱动内部处理无效参数,而非依赖运行时拦截。

4. 异常情况处理

若驱动因自身逻辑错误或恶意代码触发 E_INVALIDARG:

  • 记录错误日志:通过 ETW 或调试输出标记异常。
  • 安全降级:返回 E_FAIL 或 S_OK(视场景而定)。
  • 断言调试:在 Debug 版本中触发断言(如 ASSERT(FALSE))。

示例:

复制代码
HRESULT HandleMaliciousCall() {
    if (IsMaliciousInput()) {
        DebugPrint("警告:检测到恶意参数");
        return E_FAIL; // 避免返回E_INVALIDARG
    }
    return S_OK;
}

5. WHCK 认证要求

测试项 验证目标 测试方法
Device.Graphics.UMD.InvalidArgHandling 驱动是否违规返回 E_INVALIDARG 注入无效参数调用所有 DDI 函数。
Device.Graphics.UMD.ErrorPropagation 运行时返回的 E_INVALIDARG 是否正确传递。 模拟运行时返回 E_INVALIDARG

6. 开发者注意事项

  • 参数验证:即使不返回 E_INVALIDARG,仍需验证参数安全性(如指针解引用前检查 NULL)。
  • 错误替代方案:使用 E_FAIL、E_OUTOFMEMORY 或 E_NOTIMPL 替代 E_INVALIDARG。
  • 测试覆盖:使用 WEX 工具测试非法参数场景。

7. 总结

绝对禁止:UMD 主动返回 E_INVALIDARG(除非传递运行时的错误)。

安全实践:对无效参数静默处理或返回非特异性错误。

认证关键:违反此规则将导致 WHCK 测试失败。

相关推荐
TE-茶叶蛋1 天前
Spec-Driven Development(规范驱动开发)
驱动开发
云栖梦泽2 天前
Camera驱动开发与应用开发中的零拷贝与DMA
linux·驱动开发·嵌入式硬件
脱胎换骨-军哥2 天前
C++ 嵌入式编程实例:从寄存器操作到底层驱动开发
开发语言·c++·驱动开发
智者知已应修善业2 天前
【使用D触发器74HC175实现0001 0011 0111 1111 1110 1100 1000的循环彩灯电路。】2025-4-28
驱动开发·经验分享·笔记·硬件架构·硬件工程
新元代码3 天前
SDD+TDD 双驱动开发模式实战指南
驱动开发
mk0154 天前
20V输入,12V 3A输出 效率96%DCDC降压芯片
驱动开发·单片机·硬件工程·智能硬件·pcb工艺
mounter6254 天前
跨越鸿沟:从内核驱动开发到超大规模云端生产环境的思考
linux·驱动开发·linux kernel·kernel
Saniffer_SH5 天前
NAND技术(二):从 Channel、Die/LUN、P/E Cycle 到 LDPC,一次讲透 NAND 里那些最容易误解的概念
人工智能·驱动开发·嵌入式硬件·测试工具·fpga开发·计算机外设·压力测试
2401_854151555 天前
嵌入式传感器驱动开发深度解析——从 I2C/SPI 驱动到数据融合算法
驱动开发·算法
Bug退散师5 天前
多路IO复用[select版TCP服务器与poll版TCP服务器]与常用网络编程函数详解
linux·服务器·c语言·网络·驱动开发·tcp/ip