//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1999.
//
//  File:       C O M P D E F S . H
//
//  Contents:   Basic component related defintions.
//
//  Notes:
//
//  Author:     shaunco   15 Jan 1999
//
//----------------------------------------------------------------------------

#pragma once
#include "netcfgx.h"


// Maximum length (arbitrary) for bind strings.
// Bind strings are of the form \Device\foo_bar_...
//
const UINT _MAX_BIND_LENGTH = 512;


// A property of a component is its "Class".  This corresponds directly
// to the concept of Class exposed by SetupAPI.  That is, devices of all
// kinds belong to a class.  There are five basic network classes:
//   Net        : network adapters or software drivers that usually reside
//                at layer 2 or below.
//   Irda       : represent Infra-red networking devices (layer 2)
//   Nettrans   : network transports (protocols like TCP/IP, IPX, etc.)
//   Netservice : network services (File & Print, QOS, NetBIOS, etc.)
//   Netclient  : network clients (Client for Microsoft Networks, etc.)
//
enum NETCLASS
{
    NC_NET,
    NC_INFRARED,
    NC_NETTRANS,
    NC_NETCLIENT,
    NC_NETSERVICE,

    NC_CELEMS,      // count of elements in this enum, not an item
    NC_INVALID      // sentinel value for an invalid class, not an item
};

// map of NETCLASS enum to GUIDs for class
//
extern const GUID*  MAP_NETCLASS_TO_GUID[];

// map of NETCLASS enum to registry subkey strings for class
//
extern const PCWSTR MAP_NETCLASS_TO_NETWORK_SUBTREE[];

extern const WCHAR c_szTempNetcfgStorageForUninstalledEnumeratedComponent[];

inline
BOOL
FIsValidNetClass (
    NETCLASS Class)
{
    return ((UINT)Class < NC_CELEMS);
}

inline
BOOL
FIsConsideredNetClass (
    NETCLASS Class)
{
    AssertH (FIsValidNetClass (Class));

    return (NC_NET == Class || NC_INFRARED == Class);
}

inline
BOOL
FIsEnumerated (
    NETCLASS Class)
{
    AssertH (FIsValidNetClass (Class));

    // Currently, NC_NET and NC_INFRARED must be enumerated and they
    // are the only ones that are.
    //
    return (NC_NET == Class || NC_INFRARED == Class);
}

inline
BOOL
FIsEnumerated (
    const GUID& guidClass)
{
    // Currently, NET and INFRARED must be enumerated and they
    // are the only ones that are.
    //
    return (GUID_DEVCLASS_NET == guidClass ||
            GUID_DEVCLASS_INFRARED == guidClass);
}


inline
BOOL
FIsPhysicalAdapter (
    NETCLASS Class,
    DWORD dwCharacteristics)
{
    return FIsConsideredNetClass(Class) && (NCF_PHYSICAL & dwCharacteristics);
}

inline
BOOL
FIsPhysicalNetAdapter (
    NETCLASS Class,
    DWORD dwCharacteristics)
{
    return (NC_NET == Class) && (NCF_PHYSICAL & dwCharacteristics);
}

NETCLASS
NetClassEnumFromGuid (
    const GUID& guidClass);



// BASIC_COMPONENT_DATA is a structure used by code which
// creates a CComponent.  It is present just to avoid passing
// bunches of parameters to a function.
//
struct BASIC_COMPONENT_DATA
{
    GUID        InstanceGuid;
    NETCLASS    Class;
    DWORD       dwCharacter;
    DWORD       dwDeipFlags;
    PCWSTR      pszInfId;
    PCWSTR      pszPnpId;
};

HRESULT
HrOpenDeviceInfo (
    IN NETCLASS Class,
    IN PCWSTR pszPnpId,
    OUT HDEVINFO* phdiOut,
    OUT SP_DEVINFO_DATA* pdeidOut);

HRESULT
HrOpenComponentInstanceKey (
    IN NETCLASS Class,
    IN const GUID& InstanceGuid, OPTIONAL
    IN PCWSTR pszPnpId, OPTIONAL
    IN REGSAM samDesired,
    OUT HKEY* phkey,
    OUT HDEVINFO* phdiOut OPTIONAL,
    OUT SP_DEVINFO_DATA* pdeidOut OPTIONAL);