/*++ 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