📄 snmpdll.c
字号:
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 + -