[DllImport("setupapi.dll", SetLastError=true)]
public static extern int CM_Get_DevNode_Registry_Property(
uint deviceInstance,
uint property,
out Microsoft.Win32.RegistryValueKind pulRegDataType,
IntPtr buffer,
ref uint length,
uint flags);
Declare Function CM_Get_DevNode_Registry_Property Lib "setupapi.dll" (TODO) As TODO
deviceInstance, A caller-supplied device instance handle that is bound to the local machine.
property, A CM_DRP_-prefixed constant value that identifies the device property to be obtained from the registry. These constants are defined in Cfgmgr32.h.
pulRegDataType, Optional, can be NULL. A pointer to a location that receives the registry data type, specified as a REG_-prefixed constant defined in Winnt.h.
buffer, Optional, can be NULL. A pointer to a caller-supplied buffer that receives the requested device property. If this value is NULL, the function supplies only the length of the requested data in the address pointed to by pulLength.
length, A pointer to a ULONG variable into which the function stores the length, in bytes, of the requested device property. If the Buffer parameter is set to NULL, the ULONG variable must be set to zero. If the Buffer parameter is not set to NULL, the ULONG variable must be set to the length, in bytes, of the caller-supplied buffer.
flags, Not used, must be zero.
None.
Do you know one? Please contribute it!
In most cases you can use SetupDiGetDeviceRegistryProperty.
Also Microsoft.Win32.RegistryValueKind only contains enumerations for the basic kinds.
Please add some!
// The following code shows how to grab the parent device's driver name. The devinfo_data.DevInst is
// from SetupDiEnumDeviceInterfaces and SetupDiGetDeviceInterfaceDetail so please see those examples
string driver_name;
uint parent;
if (CR_SUCCESS == CM_Get_Parent(out parent, devinfo_data.DevInst, 0))
{
Microsoft.Win32.RegistryValueKind kind;
uint length = 0;
CM_Get_DevNode_Registry_Property(devinst, CM_DRP_DRIVER, out kind, IntPtr.Zero, ref length, 0);
if (length > 0)
{
IntPtr buffer = Marshal.AllocHGlobal((int)length);
if (CR_SUCCESS == CM_Get_DevNode_Registry_Property(devinst, CM_DRP_DRIVER, out kind, buffer, ref length, 0))
driver_name = Marshal.PtrToStringAnsi(buffer);
Marshal.FreeHGlobal(buffer);
}
}