DXGKDDI_ADD_DEVICE
DxgkDdiAddDevice 函数用于创建图形适配器的上下文,该函数返回的句柄代表了图形适配器。
Syntax
DXGKDDI_ADD_DEVICE DxgkddiAddDevice;
NTSTATUS DxgkddiAddDevice(
IN_CONST_PDEVICE_OBJECT PhysicalDeviceObject,
OUT_PPVOID MiniportDeviceContext
)
{...}
Parameters
IN_CONST_PDEVICE_OBJECT PhysicalDeviceObject
代表着图形适配器的物理设备对象(PDO)的指针。
OUT_PPVOID MiniportDeviceContext
这个输出指针变量用于接收KMD创建的代表着PDO标识的图形适配器的句柄。KMD可以返回NULL,表示KMD不支持PDO标识的图形适配器。
Return Value
如果成功DxgkDdiAddDevice返回STATUS_SUCCESS;否则返回Ntstatus.h中的一个错误码。
Remarks
DxgkDdiAddDevice 函数中,由KMD分配了关联PDO标识的图形适配器的私有上下文数据块。你可以将MiniportDeviceContext 参数返回的句柄看作是操作图形适配器的句柄或者是一个和图形适配器相关联的上下文数据块。DXGK(Dxgkrnl.sys)将在之后的一系列调用中提供这个句柄给KMD。一下列出几个例子展示了Dxgkrnl.sys的不同模块调用KMD实现的几个DDI函数,并将创建的这个句柄作为传输传递。
- 显示端口驱动提供MiniportDeviceContext中的句柄作为参数调用DxgkDdiStartDevice函数。
- VidPN提供hAdapter 中的句柄作为参数调用DxgkDdiIsSupportedVidPn 函数。
- DXG coret提供hAdapter 中的句柄作为参数调用DxgkDdiQueryAdapterInfo 函数。
不要因为句柄有时取名叫MiniportDeviceContext 而有时叫hAdapter而迷惑。同样的道理也不要因为将句柄取名为hDevice作为传参到指定的显示小端口驱动中的方法而迷惑(PS: 句柄的名称可以叫MiniportDeviceContext,hAdapter,hDevice 其实都是在DxgkDdiAddDevice中创建的这个句柄)。
某些显示适配器卡拥有两个或多个扮演显示适配器的PCI功能。例如,某些旧卡通过给每个View使用独立的PCI功能来实现多个View。这种类型的显示端口驱动会为每一个PCI功能都调用一次DxgkDdiAddDevice函数,在每次调用中KMD能够指定是否支持该PCI功能(设置MiniportDeviceContext 不为空为支持,NULL为不支持)。KMD能够通过传参PhysicalDeviceObject 给 IoGetDeviceProperty函数来获取特定的PCI功能。
在 DxgkDdiRemoveDevice,需要释放所有在DxgkDdiAddDevice中所分配的资源和上下文数据块。
DxgkDdiAddDevice这个函数应该放在可分页内存中。