Click here to Skip to main content
15,892,839 members
Articles / Programming Languages / C#

AdapterList

Rate me:
Please Sign up or sign in to vote.
2.44/5 (7 votes)
26 Sep 2008CPOL 42.9K   536   12   8
This article explains how to use the DDK interface-INetCfg in C#.

Image 1

Introduction

NetCfgTest uses the DDK interface INetCfg and related interfaces to fetch a network adapter list (installed on the system). This article describes:

  1. How to write interop code for pure COM interfaces.
  2. How to use INetCfg in C# to fetch installed network adapters.
  3. How to initialize a pure COM class from C#.

Background

There was a requirement to use the interface INetCfg in C#. I struggled to get a COM interop for this interface. Finally, I decided to write one.

Using the Code

The interface INetCfg is written in the namespace NetCfg. We can use the following source code to fetch an adapters list.:

C#
object objINetCfg = null;
int nRet = 0;
nRet = Ole32Methods.CoCreateInstance(ref INetCfg_Guid.CLSID_CNetCfg, null,
    Ole32Methods.CLSCTX_INPROC_SERVER, ref INetCfg_Guid.IID_INetCfg, out objINetCfg);
INetCfg netCfg = objINetCfg as INetCfg;
nRet = netCfg.Initialize(IntPtr.Zero);
object componet = new object();
nRet = netCfg.QueryNetCfgClass(ref INetCfg_Guid.IID_DevClassNet,
    ref INetCfg_Guid.IID_INetCfgClass, out componet);
INetCfgClass NetCfgClass = componet as INetCfgClass;
object EnumNetCfgComponentObj = new object();
nRet = NetCfgClass.EnumComponents(out EnumNetCfgComponentObj);

IEnumNetCfgComponent EnumNetCfgComponent =
    EnumNetCfgComponentObj as IEnumNetCfgComponent;
EnumNetCfgComponent.Reset();
object netCfgCompObj = new object();
INetCfgComponent netcfgcomp = null;
int outCelt = 0;
nRet = EnumNetCfgComponent.Next(1, out netCfgCompObj, out outCelt);
netcfgcomp = netCfgCompObj as INetCfgComponent;
string strBind;
string strDispName = "";
do
{
    netcfgcomp.GetBindName(out strBind);
    netcfgcomp.GetDisplayName(out strDispName);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(netcfgcomp);
    netCfgCompObj = null;
    this.listBox1.Items.Add(strDispName+" - " + strBind);
    nRet = EnumNetCfgComponent.Next(1, out netCfgCompObj, out outCelt);
    netcfgcomp = netCfgCompObj as INetCfgComponent;
    GC.Collect();
} while (nRet == 0);

System.Runtime.InteropServices.Marshal.ReleaseComObject(EnumNetCfgComponent);
EnumNetCfgComponent = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objINetCfg);
objINetCfg = null;
GC.Collect();

Points of Interest

I wrote interop for a pure COM interface for the first time. It was really interesting to learn the nitty-gritty of how to use a pure COM interface in C#.

History

  • Sep. 26, 2008: Created version 1.0.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
India India
I'm in software industry for over 10 years.

Comments and Discussions

 
QuestionGetting exception HRESULT: 0x800106D9 Pin
sudhi16421-Jun-16 20:11
sudhi16421-Jun-16 20:11 
GeneralDriver Installation Through a *.INF file [In VB.NET] [modified] Pin
emicroxxx4-Oct-10 0:41
emicroxxx4-Oct-10 0:41 
Driver Installation Through a *.INF file [In VB.NET]

If to whom it is interesting, on the basis of this example has collected such variant of
driver installation [In VB.NET]

[On 90 % its basis is taken!]
__________________________
-/ to the author of thanks
for an IT example /-

Function`s:

<DllImport("SETUPAPI.DLL", Entrypoint:="SetupCopyOEMInfW", setlasterror:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function SetupCopyOEMInf( _
            <MarshalAs(UnmanagedType.VBByRefStr)> ByRef T0 As String, _
            <MarshalAs(UnmanagedType.VBByRefStr)> ByRef OEMSouceMediaLocation As String, _
            <[In]()> ByVal OEMSourceMediaType As Integer, _
            <[In]()> ByVal CopyStyle As Integer, _
            <[Out](), [Optional]()> ByRef DestinationInfFileName As String, _
            <[In]()> ByVal DestinationInfFileNameSize As Integer, _
            <[Out](), [Optional]()> ByRef RequiredSize As Integer, _
            <[Out](), [Optional]()> ByRef DestinationInfFileNameComponent As String _
            ) As Boolean
End Function

<StructLayout(LayoutKind.Sequential)> _
Public Structure OBO_TOKEN
    <MarshalAs(UnmanagedType.I4)> _
        Public Type As Integer
    <MarshalAs(UnmanagedType.IUnknown)> _
        Public pncc As Object
    <MarshalAs(UnmanagedType.LPWStr)> _
        Public pszwManufacturer As String
    <MarshalAs(UnmanagedType.LPWStr)> _
        Public pszwProduct As String
    <MarshalAs(UnmanagedType.LPWStr)> _
        Public pszwDisplayName As String
    <MarshalAs(UnmanagedType.Bool)> _
        Public fRegistered As Boolean
End Structure


Interface`s:

