SetupDiClassGuidsFromName (setupapi)
Last changed: -59.125.160.201

.
Summary
Retrieves the Class GUID for a device based on the name

C# Signature:

[DllImport("setupapi.dll", SetLastError=true)]
static extern bool SetupDiClassGuidsFromName(string ClassName, ref Guid ClassGuidList, UInt32 ClassGuidListSize, out UInt32 RequiredSize);

VB Signature:

<DllImport("setupapi.dll")> _
    Private Shared Function SetupDiClassGuidsFromName( _
    ByVal ClassName As StringBuilder, _
    ByRef ClassGuids As Guid, _
    ByVal ClassGuidSize As Integer, _
    ByRef ClassGuidRequiredSize As Integer) As Boolean
    End Function

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

    I am unsure if this declaration is correct.  The one problem that I found is that the function asks for an Array of GUIDs.  I couldn't get that to work, but just using one did work.  I found that none of the device classes had more than one GUID so I figured this to be okay.  Please correct if you know better.

10/02/2009     C# signature corrected. I didn't manage to use a real array of Guids (with one Guid works fine as reported above). So a little bit of lower-level operations as follows:
    // first check the required number of classes
    UInt32 size = 0;
    SetupDiClassGuidsFromNameEx("class name here", IntPtr.Zero, 0, out size, null, IntPtr.Zero);
    // allocate unmanaged memory - one GUID needs 16 bytes
    IntPtr ptr = Marshal.AllocHGlobal(GUID_SIZE * (int)size);
    // read guids
    SetupDiClassGuidsFromNameEx("class name here", ptr, size, out size, null, IntPtr.Zero);
    // if needed - convert to real Guids
    Guid[] guids = new Guid[(int)size];
    byte[] buffer = new byte[GUID_SIZE];
    for (int n = 0; n < size; n++)
        {
            for (int pos = 0; pos < GUID_SIZE; pos++)
            {
                buffer[pos] = Marshal.ReadByte(ptr, (n * GUID_SIZE) + pos);
                bGuids[n][pos] = buffer[pos];
            }
            guids[n] = new Guid(buffer);
        }
    }

Tips & Tricks:

Please add some!

Sample Code:

    Dim ClassName As New StringBuilder("net")
    Dim ClassGuid As Guid
    Dim GuidSize As Integer = 0
    Dim GuidReqtSize As Integer
    Dim intRtrn As Integer
    intRtrn = SetupDiClassGuidsFromName(ClassName, ClassGuid, GuidSize, GuidReqtSize)
    GuidSize = GuidReqtSize
    intRtrn = SetupDiClassGuidsFromName(ClassName, ClassGuid, GuidSize, GuidReqtSize)
    MsgBox(ClassGuid.ToString)

Documentation