CM_Get_DevNode_Registry_Property (setupapi)
Last changed: gustavo.mori@gmail.com-131.107.160.29

.
Summary
The CM_Get_DevNode_Registry_Property function retrieves a specified device property from the registry.

C# Signature:

[DllImport("setupapi.dll", SetLastError=true)]
public static extern int CM_Get_DevNode_Registry_Property(
  uint dnDevInst,
  uint ulProperty,
  out Microsoft.Win32.RegistryValueKind pulRegDataType,
  IntPtr Buffer,
  ref uint pulLength,
  uint ulFlags);

VB Signature:

Declare Function CM_Get_DevNode_Registry_Property Lib "setupapi.dll" (TODO) As TODO

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

In most cases you can use SetupDiGetDeviceRegistryProperty.

Also Microsoft.Win32.RegistryValueKind only contains enumerations for the basic kinds.

MSDN
This function is reserved for system use. Do not use this function in your class installers, co-installers, or device installation applications. Use device installation functions instead.

Tips & Tricks:

Please add some!

Sample Code:

// 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);
   }
}

Documentation