<Guid("C0E8AE93-306E-11D1-AACF-00805FC1270E"), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown), _
 ComVisible(True)> _
Friend Interface INetCfg
    Function Initialize(ByVal pvReserved As System.IntPtr) As Integer
    Function Uninitialize() As Integer
    Function Apply() As Integer
    Function Cancel() As Integer
    Function EnumComponents(ByVal pguidClass As System.IntPtr, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppenumComponent As Object) As Integer
    Function FindComponent(<MarshalAs(UnmanagedType.LPWStr)> ByVal pszwInfId As String, <MarshalAs(UnmanagedType.IUnknown)> ByRef pComponent As Object) As Integer
    Function QueryNetCfgClass(ByRef pguidClass As System.Guid, ByRef riid As System.Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As Integer
End Interface

<ComImport(), _
 ComVisible(True), _
 Guid("C0E8AE9F-306E-11D1-AACF-00805FC1270E"), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface INetCfgLock
    Inherits IUnknown
    Function AcquireWriteLock(<MarshalAs(UnmanagedType.I4)> ByVal cmsTimeout As System.Int32, <MarshalAs(UnmanagedType.LPWStr)> ByVal pszwClientDescription As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal ppszwClientDescription As String) As Integer
    Function ReleaseWriteLock() As Integer
    Function IsWriteLocked(<MarshalAs(UnmanagedType.LPWStr)> ByVal ppszwClientDescription As String) As Integer
End Interface

<Guid("C0E8AE97-306E-11D1-AACF-00805FC1270E"), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown), _
 ComVisible(True)> _
Friend Interface INetCfgClass
    Function FindComponent(<MarshalAs(UnmanagedType.LPWStr)> ByVal pszwInfId As String, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppnccItem As Object) As Integer
    Function EnumComponents(<MarshalAs(UnmanagedType.IUnknown)> ByRef ppenumComponent As Object) As Integer
End Interface

<ComVisible(True), _
 Guid("C0E8AE9D-306E-11D1-AACF-00805FC1270E"), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Friend Interface INetCfgClassSetup
    Function SelectAndInstall(ByVal hwndParent As System.IntPtr, ByVal pOboToken As System.IntPtr, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppnccItem As Object) As Integer
    Function Install(<MarshalAs(UnmanagedType.LPWStr)> ByVal pszwInfId As String, ByVal pOboToken As System.IntPtr, <MarshalAs(UnmanagedType.U4)> ByVal dwSetupFlags As Integer, <MarshalAs(UnmanagedType.U4)> ByVal dwUpgradeFromBuildNo As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal pszwAnswerFile As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal pszwAnswerSections As String, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppnccItem As Object) As Integer
    Function DeInstall(<MarshalAs(UnmanagedType.IUnknown)> ByVal pComponent As Object, ByVal pOboToken As System.IntPtr, <MarshalAs(UnmanagedType.LPWStr)> ByRef pmszwRefs As String) As Integer
End Interface

<ComVisible(True), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown), _
 Guid("C0E8AE99-306E-11D1-AACF-00805FC1270E")> _
Friend Interface INetCfgComponent
    Function GetDisplayName(<MarshalAs(UnmanagedType.LPWStr)> ByRef ppszwDisplayName As String) As Integer
    Function SetDisplayName(<MarshalAs(UnmanagedType.LPWStr)> ByVal pszwDisplayName As String) As Integer
    Function GetHelpText(<MarshalAs(UnmanagedType.LPWStr)> ByRef pszwHelpText As String) As Integer
    Function GetId(<MarshalAs(UnmanagedType.LPWStr)> ByRef ppszwId As String) As Integer
    Function GetCharacteristics(<MarshalAs(UnmanagedType.U4)> ByRef pdwCharacteristics As Integer) As Integer
    Function GetInstanceGuid(ByVal pGuid As System.Guid) As Integer
    Function GetPnpDevNodeId(<MarshalAs(UnmanagedType.LPWStr)> ByRef ppszwDevNodeId As String) As Integer
    Function GetClassGuid(ByVal pGuid As System.Guid) As Integer
    Function GetBindName(<MarshalAs(UnmanagedType.LPWStr)> ByRef ppszwBindName As String) As Integer
    Function GetDeviceStatus(<MarshalAs(UnmanagedType.U4)> ByRef pulStatus As Integer) As Integer
    Function OpenParamKey(<MarshalAs(UnmanagedType.U4)> ByVal phkey As System.IntPtr) As Integer
    Function RaisePropertyUi(ByVal hwndParent As System.IntPtr, <MarshalAs(UnmanagedType.U4)> ByVal dwFlags As Integer, <MarshalAs(UnmanagedType.IUnknown)> ByVal punkContext As Object) As Integer
