/*****************************************************************************
 * porttbl.c - WDM port class driver port table
 *****************************************************************************
 * Copyright (c) 1996-2000 Microsoft Corporation.  All rights reserved.
 *
 * 11/19/96 Dale Sather
 *
 */

#define PUT_GUIDS_HERE
#include "private.h"



extern NTSTATUS CreateMiniportMidiUart(PUNKNOWN *Unknown,               REFCLSID  ClassID,
                                       PUNKNOWN  UnknownOuter OPTIONAL, POOL_TYPE PoolType);

extern NTSTATUS CreateMiniportDMusUART(PUNKNOWN *Unknown,               REFCLSID  ClassID,
                                       PUNKNOWN  UnknownOuter OPTIONAL, POOL_TYPE PoolType);

extern NTSTATUS CreateMiniportMidiFM(  PUNKNOWN *Unknown,               REFCLSID  ClassID,
                                       PUNKNOWN  UnknownOuter OPTIONAL, POOL_TYPE PoolType);

// ==============================================================================
// MiniportDrivers
// Structures which map the miniport class ID to the create functions.
// ==============================================================================
PORT_DRIVER
MiniportDriverUart =
{
    &CLSID_MiniportDriverUart,
    CreateMiniportMidiUart
};
PORT_DRIVER
MiniportDriverDMusUART =
{
    &CLSID_MiniportDriverDMusUART,
    CreateMiniportDMusUART
};
PORT_DRIVER
MiniportDriverFmSynth =
{
    &CLSID_MiniportDriverFmSynth,
    CreateMiniportMidiFM
};
PORT_DRIVER
MiniportDriverFmSynthWithVol =
// Same as above, but for miniport that also features volume node.
// Sausage McMuffin With Egg.
{
    &CLSID_MiniportDriverFmSynthWithVol,
    CreateMiniportMidiFM
};


extern PORT_DRIVER PortDriverWaveCyclic;
extern PORT_DRIVER PortDriverWavePci;
extern PORT_DRIVER PortDriverTopology;
extern PORT_DRIVER PortDriverMidi;
extern PORT_DRIVER PortDriverDMus;


PPORT_DRIVER PortDriverTable[] =
{
    &PortDriverWaveCyclic,
    &PortDriverWavePci,
    &PortDriverTopology,
    &PortDriverMidi,
    &PortDriverDMus,
    &MiniportDriverUart,
    &MiniportDriverFmSynth,
    &MiniportDriverFmSynthWithVol,
    &MiniportDriverDMusUART
};

#pragma code_seg("PAGE")

/*****************************************************************************
 * GetClassInfo()
 *****************************************************************************
 * Get information regarding a class.
 * TODO:  Eliminate this in favor of object servers.
 */
NTSTATUS
GetClassInfo
(
	IN	REFCLSID            ClassId,
    OUT PFNCREATEINSTANCE * Create
)
{
    PAGED_CODE();

    ASSERT(Create);

    PPORT_DRIVER *  portDriver = PortDriverTable;

    for
    (
        ULONG count = SIZEOF_ARRAY(PortDriverTable);
        count--;
        portDriver++
    )
    {
        if (IsEqualGUIDAligned(ClassId,*(*portDriver)->ClassId))
        {
            *Create = (*portDriver)->Create;
            return STATUS_SUCCESS;
        }
    }

    return STATUS_NOT_FOUND;
}

#pragma code_seg()