⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpdll.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 2 页
字号:
    if(res)
        return FALSE;
    /*
        h341 mib subtrees, subAgent module supports.
    */
    subtrees = h341AgentGetSubTrees(hAgent,&size);
    supportedView->ids = subtrees[0].id;
    supportedView->idLength = subtrees[0].length;
    count++;


    *hPollForTrapEvent=NULL;


    /*
        Create mapped file to pass data between subagent and instance
    */
    GetTempPath (256, szTmpFile);
    GetTempFileName (szTmpFile,"PW",0,szMMFile);
    hFile =CreateFile (szMMFile,GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_WRITE | FILE_SHARE_READ,
        &sa,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_TEMPORARY,NULL);

    if(hFile==INVALID_HANDLE_VALUE)
        return FALSE;
    mmhFile = CreateFileMapping (hFile,
        &sa,
        PAGE_READWRITE,
        0,
        2048,
        "AgentInstComm");


    if (mmhFile==NULL)
        return FALSE;


    lpMapAddress = MapViewOfFile(mmhFile,FILE_MAP_ALL_ACCESS,0,0,0);




    if (lpMapAddress == NULL)
        return FALSE;
    /*
        Create event for waiting notifications from instances
        (registrations,global parameters changes)
    */
    hEventWait = CreateEvent(&sa,FALSE,FALSE,"AgentInstWait");
    if (hEventWait==NULL)
        return FALSE;
    _beginthreadex(NULL,0,theStackThread, NULL,0,NULL);

    return TRUE;

} // end SnmpExtensionInit()






LRESULT RVCALLCONV
h341AgentWnd(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_REGISTER_SUBAG:  /* send message */
        {
            h341AgentRegT * reg;
            char s[20];
            int index,ii;

            for (ii = 0;ii< INSTANCE_NUMBER;ii++)
            {
                if ((instReg[ii].h341SubAgentId==0)||(instReg[ii].h341SubAgentId==(h341SubAgentIdT)lParam))
                {
                    reg = &instReg[ii];
                    /*instance builds unique name for waiting request event,using
                    thread id ,create event and sends thread id as lParam
                    to ex agent. Ex agent,using lParam, creates name , opens
                    corresponding event, and stores event handle and registered
                    instance thread id for following communication with instance
                    */
                    instReg[ii].h341SubAgentId = lParam;
                    sprintf(s,"AgentNtf%d",lParam);
                    reg->h341SubAgentHandle = (h341SubAgentHandleT)OpenEvent(EVENT_ALL_ACCESS,RV_FALSE,s);
					/* get an index - instance number */
                    index= h341AgentRegister( hAgent,(h341RegisterHandleT)reg );
                    reg->h341SubAgentIndex = index;
	               /* pass index (instance number) to instance.
					The index is placed in the second 4 bytes of the mapped file  
				    */
					*(int *)((char *)lpMapAddress + 4)= index;
					SetEvent(reg->h341SubAgentHandle);

                    return index;
                }
            }
            return 0;

        }
    case WM_UNREGISTER_SUBAG:
        {
            char s[20];
            int ii;
            HANDLE unregEv;
            for (ii = 0;ii< INSTANCE_NUMBER;ii++)
            {
                if ((LPARAM)instReg[ii].h341SubAgentId==lParam)
                {
                    /*
                        close handle to waiting request event of
                        unregistered instance
                    */
                    instReg[ii].h341SubAgentId = 0;
                    sprintf(s,"AgentNtf%d",lParam);
                    CloseHandle((HANDLE)instReg[ii].h341SubAgentHandle);
                    if (instReg[ii].h341SubAgentIndex)
                        h341AgentUnRegister( hAgent,(int)instReg[ii].h341SubAgentIndex );
                    instReg[ii].h341SubAgentIndex=0;
                }
            }

            /*
                    Ex agent,using lParam, creates name for instance wating unregistration
                    notification event, opens  corresponding event and notify
                    instance about unregistration.
            */

            sprintf(s,"unreg%d",lParam);
            unregEv = OpenEvent(EVENT_ALL_ACCESS,FALSE,s);
            SetEvent(unregEv);
            CloseHandle(unregEv);

        }

        break;
    case WM_CHANGE_GLOBAL:
        /*
            Get notification that global parameter was changed.
        */
        h341AgentChangeGlobals(hAgent,(h341ParameterName)lParam,(int)wParam);
        break;
    default:return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    return 1l;
}


