305 lines
7.1 KiB
C
305 lines
7.1 KiB
C
/*++
|
|
|
|
Copyright (c) 1996-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
GpcCM.c
|
|
|
|
Abstract:
|
|
|
|
Handlers called by GPC for the ClassMap address family.
|
|
|
|
Author:
|
|
|
|
Rajesh Sundaram (rajeshsu) 1st Aug, 1998.
|
|
|
|
Environment:
|
|
|
|
Kernel Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "psched.h"
|
|
#pragma hdrstop
|
|
|
|
#if CBQ
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
A new CF_INFO has been added to the GPC database.
|
|
|
|
Arguments:
|
|
|
|
ClientContext - Client context supplied to GpcRegisterClient
|
|
GpcCfInfoHandle - GPC's handle to CF_INFO
|
|
CfInfoPtr - Pointer to the CF_INFO structure
|
|
ClientCfInfoContext - Location in which to return PS's context for
|
|
CF_INFO
|
|
Return Value:
|
|
|
|
Status
|
|
|
|
--*/
|
|
|
|
GPC_STATUS
|
|
ClassMapAddCfInfoNotify(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_HANDLE GpcCfInfoHandle,
|
|
IN ULONG CfInfoSize,
|
|
IN PVOID CfInfoPtr,
|
|
IN PGPC_CLIENT_HANDLE ClientCfInfoContext
|
|
)
|
|
{
|
|
#if 0
|
|
PCF_INFO_CLASS_MAP CfInfo;
|
|
PADAPTER Adapter;
|
|
PGPC_CLIENT_VC Vc;
|
|
NDIS_STATUS Status;
|
|
PPS_WAN_LINK WanLink = 0;
|
|
PCLASS_MAP_CONTEXT_BLK pClBlk;
|
|
PPS_CLASS_MAP_CONTEXT ClassMapContext, PrevContext;
|
|
PPSI_INFO PsComponent, aPsComponent;
|
|
PPS_PIPE_CONTEXT PipeContext, aPipeContext;
|
|
|
|
CfInfo = (PCF_INFO_CLASS_MAP)CfInfoPtr;
|
|
|
|
//
|
|
// Verify that the TcObjectsLength is consistent with the
|
|
// CfInfoSize. The CfInfoSize must have been verified during
|
|
// the user/kernel transition. The TcObjectsLength has not.
|
|
// We could bugcheck if we try to search beyond the buffer
|
|
// passed in.
|
|
//
|
|
if(CfInfoSize < (FIELD_OFFSET(CF_INFO_CLASS_MAP, ClassMapInfo) +
|
|
FIELD_OFFSET(TC_CLASS_MAP_FLOW, Objects) +
|
|
CfInfo->ClassMapInfo.ObjectsLength)){
|
|
|
|
return(ERROR_TC_OBJECT_LENGTH_INVALID);
|
|
}
|
|
|
|
Adapter = FindAdapterByWmiInstanceName((USHORT) CfInfo->InstanceNameLength,
|
|
(PWSTR) &CfInfo->InstanceName[0],
|
|
&WanLink,
|
|
TRUE);
|
|
|
|
if(!Adapter) {
|
|
|
|
return GPC_STATUS_IGNORED;
|
|
}
|
|
|
|
PS_LOCK(&Adapter->Lock);
|
|
|
|
if(Adapter->PsMpState != AdapterStateRunning) {
|
|
|
|
PS_UNLOCK(&Adapter->Lock);
|
|
return NDIS_STATUS_FAILURE;
|
|
}
|
|
|
|
PS_UNLOCK(&Adapter->Lock);
|
|
|
|
//
|
|
// Create a context which will be passed back to the GPC. We should be using Lookaside Lists if
|
|
// we port CBQ and if this becomes a frequent operation. This will probably not be as frequent
|
|
// as creating VCs so we should be fine.
|
|
//
|
|
|
|
PsAllocatePool(pClBlk,
|
|
sizeof(CLASS_MAP_CONTEXT_BLK),
|
|
PsMiscTag);
|
|
|
|
if(!pClBlk)
|
|
{
|
|
return NDIS_STATUS_RESOURCES;
|
|
}
|
|
|
|
pClBlk->Adapter = Adapter;
|
|
*ClientCfInfoContext = pClBlk;
|
|
|
|
if(WanLink)
|
|
{
|
|
PsAssert(Adapter->MediaType == NdisMediumWan);
|
|
|
|
PipeContext = aPipeContext = WanLink->PsPipeContext;
|
|
PsComponent = aPsComponent = WanLink->PsComponent;
|
|
|
|
pClBlk->WanLink = WanLink;
|
|
|
|
}
|
|
else
|
|
{
|
|
PipeContext = aPipeContext = Adapter->PsPipeContext;
|
|
PsComponent = aPsComponent = Adapter->PsComponent;
|
|
pClBlk->WanLink = 0;
|
|
|
|
}
|
|
|
|
//
|
|
// Allocate space for the component's context (class map context)
|
|
// The length of the class map context buffer for this pipe was
|
|
// calculated when the pipe was initialized.
|
|
//
|
|
PsAllocatePool(pClBlk->ComponentContext,
|
|
Adapter->ClassMapContextLength,
|
|
ClassMapContextTag );
|
|
|
|
if ( pClBlk->ComponentContext == NULL ) {
|
|
ClientCfInfoContext = 0;
|
|
PsFreePool(pClBlk);
|
|
return NDIS_STATUS_RESOURCES;
|
|
}
|
|
|
|
//
|
|
// Set up the context buffer
|
|
//
|
|
ClassMapContext = (PPS_CLASS_MAP_CONTEXT)pClBlk->ComponentContext;
|
|
PrevContext = NULL;
|
|
|
|
while (PsComponent != NULL) {
|
|
|
|
ClassMapContext->NextComponentContext = (PPS_CLASS_MAP_CONTEXT)
|
|
((UINT_PTR)ClassMapContext + PsComponent->ClassMapContextLength);
|
|
ClassMapContext->PrevComponentContext = PrevContext;
|
|
|
|
PsComponent = PipeContext->NextComponent;
|
|
PipeContext = PipeContext->NextComponentContext;
|
|
|
|
PrevContext = ClassMapContext;
|
|
ClassMapContext = ClassMapContext->NextComponentContext;
|
|
}
|
|
|
|
|
|
Status = (*aPsComponent->CreateClassMap)
|
|
(aPipeContext,
|
|
ClientContext,
|
|
&CfInfo->ClassMapInfo,
|
|
pClBlk->ComponentContext);
|
|
|
|
if(Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
if(Adapter->MediaType == NdisMediumWan)
|
|
{
|
|
//
|
|
// To optimize send path
|
|
//
|
|
InterlockedIncrement(&WanLink->CfInfosInstalled);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// To optimize send path
|
|
//
|
|
InterlockedIncrement(&Adapter->CfInfosInstalled);
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
#endif
|
|
return GPC_STATUS_FAILURE;
|
|
}
|
|
|
|
GPC_STATUS
|
|
ClassMapModifyCfInfoNotify(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
|
|
IN ULONG CfInfoSize,
|
|
IN PVOID NewCfInfoPtr
|
|
)
|
|
{
|
|
return GPC_STATUS_FAILURE;
|
|
}
|
|
|
|
GPC_STATUS
|
|
ClassMapRemoveCfInfoNotify(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext
|
|
)
|
|
{
|
|
#if 0
|
|
PADAPTER Adapter;
|
|
NDIS_STATUS Status;
|
|
PCLASS_MAP_CONTEXT_BLK pCmBlk = ClientCfInfoContext;
|
|
|
|
Adapter = pCmBlk->Adapter;
|
|
|
|
if(Adapter->MediaType == NdisMediumWan)
|
|
{
|
|
//
|
|
// To optimize send path
|
|
//
|
|
InterlockedDecrement(&WanLink->CfInfosInstalled);
|
|
|
|
Status = (*pCmBlk->WanLink->PsComponent->DeleteClassMap)
|
|
(pCmBlk->WanLink->PsPipeContext,
|
|
pCmBlk->ComponentContext);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// To Optimize send path
|
|
//
|
|
InterlockedDecrement(&Adapter->CfInfosInstalled);
|
|
|
|
Status = (*Adapter->PsComponent->DeleteClassMap)
|
|
(Adapter->PsPipeContext,
|
|
pCmBlk->ComponentContext);
|
|
}
|
|
|
|
PsFreePool(pCmBlk->ComponentContext);
|
|
PsFreePool(pCmBlk);
|
|
|
|
|
|
return Status;
|
|
#endif
|
|
return GPC_STATUS_FAILURE;
|
|
}
|
|
|
|
VOID
|
|
ClassMapAddCfInfoComplete(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
|
|
IN GPC_STATUS Status
|
|
)
|
|
{
|
|
//
|
|
// The PS never adds CF_INFO's so this routine should never be called
|
|
//
|
|
DEBUGCHK;
|
|
}
|
|
|
|
VOID
|
|
ClassMapModifyCfInfoComplete(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
|
|
IN GPC_STATUS Status
|
|
)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
ClassMapRemoveCfInfoComplete(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
|
|
IN GPC_STATUS Status
|
|
)
|
|
{
|
|
}
|
|
|
|
GPC_STATUS
|
|
ClassMapClGetCfInfoName(
|
|
IN GPC_CLIENT_HANDLE ClientContext,
|
|
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
|
|
OUT PNDIS_STRING InstanceName
|
|
)
|
|
{
|
|
InstanceName->Length = 0;
|
|
return(NDIS_STATUS_SUCCESS);
|
|
}
|
|
|
|
#endif
|