port_factory.c

来自「这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统」· C语言 代码 · 共 73 行

C
73
字号
/*
    ReactOS Operating System
    Port Class API / Port Factory

    by Andrew Greenwood
*/

#define INITGUID

#include "private.h"
#include <portcls.h>
#include <ks.h>
#include <kcom.h>
#include "port.h"

/*
 * @unimplemented
 */
PORTCLASSAPI NTSTATUS NTAPI
PcNewPort(
    OUT PPORT* OutPort,
    IN  REFCLSID ClassId)
{
    /*
        ClassId can be one of the following:
        CLSID_PortDMus -> IPortDMus (dmusicks.h)    -- TODO
        CLSID_PortMidi -> IPortMidi
        CLSID_PortTopology -> IPortTopology
        CLSID_PortWaveCyclic -> IPortWaveCyclic
        CLSID_PortWavePci -> IPortWavePci

        TODO: What about PortWavePciStream?
    */

    PPORT new_port = NULL;
    NTSTATUS status = STATUS_UNSUCCESSFUL;

    if ( ! OutPort )
    {
        DPRINT("PcNewPort was supplied a NULL OutPort parameter\n");
        return STATUS_INVALID_PARAMETER;
    }

    if ( ( IsEqualGUIDAligned(ClassId, &CLSID_PortMidi)         ) ||
         ( IsEqualGUIDAligned(ClassId, &CLSID_PortTopology)     ) ||
         ( IsEqualGUIDAligned(ClassId, &CLSID_PortWaveCyclic)   ) ||
         ( IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci)      ) )
    {
        DPRINT("Calling KoCreateInstance\n");
        /* Call KS.SYS's Kernel-mode COM function */
        status = KoCreateInstance(ClassId, NULL, CLSCTX_KERNEL_SERVER, &IID_IPort, &new_port);
    }
    else
    {

        DPRINT("PcNewPort received a CLSID it does not deal with\n");
        status = STATUS_NOT_SUPPORTED;
    }

    /* If an unsupported CLSID was handed to us, or the creation failed, we fail */
    if ( status != STATUS_SUCCESS )
    {
        return status;
    }

    /* Fill the caller's PPORT* to point to the new port */
    *OutPort = new_port;

    DPRINT("PcNewPort succeeded\n");

    return STATUS_SUCCESS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?