/*
 SnmpExtensionQuery is called by NT SNMP service upon receiving request from the
 network.This function translates perameters and passes  request to the
 RV snmp subagent module.
*/

BOOL WINAPI SnmpExtensionQuery(
                               IN BYTE                   requestType,
                               IN OUT RFC1157VarBindList *variableBindings,
                               OUT AsnInteger            *errorStatus,
                               OUT AsnInteger            *errorIndex)
{
    unsigned ii;
    AsnObjectIdentifier  temp;
    int nid[RequestNumber][MAX_ID_SIZE];
    *errorStatus = SNMP_ERRORSTATUS_NOERROR;

    if (requestType == SNMP_PDU_GETNEXT)
    {
        int res;
        snmpObjectT oidMr[RequestNumber],oidMrNext[RequestNumber];
        h341ErrorT error[RequestNumber];
        char buffer[4096];
        int offset=0;

        if (variableBindings->len > RequestNumber )
        {
            *errorStatus = SNMP_ERRORSTATUS_GENERR;
            *errorIndex=0;
            return FALSE;
        }

        for (ii=0;ii<variableBindings->len;ii++)
        {
            oidMr[ii].id = variableBindings->list[ii].name.ids;
            oidMr[ii].length = variableBindings->list[ii].name.idLength;

            oidMrNext[ii].id = &nid[ii][0];
            oidMrNext[ii].data.value=buffer+offset;
            oidMrNext[ii].data.valueSize=100;

            offset+=100;
        }
        *errorIndex = RequestNumber;

        res = h341AgentGetNext(hAgent,oidMr,oidMrNext,error,variableBindings->len);
        if (res)
        {
            *errorStatus = SNMP_ERRORSTATUS_GENERR;
            *errorIndex=0;
            return TRUE;
        }
        for (ii=0;ii<variableBindings->len;ii++)
        {
            if (!error[ii])
            {
                temp.ids = oidMrNext[ii].id;
                temp.idLength = oidMrNext[ii].length;
                SnmpUtilOidFree( &variableBindings->list[ii].name );
                SnmpUtilOidAppend( &variableBindings->list[ii].name, &temp );
                if ((oidMrNext[ii].data.type==asnMibOctetString)||
                    (oidMrNext[ii].data.type==asnAddressString))
                {
                    variableBindings->list[ii].value.asnValue.string.length = oidMrNext[ii].data.valueSize;
                    variableBindings->list[ii].value.asnValue.string.dynamic = RV_FALSE;
                    variableBindings->list[ii].value.asnValue.string.stream=NULL;
                    if (oidMrNext[ii].data.type==asnMibOctetString)
                        variableBindings->list[ii].value.asnType=ASN_OCTETSTRING;
                    else
                        variableBindings->list[ii].value.asnType=ASN_IPADDRESS;
                    if (oidMrNext[ii].data.valueSize)
                    {
                        variableBindings->list[ii].value.asnValue.string.stream= SnmpUtilMemAlloc(oidMrNext[ii].data.valueSize);
                        if (variableBindings->list[ii].value.asnValue.string.stream!=NULL)
                        {
                            memcpy(variableBindings->list[ii].value.asnValue.string.stream,oidMrNext[ii].data.value,
                            oidMrNext[ii].data.valueSize);
                            variableBindings->list[ii].value.asnValue.string.dynamic = RV_TRUE;
                        }
                    }

                }
                else if (oidMrNext[ii].data.type==asnInt)
                {
                    variableBindings->list[ii].value.asnValue.number = oidMrNext[ii].data.valueSize;
                    variableBindings->list[ii].value.asnType=ASN_INTEGER;
                }
            }
            else
            {
                if (error[ii]==outOfMibRc)
                    *errorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
                else
                    *errorStatus =SNMP_ERRORSTATUS_GENERR;
                *errorIndex = ii;
                break;
            }
        }
        return TRUE;
    }
    if (requestType == SNMP_PDU_GET)
    {
        snmpObjectT oidMr[ RequestNumber];
        h341ErrorT error[RequestNumber];
        char buffer[4096];
        int offset=0;
        if (variableBindings->len > RequestNumber )
        {
            *errorStatus = SNMP_ERRORSTATUS_GENERR;
            *errorIndex=0;
            return FALSE;
        }
        for (ii=0;ii<variableBindings->len;ii++)
        {
            oidMr[ii].id = variableBindings->list[ii].name.ids;
            oidMr[ii].length = variableBindings->list[ii].name.idLength;
            oidMr[ii].data.value=buffer+offset;
            oidMr[ii].data.valueSize=100;
            offset+=100;
        }
        if (!h341AgentGetValue( hAgent,oidMr,  error,variableBindings->len))
        {
            for (ii=0;ii<variableBindings->len;ii++)
            {
                if (!error[ii])
                {
                    if ((oidMr[ii].data.type==asnMibOctetString)||
                        (oidMr[ii].data.type==asnAddressString))

                    {
                        variableBindings->list[ii].value.asnValue.string.length = oidMr[ii].data.valueSize;
                        variableBindings->list[ii].value.asnValue.string.stream=NULL;
                        if (oidMr[ii].data.type==asnMibOctetString)
                            variableBindings->list[ii].value.asnType=ASN_OCTETSTRING;
                        else
                            variableBindings->list[ii].value.asnType=ASN_IPADDRESS;

                        variableBindings->list[ii].value.asnValue.string.dynamic = RV_FALSE;
                        if (oidMr[ii].data.valueSize)
                        {

                            variableBindings->list[ii].value.asnValue.string.stream= SnmpUtilMemAlloc(oidMr[ii].data.valueSize);
                            if (variableBindings->list[ii].value.asnValue.string.stream!=NULL)
                            {
                                memcpy(variableBindings->list[ii].value.asnValue.string.stream,oidMr[ii].data.value,
                                oidMr[ii].data.valueSize);
                                variableBindings->list[ii].value.asnValue.string.dynamic = RV_TRUE;
                            }
                        }

                    }
                    else if (oidMr[ii].data.type==asnInt)
                    {
                        variableBindings->list[ii].value.asnValue.number = oidMr[ii].data.valueSize;
                        variableBindings->list[ii].value.asnType=ASN_INTEGER;
                    }
                }
                else
                {
                    *errorStatus =SNMP_ERRORSTATUS_GENERR;
                    *errorIndex = ii;
                    break;
                }
            }


        }
        return TRUE;
    }
    if (requestType == SNMP_PDU_SET)
    {
        snmpObjectT oid;
        h341ErrorT error;
        mibDataT  data;
        if (variableBindings->len > 1 )
        {
            *errorStatus = SNMP_ERRORSTATUS_GENERR;
            *errorIndex=0;
            return FALSE;
        }
        oid.id = variableBindings->list[0].name.ids;
        oid.length = variableBindings->list[0].name.idLength;

        winData2mibData(&variableBindings->list[0].value,&data);
        error =  h341AgentSetValue(  hAgent,&oid,&data);
        if (error)
        {
            *errorStatus = SNMP_ERRORSTATUS_GENERR;
            *errorIndex=0;

        }
        return TRUE;
    }

    return FALSE;

 }



BOOL WINAPI SnmpExtensionTrap(
                              OUT AsnObjectIdentifier *enterprise,
                              OUT AsnInteger          *genericTrap,
                              OUT AsnInteger          *specificTrap,
                              OUT AsnTimeticks        *timeStamp,
                              OUT RFC1157VarBindList  *variableBindings)
{
    return FALSE;
}

⌨️ 快捷键说明

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