/*++

Copyright (c) 1994-7  Microsoft Corporation

Module Name:

    netinfp.h

Abstract:

    This file contains the structures and prototypes necessary for the
    netcard inf parser handler.

Author:

    Andy Herron (andyhe)  12-Mar-1998

Environment:

    User Mode - Win32

Revision History:

--*/

#ifndef _NETINFP_
#define _NETINFP_

#define NETINF_VENDOR_STRING    L"VEN_"
#define NETINF_REVISION_STRING  L"REV_"
#define NETINF_DEVICE_STRING    L"DEV_"
#define NETINF_IOSUBS_STRING    L"SUBSYS_"

#define NETINF_BUS_TYPE_PCI  2
#define NETINF_BUS_TYPE_ISAPNP 3

#define NETCARD_HASH_TABLE_SIZE    17

extern CRITICAL_SECTION NetInfLock;

#define RNDM_CONSTANT   314159269    /* default scrambling constant */
#define RNDM_PRIME     1000000007    /* prime number for scrambling  */

//
// Compute a string hash value that is invariant to case
//
#define COMPUTE_STRING_HASH( _pus, _phash ) {                \
    PWCHAR _p = _pus;                                        \
    ULONG _chHolder =0;                                      \
                                                             \
    while( *_p != L'\0' ) {                                  \
        _chHolder = 37 * _chHolder + (unsigned int) *(_p++); \
    }                                                        \
                                                             \
    *(_phash) = abs(RNDM_CONSTANT * _chHolder) % RNDM_PRIME; \
}

#define HASH_TO_INF_INDEX( _hash )    ((_hash) % NETCARD_HASH_TABLE_SIZE)

//
//  this is the block that we keep for every install directory that we
//  process INF files for.  We then keep the list of configurations as a list
//  off of the NetCardEntryList.
//

typedef struct _NETCARD_INF_BLOCK {

    ULONG               ReferenceCount;
    LIST_ENTRY          InfBlockEntry;      // list entry for global list

    // table of list of NETCARD_RESPONSE_DATABASE, hashed by DeviceHw string
    LIST_ENTRY          NetCardEntries[ NETCARD_HASH_TABLE_SIZE ];

    ULONG               Architecture;
    ULONG               StatusFromScan;
    PNETINF_CALLBACK    FileListCallbackFunction;
    LPVOID              FileListCallbackContext;
    CRITICAL_SECTION    Lock;
    WCHAR               InfDirectory[1];    // inf directory to search

} NETCARD_INF_BLOCK, *PNETCARD_INF_BLOCK;

//
//  NetInfGetAllNetcardInfo parses all the INF files in the given directory
//  and sets up a structure containing all the data.  Be sure to call
//  NetInfCloseNetcardInfo when you're all done with the structure.
//

ULONG
NetInfAllocateNetcardInfo (
    PWCHAR InfPath,
    ULONG Architecture,
    PNETCARD_INF_BLOCK *pNetCards
    );

//
//  This frees all resources associated with the parsing of the INF files.
//  Any entries that are in use will not be deleted until they're explicitely
//  dereferenced using NetInfDereferenceNetcardEntry.
//

ULONG
NetInfCloseNetcardInfo (
    PNETCARD_INF_BLOCK pNetCards
    );


//
//  This finds a specific driver for a given hardware description.
//  Be sure to call NetInfDereferenceNetcardEntry when you're done with the
//  entry.
//

ULONG
FindNetcardInfo (
    PNETCARD_INF_BLOCK pNetCards,
    ULONG CardInfoVersion,
    NET_CARD_INFO UNALIGNED * CardIdentity,
    PNETCARD_RESPONSE_DATABASE *pInfEntry
    );


ULONG
GetSetupLineWideText (
    PINFCONTEXT InfContext,
    HINF InfHandle,
    PWCHAR Section,
    PWCHAR Key,
    PWCHAR *String,
    PULONG SizeOfAllocation OPTIONAL
    );

ULONG
GetSetupWideTextField (
    PINFCONTEXT InfContext,
    DWORD  FieldIndex,
    PWCHAR *String,
    PULONG SizeOfAllocation OPTIONAL
    );

ULONG
GetHexValueFromHw (
    PWCHAR *String,      // this is updated.
    PULONG longValue,
    PUSHORT shortValue
    );

BOOLEAN
IsSubString (
    PWCHAR subString,
    PWCHAR target,
    BOOLEAN ignoreCase
    );

ULONG
CheckHwDescription (
    PWCHAR HardwareID
    );

ULONG
GetNetCardList (
    PNETCARD_INF_BLOCK pNetCards
    );

ULONG
ProcessInfFile (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName
    );

ULONG
ParseCardDetails (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PINFCONTEXT DeviceEnumContext
    );

ULONG
GetExtendedSectionName (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PNETCARD_RESPONSE_DATABASE pEntry
    );

ULONG
GetServiceAndDriver (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PNETCARD_RESPONSE_DATABASE pEntry
    );

ULONG
ProcessCopyFilesSubsection (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PNETCARD_RESPONSE_DATABASE pEntry,
    PWCHAR SectionToParse
    );

ULONG
GetRegistryParametersForDriver (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PNETCARD_RESPONSE_DATABASE pEntry
    );

ULONG
ProcessRegistrySubsection (
    PNETCARD_INF_BLOCK pNetCards,
    HINF InfHandle,
    PWCHAR InfFileName,
    PNETCARD_RESPONSE_DATABASE pEntry,
    PWCHAR SectionToParse
    );

VOID
DereferenceNetcardInfo (
    PNETCARD_INF_BLOCK pNetCards
    );

ULONG
CreateListOfCardIdentifiers (
    NET_CARD_INFO UNALIGNED * CardIdentity,
    PWCHAR *CardIdentifiers
    );

VOID
ConvertHexToBuffer (
    PWCHAR Buff,
    USHORT Value
    );

#endif _NETINFP_