[Kernel Driver] How to get the PDEVICE_OBJECT from another driver with just the GUID_INTERFACE_XXX

Hi,

It looks like in User Space, if you have the GUID, you can use the CM_Get_Device_Interface_List_SizeA to get it. Seems that SetupDiGetClassDevs also works, but neither of those are available on Kernel Driver. My only option seems to be using IoRegisterPlugPlayNotification, and wait for the notification. This works, I am actually using it but the key problem is that it’s only for PnP drivers, if the driver is not PnP, then how I can get it?

Thanks

Kernel drivers aren’t supposed to be doing that sort of thing.

However, to address your question, only PnP drivers can register device interfaces.

Only pnp drivers can register device interfaces, any driver can query for them. A non pnp driver can call IoRegisterPlugPlayNotification (and IoGetDeviceInterfaces) to query the currently enabled interfaces and be notified of arrivals. Once you have the interface string, you can open a file object against it and query for the PDO (query device relations, TargetDeviceRelation ). If you send the query relations, make sure to release the Ob reference on the returned PDO as that is a part of the QDR contract.