End Interface

<ComImport(), _
 ComVisible(False), _
 Guid("00000000-0000-0000-C000-000000000046"), _
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IUnknown
    Function QueryInterface(ByRef pguidClass As System.Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As Integer
    Function AddRef() As Integer
    Function Release() As Integer
End Interface


+

SetupCopyOEMInf(InfPath, Nothing, 1, 0, Nothing, 0, Nothing, Nothing)
'
Dim IID_INetCfg As Guid _
        = New Guid("C0E8AE93-306E-11D1-AACF-00805FC1270E") _
  , CLSID_CNetCfg As Guid _
        = New Guid("5B035261-40F9-11D1-AAEC-00805FC1270E") _
  , IID_INetCfgLock As Guid _
        = New Guid("C0E8AE9F-306E-11D1-AACF-00805FC1270E") _
  , IID_DevClassNet As Guid _
        = New Guid("4D36E972-E325-11CE-BFC1-08002BE10318") _
  , IID_INetCfgClass As Guid _
        = New Guid("C0E8AE97-306E-11D1-AACF-00805FC1270E") _
  , IID_INetCfgClassSetup As Guid _
        = New Guid("C0E8AE9D-306E-11D1-AACF-00805FC1270E") _
  , IPtr As [IntPtr] = Nothing
'
Dim NetCfg As INetCfg _
        = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CNetCfg, True)) _
  , NetCfgClassSetup As INetCfgClassSetup = Nothing _
  , NetCfgComponent As INetCfgComponent = Nothing _
  , NetCfgClass As INetCfgClass = Nothing _
  , NetCfgLock As INetCfgLock = Nothing
'
If Marshal.IsComObject(NetCfg) Then
    '
    Marshal.QueryInterface( _
            Marshal.GetIUnknownForObject(NetCfg) _
            , IID_INetCfgLock, IPtr)
    '
    NetCfgLock = Marshal.GetObjectForIUnknown(IPtr)
    '
    '-----------------
    'lock`ing network:
    '-----------------
    NetCfgLock.AcquireWriteLock(UInt64.Parse("15000"), "DRINST", Nothing)
    '
    NetCfg.Initialize(System.IntPtr.Zero)
    '
    NetCfg.QueryNetCfgClass(IID_DevClassNet, IID_INetCfgClass, NetCfgClass)
    '
    NetCfg.QueryNetCfgClass(IID_DevClassNet, IID_INetCfgClassSetup, NetCfgClassSetup)
    '
    Dim OboToken As New [OBO_TOKEN]
    OboToken.Type = 1
    IPtr = Marshal.AllocHGlobal(Marshal.SizeOf(OboToken))
    Marshal.StructureToPtr(OboToken, IPtr, True)
    NetCfgClassSetup.Install("ID", IPtr, 2, 0, Nothing, Nothing, NetCfgComponent)
    '
    NetCfg.Apply()
    '
    '-------------------
    'Unlock`ing network:
    '-------------------
    NetCfgLock.ReleaseWriteLock()
    '
End If


DRINST_INF.zip

-----------------

На†уралист™ [0QH1-512-В40201]

Thanks

modified on Sunday, October 10, 2010 6:59 PM

GeneralUsing INetCfgClassSetup Install, another null reference! Pin
Trevor Ackerman5-Apr-09 19:31
Trevor Ackerman5-Apr-09 19:31 
QuestionINetCfgLock AcquireWriteLock NullReference Exception - Help! Pin
pfrances31-Jan-09 11:30
pfrances31-Jan-09 11:30 
QuestionRe: INetCfgLock AcquireWriteLock NullReference Exception - Help! Pin
Bruins6-Jul-09 0:47
Bruins6-Jul-09 0:47 
AnswerRe: INetCfgLock AcquireWriteLock NullReference Exception - Help! Pin
Member 28749596-Jul-09 3:41
Member 28749596-Jul-09 3:41 
GeneralRe: INetCfgLock AcquireWriteLock NullReference Exception - Help! Pin
matt4274816-Nov-09 10:48
matt4274816-Nov-09 10:48 
RantCode dump Pin
Pete Souza IV26-Sep-08 7:18
professionalPete Souza IV26-Sep-08 7:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.