Benutzer mit den meisten Antworten
Abbruch meiner MFC-SDI Anwendung unter Windows Server 2012 R2 Standard

Frage
-
Hallo an alle,
ich habe einen Abbruch mit meiner MFC-SDI Anwendung, wenn diese unter Windows Server 2012 R2 Standard installiert ist. Ohne Probleme funktioniert meine Anwendung, wenn sie unter Windows 7, Windows 10 und Windows Server 2008 installiert ist. Da meine bisherigen Informationen/Kenntnisse zur Behebung des Abbruch nicht ausreichen, habe ich in Absprache mit meinem Kollegen (Server-Admin) mein aktuelles Microsoft Visual Studio 2019 Professional auf dem Server installiert. Seweit ich es dadurch beurteilen kann, liegt es an einer Klasse, die ich vor viele Jahren aus dem Internet übernommen habe. Diese reserviert Speicher (new) und beim Freigeben (delete) entsteht der Abbruch. Beim Befüllen der Felder und bei der Einhaltung der maximalen Größen konnte ich keinen Fehler finden. Es könnte etwas mit der Datei ntdll.dll zu haben. Ich komme aber leider mit einer Lösung nicht weiter
Hier die Meldung beim Abbruch:Hier der Inhalt der CPP-Datei:
/************************************************************************/ /* Copyright (C) Stas Khirman 1998. All rights reserved. */ /* Written by Stas Khirman (staskh@rocketmail.com). */ /* and */ /* Raz Galili (razgalili@hotmail.com) */ /* */ /* Free software: no warranty; use anywhere is ok; spread the */ /* sources; note any modifications; share variations and */ /* derivatives (including sending to staskh@rocketmail.com). */ /* */ /************************************************************************/ #include <stdafx.h> #include <winsock.h> #include "MibAccess.h" MibExtLoad::MibExtLoad() { m_Init = NULL; m_InitEx = NULL; m_Query = NULL; m_Trap = NULL; m_hInst = LoadLibrary(_T("inetmib1.dll")); if(m_hInst < (HINSTANCE) HINSTANCE_ERROR){ m_hInst = NULL; return; } m_Init = (pSnmpExtensionInit)GetProcAddress(m_hInst ,"SnmpExtensionInit"); m_InitEx= (pSnmpExtensionInitEx)GetProcAddress(m_hInst ,"SnmpExtensionInitEx"); m_Query = (pSnmpExtensionQuery)GetProcAddress(m_hInst ,"SnmpExtensionQuery"); m_Trap = (pSnmpExtensionTrap)GetProcAddress(m_hInst ,"SnmpExtensionTrap"); } MibExtLoad::~MibExtLoad() { if (m_hInst) FreeLibrary( m_hInst ); m_hInst = NULL; } BOOL MibExtLoad::Init(DWORD dwTimeZeroReference,HANDLE *hPollForTrapEvent,AsnObjectIdentifier *supportedView) { if(m_hInst && m_Init) return m_Init(dwTimeZeroReference,hPollForTrapEvent,supportedView); return FALSE; } BOOL MibExtLoad::InitEx(AsnObjectIdentifier *supportedView) { if(m_hInst && m_InitEx) return m_InitEx(supportedView); return FALSE; } BOOL MibExtLoad::Query(BYTE requestType,OUT RFC1157VarBindList *variableBindings, AsnInteger *errorStatus,AsnInteger *errorIndex) { if(m_hInst && m_Query) return m_Query(requestType,variableBindings,errorStatus,errorIndex); return FALSE; } BOOL MibExtLoad::Trap(AsnObjectIdentifier *enterprise, AsnInteger *genericTrap, AsnInteger *specificTrap, AsnTimeticks *timeStamp, RFC1157VarBindList *variableBindings) { if(m_hInst && m_Trap) return m_Trap(enterprise, genericTrap,specificTrap, timeStamp, variableBindings); return FALSE; } MibII::MibII():MibExtLoad() { WSADATA wsa; int err; err = WSAStartup( 0x0101, &wsa ); } MibII::~MibII() { WSACleanup(); } BOOL MibII::Init() { HANDLE PollForTrapEvent; AsnObjectIdentifier SupportedView; return MibExtLoad::Init(GetTickCount(),&PollForTrapEvent,&SupportedView); } int MibII::MIB_GetIPAddress(DWORD *MIB_Array,int max_addresses, BOOL bShowLoopbackAddress) { UINT OID_ipAdEntAddr[] = { 1, 3, 6, 1, 2, 1, 4 , 20, 1 ,1 }; AsnObjectIdentifier MIB_ipAdEntAddr = { sizeof(OID_ipAdEntAddr)/sizeof(UINT), OID_ipAdEntAddr }; RFC1157VarBindList varBindList; RFC1157VarBind varBind[1]; AsnInteger errorStatus; AsnInteger errorIndex; AsnObjectIdentifier MIB_NULL = {0,0}; BOOL Exit; int ret; int IpCount=0; DWORD dtmp; BYTE a1,a2,a3,a4; varBindList.list = varBind; varBindList.len = 1; varBind[0].name = MIB_NULL; SNMP_oidcpy(&varBind[0].name,&MIB_ipAdEntAddr); Exit = FALSE; IpCount=0; while(!Exit){ ret = Query(ASN_RFC1157_GETNEXTREQUEST,&varBindList,&errorStatus,&errorIndex); if(!ret) Exit=TRUE; else{ ret = SNMP_oidncmp(&varBind[0].name,&MIB_ipAdEntAddr,MIB_ipAdEntAddr.idLength); if(ret!=0){ Exit=TRUE; } else { dtmp = *((DWORD *)varBind[0].value.asnValue.address.stream); if (dtmp!=0) { // Octets in returned IP addresses are in reverse order a1=(BYTE)((dtmp>>24) & 0xFF); a2=(BYTE)((dtmp>>16) & 0xFF); a3=(BYTE)((dtmp>>8) & 0xFF); a4=(BYTE)(dtmp & 0xFF); if ((a4!=127) && (a4!=0)) { *MIB_Array = (a4<<24) + (a3<<16) + (a2<<8) + a1; *MIB_Array++; IpCount++; } else { if (bShowLoopbackAddress) { *MIB_Array = (a4<<24) + (a3<<16) + (a2<<8) + a1; *MIB_Array++; IpCount++; }; }; }; if(IpCount>=max_addresses) Exit = TRUE; } } } SNMP_FreeVarBind(&varBind[0]); return IpCount; } UINT MibII::GetNICCount(BOOL bDialup, BOOL bLoopback) { #define NUM_VARBIND_LIST 9 // SNMP interface for # of NIC Entries. UINT OID_ifNumEntries[] = {1, 3, 6, 1, 2, 1, 2, 1}; AsnObjectIdentifier MIB_ifNumEntries = {sizeof(OID_ifNumEntries) / sizeof(UINT), OID_ifNumEntries}; // SNMP interface for Entry Type. UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3}; AsnObjectIdentifier MIB_ifEntryType = {sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType}; // SNMP interface for MAC Address. UINT OID_ifMAC[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6}; AsnObjectIdentifier MIB_ifMAC = {sizeof(OID_ifMAC) / sizeof(UINT), OID_ifMAC}; // SNMP interface for IP Address. UINT OID_ifIPAddr[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 1}; AsnObjectIdentifier MIB_ifIPAddr = {sizeof(OID_ifIPAddr) / sizeof(UINT), OID_ifIPAddr}; // SNMP interface for Subnet Mask. UINT OID_ifSubnetMask[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 3}; AsnObjectIdentifier MIB_ifSubnetMask = {sizeof(OID_ifSubnetMask) / sizeof(UINT), OID_ifSubnetMask}; // SNMP interface for Description. UINT OID_ifDesc[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 2}; AsnObjectIdentifier MIB_ifDesc = {sizeof(OID_ifDesc) / sizeof(UINT), OID_ifDesc}; // SNMP interface for Interface Index UINT OID_ifIndex[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 2}; AsnObjectIdentifier MIB_ifIndex = {sizeof(OID_ifIndex) / sizeof(UINT), OID_ifIndex}; // SNMP interface for IP Routing Table UINT OID_ifIPRouteTable[] = {1, 3, 6, 1, 2, 1, 4, 21, 1}; AsnObjectIdentifier MIB_ifIPRouteTable = {sizeof(OID_ifIPRouteTable) / sizeof(UINT), OID_ifIPRouteTable}; // SNMP interface for Interface Entry Number UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 1}; AsnObjectIdentifier MIB_ifEntryNum = {sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum}; // alex // SNMP interface for Speed. UINT OID_ifSpeed[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 5}; AsnObjectIdentifier MIB_ifSpeed = {sizeof(OID_ifSpeed) / sizeof(UINT), OID_ifSpeed}; // alex // SNMP interface for OperStatus. UINT OID_ifOperStatus[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 8}; AsnObjectIdentifier MIB_ifOperStatus = {sizeof(OID_ifOperStatus) / sizeof(UINT), OID_ifOperStatus}; RFC1157VarBindList varBindList; RFC1157VarBind varBind[NUM_VARBIND_LIST]; AsnInteger errorStatus; AsnInteger errorIndex; AsnObjectIdentifier MIB_NULL = {0, 0}; int ret; UINT NICCount = 0, ifIndex = 0, i; // Initialize the variable list to be retrieved by Query varBindList.list = varBind; // varBind[0].name = MIB_NULL; // If the user wants to get the # of NICs in the system, then use only Num Entries. // Copy in the OID to find the # of entries in the Interface table varBindList.len = 1; SNMP_oidcpy(&varBind[0].name, &MIB_ifNumEntries); ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); m_ifCount = varBind[0].value.asnValue.number; if (m_ifCount > 0) { m_pNICInfo = new tSTRUCTNICINFO [m_ifCount]; m_ifIndex = new DWORD [m_ifCount]; m_ifEntryNum = new DWORD [m_ifCount]; m_ifUsed = new DWORD [m_ifCount]; m_bDialup = bDialup; m_bLoopback = bLoopback; } else return 0; // Line below is added by Alexey Kazakovsky. It was memory leak!!! SNMP_oidfree(&varBind[0].name); // Copy in the OID for the type of interface SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); // Copy in the OID for MAC Address SNMP_oidcpy(&varBind[1].name, &MIB_ifMAC); // If the user wants to get the # of NICs in the system, then use only Entry Type and MAC Address, // otherwise also retrieve IP Address, Subnet Mask, Description, Interface Index, and Interface Entry Number. varBindList.len = NUM_VARBIND_LIST; // Copy in the OID for IP Address SNMP_oidcpy(&varBind[2].name, &MIB_ifIPAddr); // Copy in the OID for Subnet Mask SNMP_oidcpy(&varBind[3].name, &MIB_ifSubnetMask); // Copy in the OID for Description SNMP_oidcpy(&varBind[4].name, &MIB_ifDesc); // Copy in the OID for Interface Index SNMP_oidcpy(&varBind[5].name, &MIB_ifIndex); // Copy in the OID for Interface Entry Number SNMP_oidcpy(&varBind[6].name, &MIB_ifEntryNum); // Alex // Copy in the OID for Interface Speed SNMP_oidcpy(&varBind[7].name, &MIB_ifSpeed); // Alex // Copy in the OID for Interface OperStatus SNMP_oidcpy(&varBind[8].name, &MIB_ifOperStatus); memset(m_pNICInfo, 0, sizeof(tSTRUCTNICINFO) * m_ifCount); do { // Submit the query. Responses will be loaded into varBindList. We can expect this call to // succeed a # of times corresponding to the # of adapters reported to be in the system. ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); if (!ret) ret = 1; else // Confirm that the proper type has been returned ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength); if (!ret) { // Confirm that we have an address here ret = SNMP_oidncmp(&varBind[1].name, &MIB_ifMAC, MIB_ifMAC.idLength); if (!ret) { NICCount++; // Ignore Loopback devices if ((varBind[1].value.asnValue.address.length == 0 && !m_bLoopback) || // Ignore Dial-Up Networking adapters (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x44 && varBind[1].value.asnValue.address.stream[1] == 0x45 && varBind[1].value.asnValue.address.stream[2] == 0x53 && varBind[1].value.asnValue.address.stream[3] == 0x54 && !m_bDialup) || // Ignore NULL addresses returned by other network interfaces (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x00 && varBind[1].value.asnValue.address.stream[1] == 0x00 && varBind[1].value.asnValue.address.stream[2] == 0x00 && varBind[1].value.asnValue.address.stream[3] == 0x00 && varBind[1].value.asnValue.address.stream[4] == 0x00 && varBind[1].value.asnValue.address.stream[5] == 0x00)) NICCount--; // Store Interface Index and Entry Numbers so we can match up the data later. m_ifIndex[ifIndex] = varBind[5].value.asnValue.number; m_ifEntryNum[ifIndex] = varBind[6].value.asnValue.number; // Store data and increment counter. m_pNICInfo[ifIndex].type = varBind[0].value.asnValue.number; m_pNICInfo[ifIndex].MACLength = varBind[1].value.asnValue.address.length; for (i = 0; i < varBind[1].value.asnValue.address.length; i++) m_pNICInfo[ifIndex].MAC[i] = varBind[1].value.asnValue.address.stream[i]; if (!SNMP_oidncmp(&varBind[2].name, &MIB_ifIPAddr, MIB_ifIPAddr.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].IP[i] = varBind[2].value.asnValue.address.stream[i]; } if (!SNMP_oidncmp(&varBind[3].name, &MIB_ifSubnetMask, MIB_ifSubnetMask.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].SubnetMask[i] = varBind[3].value.asnValue.address.stream[i]; } // Leave the last byte as a NULL terminator i = sizeof(m_pNICInfo[ifIndex].Description) - 1; if (varBind[4].value.asnValue.address.length < i) i = varBind[4].value.asnValue.address.length; memcpy(m_pNICInfo[ifIndex].Description, varBind[4].value.asnValue.address.stream, i); // Alex m_pNICInfo[ifIndex].Speed=varBind[7].value.asnValue.number; m_pNICInfo[ifIndex].OperStatus=varBind[8].value.asnValue.number; ifIndex++; } } } while (!ret); // Stop only on an error. An error will occur when the list of interfaces is exhausted. // Free the bindings for (i = 0; i < varBindList.len; i++) SNMP_FreeVarBind(&varBind[i]); return NICCount; } /* Because IP Address, Interface Index, and Subnet Mask are in the same OID (4.20.1.x), and Interface Entry Number, Description, Type, and MAC Address are in another OID (2.2.1.x), you have to cross reference the Interface Index with the Interface Entry Number. All IP Address and Subnet Mask values belong together, but you have to find the matching Interface Entry Number to get the corresponding Description, Type, and MAC Address. */ void MibII::GetNICInfo(tSTRUCTNICINFO *pNICInfo) { tSTRUCTNICINFO tempStruct; UINT i, j, validNICIndex = 0; for (i = 0; i < m_ifCount; i++) { m_ifUsed[i]=0; }; for (i = 0; i < m_ifCount; i++) { memcpy(tempStruct.IP, m_pNICInfo[i].IP, sizeof(tempStruct.IP)); memcpy(tempStruct.SubnetMask, m_pNICInfo[i].SubnetMask, sizeof(tempStruct.SubnetMask)); // Find the Interface Entry Number that matches the Interface Index. // Patched by Alexey Kazakovsky BOOL bFoundEntry=FALSE; for (j = 0; j < m_ifCount; j++) { if (m_ifIndex[i] == m_ifEntryNum[j]) { bFoundEntry=TRUE; m_ifUsed[j]=1; break; }; } if (!bFoundEntry) { for (j=0;j<m_ifCount;j++) { if (m_ifUsed[j]==0) break; }; }; if (j==m_ifCount) j--; // End of patch tempStruct.type = m_pNICInfo[j].type; memcpy(tempStruct.Description, m_pNICInfo[j].Description, sizeof(tempStruct.Description)); tempStruct.MACLength = m_pNICInfo[j].MACLength; memcpy(tempStruct.MAC, m_pNICInfo[j].MAC, tempStruct.MACLength); // Alex tempStruct.Speed = m_pNICInfo[j].Speed; tempStruct.OperStatus = m_pNICInfo[j].OperStatus; // Ignore Loopback devices if ((tempStruct.MACLength == 0 && !m_bLoopback) || // Ignore Dial-Up Networking adapters (tempStruct.MAC[0] == 0x44 && tempStruct.MAC[1] == 0x45 && tempStruct.MAC[2] == 0x53 && tempStruct.MAC[3] == 0x54 && !m_bDialup) || // Ignore NULL addresses returned by other network interfaces (tempStruct.MAC[0] == 0x00 && tempStruct.MAC[1] == 0x00 && tempStruct.MAC[2] == 0x00 && tempStruct.MAC[3] == 0x00 && tempStruct.MAC[4] == 0x00 && tempStruct.MAC[5] == 0x00)) { } else { memcpy(&pNICInfo[validNICIndex], &tempStruct, sizeof(tSTRUCTNICINFO)); validNICIndex++; } } if (m_ifCount > 0) { delete m_pNICInfo; delete m_ifIndex; delete m_ifEntryNum; delete m_ifUsed; } } /****************************************************************** * * Copyright (C) Stas Khirman 1998. All rights reserved. * * This program is distributed WITHOUT ANY WARRANTY * *******************************************************************/ /************************************************* * * Reproduction of SNMP.LIB and SNMPAPI.LIB base * functions * * Author: Stas Khirman (staskh@rocketmail.com) * * * Free software: no warranty; use anywhere is ok; spread the * sources; note any modifications; share variations and * derivatives (including sending to staskh@rocketmail.com). * * *************************************************/ SNMPAPI SNMP_FUNC_TYPE SnmpUtilOidCpy( OUT AsnObjectIdentifier *DstObjId, IN AsnObjectIdentifier *SrcObjId ) { DstObjId->ids = (UINT *)GlobalAlloc(GMEM_ZEROINIT,SrcObjId->idLength*sizeof(UINT)); if(!DstObjId->ids){ SetLastError(1); return 0; } memcpy(DstObjId->ids,SrcObjId->ids,SrcObjId->idLength*sizeof(UINT)); DstObjId->idLength = SrcObjId->idLength; return 1; } VOID SNMP_FUNC_TYPE SnmpUtilOidFree( IN OUT AsnObjectIdentifier *ObjId ) { GlobalFree(ObjId->ids); ObjId->ids = 0; ObjId->idLength = 0; } SNMPAPI SNMP_FUNC_TYPE SnmpUtilOidNCmp( IN AsnObjectIdentifier *ObjIdA, IN AsnObjectIdentifier *ObjIdB, IN UINT Len ) { UINT CmpLen; UINT i; int res; if (ObjIdA==ObjIdB) { return 0; }; CmpLen = Len; if(ObjIdA->idLength < CmpLen) CmpLen = ObjIdA->idLength; if(ObjIdB->idLength < CmpLen) CmpLen = ObjIdB->idLength; for(i=0;i<CmpLen;i++){ res = ObjIdA->ids[i] - ObjIdB->ids[i]; if(res!=0) return res; } return 0; } VOID SNMP_FUNC_TYPE SnmpUtilVarBindFree( IN OUT RFC1157VarBind *VarBind ) { BYTE asnType; // free object name SnmpUtilOidFree(&VarBind->name); asnType = VarBind->value.asnType; if(asnType==ASN_OBJECTIDENTIFIER){ SnmpUtilOidFree(&VarBind->value.asnValue.object); } else if( (asnType==ASN_OCTETSTRING) || (asnType==ASN_RFC1155_IPADDRESS) || (asnType==ASN_RFC1155_OPAQUE) || (asnType==ASN_SEQUENCE)){ if(VarBind->value.asnValue.string.dynamic){ GlobalFree(VarBind->value.asnValue.string.stream); } } VarBind->value.asnType = ASN_NULL; }
Hier der Inhalt der H-Datei:////////////////////////////////////////////////////// // FILE : MibAccess.h // // #ifndef _SNMP_ACCESS_H_ #define _SNMP_ACCESS_H_ #include <snmp.h> ////////////////////////////////////////////////////////////// // Defenitoin of pointers to the four functions in the Mib Dll // typedef BOOL (WINAPI *pSnmpExtensionInit)( IN DWORD dwTimeZeroReference, OUT HANDLE *hPollForTrapEvent, OUT AsnObjectIdentifier *supportedView); typedef BOOL (WINAPI *pSnmpExtensionTrap)( OUT AsnObjectIdentifier *enterprise, OUT AsnInteger *genericTrap, OUT AsnInteger *specificTrap, OUT AsnTimeticks *timeStamp, OUT RFC1157VarBindList *variableBindings); typedef BOOL (WINAPI *pSnmpExtensionQuery)( IN BYTE requestType, IN OUT RFC1157VarBindList *variableBindings, OUT AsnInteger *errorStatus, OUT AsnInteger *errorIndex); typedef BOOL (WINAPI *pSnmpExtensionInitEx)(OUT AsnObjectIdentifier *supportedView); typedef struct _tSTRUCTNICINFO { int type; BYTE MACLength; BYTE MAC[14]; BYTE IP[4]; DWORD Speed; DWORD OperStatus; BYTE SubnetMask[4]; BYTE Description[128]; } tSTRUCTNICINFO; #define ERROR_MIB_DLL -1 #define ERROR_MIB_WINSOCK -2 #define ERROR_MIB_INIT -3 class MibExtLoad { public: MibExtLoad(); ~MibExtLoad(); BOOL Init(DWORD dwTimeZeroReference,HANDLE *hPollForTrapEvent,AsnObjectIdentifier *supportedView); BOOL InitEx(AsnObjectIdentifier *supportedView); BOOL Query(BYTE requestType,OUT RFC1157VarBindList *variableBindings, AsnInteger *errorStatus,AsnInteger *errorIndex); BOOL Trap(AsnObjectIdentifier *enterprise, AsnInteger *genericTrap, AsnInteger *specificTrap, AsnTimeticks *timeStamp, RFC1157VarBindList *variableBindings); private: // HINSTANCE m_hInst; HMODULE m_hInst; pSnmpExtensionInit m_Init; pSnmpExtensionInitEx m_InitEx; pSnmpExtensionQuery m_Query; pSnmpExtensionTrap m_Trap; }; class MibII: public MibExtLoad { public: MibII(); ~MibII(); BOOL Init(); int MIB_GetIPAddress(DWORD *MIB_Array,int max_addresses, BOOL bShowLoopbackAddress); UINT GetNICCount(BOOL bDialup, BOOL bLoopback); void GetNICInfo(tSTRUCTNICINFO *pNICInfo); private: int m_rvWSA; UINT m_ifCount; DWORD *m_ifIndex; DWORD *m_ifEntryNum; DWORD *m_ifUsed; tSTRUCTNICINFO *m_pNICInfo; BOOL m_bDialup; BOOL m_bLoopback; void MatchNICEntries(UINT NICCount, tSTRUCTNICINFO *pNICInfo); }; #endif
Wie kann ich den Abbruch verhindern?
Danke im Voraus und viele Grüße
Bernd
Antworten
-
Hallo Guido,
ich bin jetzt der Lösung scheinbar ein ganzes Stück näher gekommen. Hier die zwei betroffenen Funktionen dazu:
void CSysInfo::DetectAdaptersMIB() { m_nMIBAdapters = m_mib.GetNICCount(TRUE,m_bMIBShowLoopback); <------- hier wird der falsche Wert in die Variable m_nMIBAdapters zurückgegeben if (m_bMIBAllocated) { free(m_pMIBAdapters); m_bMIBAllocated=FALSE; }; if (m_nMIBAdapters>0) { // Allocate memory for GetNICInfo() m_pMIBAdapters = (tSTRUCTNICINFO*)malloc(sizeof(tSTRUCTNICINFO) * m_nMIBAdapters); if (m_pMIBAdapters!=NULL) { memset(m_pMIBAdapters, 0, sizeof(tSTRUCTNICINFO) * m_nMIBAdapters); m_bMIBAllocated=TRUE; m_mib.GetNICInfo(m_pMIBAdapters); }; }; }
UINT MibII::GetNICCount(BOOL bDialup, BOOL bLoopback) { #define NUM_VARBIND_LIST 9 // SNMP interface for # of NIC Entries. UINT OID_ifNumEntries[] = {1, 3, 6, 1, 2, 1, 2, 1}; AsnObjectIdentifier MIB_ifNumEntries = {sizeof(OID_ifNumEntries) / sizeof(UINT), OID_ifNumEntries}; // SNMP interface for Entry Type. UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3}; AsnObjectIdentifier MIB_ifEntryType = {sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType}; // SNMP interface for MAC Address. UINT OID_ifMAC[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6}; AsnObjectIdentifier MIB_ifMAC = {sizeof(OID_ifMAC) / sizeof(UINT), OID_ifMAC}; // SNMP interface for IP Address. UINT OID_ifIPAddr[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 1}; AsnObjectIdentifier MIB_ifIPAddr = {sizeof(OID_ifIPAddr) / sizeof(UINT), OID_ifIPAddr}; // SNMP interface for Subnet Mask. UINT OID_ifSubnetMask[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 3}; AsnObjectIdentifier MIB_ifSubnetMask = {sizeof(OID_ifSubnetMask) / sizeof(UINT), OID_ifSubnetMask}; // SNMP interface for Description. UINT OID_ifDesc[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 2}; AsnObjectIdentifier MIB_ifDesc = {sizeof(OID_ifDesc) / sizeof(UINT), OID_ifDesc}; // SNMP interface for Interface Index UINT OID_ifIndex[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 2}; AsnObjectIdentifier MIB_ifIndex = {sizeof(OID_ifIndex) / sizeof(UINT), OID_ifIndex}; // SNMP interface for IP Routing Table UINT OID_ifIPRouteTable[] = {1, 3, 6, 1, 2, 1, 4, 21, 1}; AsnObjectIdentifier MIB_ifIPRouteTable = {sizeof(OID_ifIPRouteTable) / sizeof(UINT), OID_ifIPRouteTable}; // SNMP interface for Interface Entry Number UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 1}; AsnObjectIdentifier MIB_ifEntryNum = {sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum}; // alex // SNMP interface for Speed. UINT OID_ifSpeed[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 5}; AsnObjectIdentifier MIB_ifSpeed = {sizeof(OID_ifSpeed) / sizeof(UINT), OID_ifSpeed}; // alex // SNMP interface for OperStatus. UINT OID_ifOperStatus[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 8}; AsnObjectIdentifier MIB_ifOperStatus = {sizeof(OID_ifOperStatus) / sizeof(UINT), OID_ifOperStatus}; RFC1157VarBindList varBindList; RFC1157VarBind varBind[NUM_VARBIND_LIST]; AsnInteger errorStatus; AsnInteger errorIndex; AsnObjectIdentifier MIB_NULL = {0, 0}; int ret; UINT NICCount = 0, ifIndex = 0, i; // Initialize the variable list to be retrieved by Query varBindList.list = varBind; // varBind[0].name = MIB_NULL; // If the user wants to get the # of NICs in the system, then use only Num Entries. // Copy in the OID to find the # of entries in the Interface table varBindList.len = 1; SNMP_oidcpy(&varBind[0].name, &MIB_ifNumEntries); ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); m_ifCount = varBind[0].value.asnValue.number; if (m_ifCount > 0) { m_pNICInfo = new tSTRUCTNICINFO [m_ifCount]; m_ifIndex = new DWORD [m_ifCount]; m_ifEntryNum = new DWORD [m_ifCount]; m_ifUsed = new DWORD [m_ifCount]; m_bDialup = bDialup; m_bLoopback = bLoopback; } else return 0; // Line below is added by Alexey Kazakovsky. It was memory leak!!! SNMP_oidfree(&varBind[0].name); // Copy in the OID for the type of interface SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); // Copy in the OID for MAC Address SNMP_oidcpy(&varBind[1].name, &MIB_ifMAC); // If the user wants to get the # of NICs in the system, then use only Entry Type and MAC Address, // otherwise also retrieve IP Address, Subnet Mask, Description, Interface Index, and Interface Entry Number. varBindList.len = NUM_VARBIND_LIST; // Copy in the OID for IP Address SNMP_oidcpy(&varBind[2].name, &MIB_ifIPAddr); // Copy in the OID for Subnet Mask SNMP_oidcpy(&varBind[3].name, &MIB_ifSubnetMask); // Copy in the OID for Description SNMP_oidcpy(&varBind[4].name, &MIB_ifDesc); // Copy in the OID for Interface Index SNMP_oidcpy(&varBind[5].name, &MIB_ifIndex); // Copy in the OID for Interface Entry Number SNMP_oidcpy(&varBind[6].name, &MIB_ifEntryNum); // Alex // Copy in the OID for Interface Speed SNMP_oidcpy(&varBind[7].name, &MIB_ifSpeed); // Alex // Copy in the OID for Interface OperStatus SNMP_oidcpy(&varBind[8].name, &MIB_ifOperStatus); memset(m_pNICInfo, 0, sizeof(tSTRUCTNICINFO) * m_ifCount); // memset(m_ifIndex, 0, sizeof(DWORD) * m_ifCount); // memset(m_ifEntryNum, 0, sizeof(DWORD) * m_ifCount); // memset(m_ifUsed, 0, sizeof(DWORD) * m_ifCount); do { // Submit the query. Responses will be loaded into varBindList. We can expect this call to // succeed a # of times corresponding to the # of adapters reported to be in the system. ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); if (!ret) ret = 1; else // Confirm that the proper type has been returned ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength); if (!ret) { // Confirm that we have an address here ret = SNMP_oidncmp(&varBind[1].name, &MIB_ifMAC, MIB_ifMAC.idLength); if (!ret) { NICCount++; // Ignore Loopback devices if ((varBind[1].value.asnValue.address.length == 0 && !m_bLoopback) || // Ignore Dial-Up Networking adapters (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x44 && varBind[1].value.asnValue.address.stream[1] == 0x45 && varBind[1].value.asnValue.address.stream[2] == 0x53 && varBind[1].value.asnValue.address.stream[3] == 0x54 && !m_bDialup) || // Ignore NULL addresses returned by other network interfaces (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x00 && varBind[1].value.asnValue.address.stream[1] == 0x00 && varBind[1].value.asnValue.address.stream[2] == 0x00 && varBind[1].value.asnValue.address.stream[3] == 0x00 && varBind[1].value.asnValue.address.stream[4] == 0x00 && varBind[1].value.asnValue.address.stream[5] == 0x00)) NICCount--; // Store Interface Index and Entry Numbers so we can match up the data later. m_ifIndex[ifIndex] = varBind[5].value.asnValue.number; m_ifEntryNum[ifIndex] = varBind[6].value.asnValue.number; // Store data and increment counter. m_pNICInfo[ifIndex].type = varBind[0].value.asnValue.number; m_pNICInfo[ifIndex].MACLength = varBind[1].value.asnValue.address.length; for (i = 0; i < varBind[1].value.asnValue.address.length; i++) m_pNICInfo[ifIndex].MAC[i] = varBind[1].value.asnValue.address.stream[i]; if (!SNMP_oidncmp(&varBind[2].name, &MIB_ifIPAddr, MIB_ifIPAddr.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].IP[i] = varBind[2].value.asnValue.address.stream[i]; } if (!SNMP_oidncmp(&varBind[3].name, &MIB_ifSubnetMask, MIB_ifSubnetMask.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].SubnetMask[i] = varBind[3].value.asnValue.address.stream[i]; } // Leave the last byte as a NULL terminator i = sizeof(m_pNICInfo[ifIndex].Description) - 1; if (varBind[4].value.asnValue.address.length < i) i = varBind[4].value.asnValue.address.length; memcpy(m_pNICInfo[ifIndex].Description, varBind[4].value.asnValue.address.stream, i); // Alex m_pNICInfo[ifIndex].Speed=varBind[7].value.asnValue.number; m_pNICInfo[ifIndex].OperStatus=varBind[8].value.asnValue.number; ifIndex++; } } } while (!ret); // Stop only on an error. An error will occur when the list of interfaces is exhausted. // Free the bindings for (i = 0; i < varBindList.len; i++) SNMP_FreeVarBind(&varBind[i]); // return NICCount; // NICCount = 4 ---> mit Abbruch return m_ifCount; // m_ifCount = 22 ---> ohne Abbruch }
Wenn ich beim return der Funktion MibII::GetNICCount die Variable m_ifCount statt der bisherigen Variable NICCount verwende, tritt der Abbruch nicht mehr auf. Soweit verstehe ich auch noch die Zusammenhänge. Ich bin mir aber nicht sicher, ob ich das so einfach machen kann, da ich den Sinn für die bisherigen Variable NICCount nicht verstehe.
Ist es richtig die Variable für den return-Wert der Funktion MibII::GetNICCount zu ändern?
Viele Güße
Bernd
- Als Antwort markiert Bernd Föry Donnerstag, 28. November 2019 09:56
Alle Antworten
-
Hallo Bernd,
die deletes in der Datei sind falsch. Dort werden Arrays deletet, keine einzelnen Inhalte. Das muss wie folgt definiert werden:
if (m_ifCount > 0) { delete[] m_pNICInfo; delete[] m_ifIndex; delete[] m_ifEntryNum; delete[] m_ifUsed; }
Mit delete x wird eine Variable x gelöscht, die mit new erzeugt wurde. Z.B. double *x = new double; delete x;
Mit delete[] a wird ein Array, wie in deinem Code, gelöscht. Z.B. double *a = new double[10]; delete[] a;
Gruß Guido
PS: Ein Absturz sollte zwar nicht passieren, so wie bei den anderen Win-Versionen. Aber anscheinend ist Win 2012 sehr restriktiv bei der Speicherverwaltung.- Bearbeitet Guido Franzke Montag, 25. November 2019 13:00
-
Hier noch weiter Informationen. Das ist die aufrufende Funktion beim Abbruch:
void CSysInfo::DetectAdaptersMIB() { m_nMIBAdapters=m_mib.GetNICCount(TRUE,m_bMIBShowLoopback); if (m_bMIBAllocated) { free(m_pMIBAdapters); m_bMIBAllocated=FALSE; }; if (m_nMIBAdapters>0) { // Allocate memory for GetNICInfo() m_pMIBAdapters=(tSTRUCTNICINFO *)malloc(sizeof(tSTRUCTNICINFO)*m_nMIBAdapters); if (m_pMIBAdapters!=NULL) { memset(m_pMIBAdapters,0,sizeof(tSTRUCTNICINFO)*m_nMIBAdapters); m_bMIBAllocated=TRUE; m_mib.GetNICInfo(m_pMIBAdapters); }; }; }
Hier noch der Call Stack:
-
Erweitere den Code mal, dass die Zeiger immer einen korrekt definierten Wert haben (NULL oder allozierter Speicher).
if (m_ifCount > 0) { delete[] m_pNICInfo; delete[] m_ifIndex; delete[] m_ifEntryNum; delete[] m_ifUsed; m_pNICInfo = NULL; m_ifIndex = NULL; m_ifEntryNum = NULL; m_ifUsed = NULL; } //***** und einen Konstruktor für MIBll:
Jetzt könnte er nur noch mit einer Null-Dereferenzierung abstürzen, oder wenn wieder ein Heap Fehler kommt, dann wird auf ein Array außerhalb seiner Grenzen zugegriffen. Auf alle Fälle kannst du das im Debugger dann gut finden.
MibII::MibII()
{
m_rvWSA = 0;
m_ifCount = 0;
m_pNICInfo = NULL;
m_ifIndex = NULL;
m_ifEntryNum = NULL;
m_ifUsed = NULL;
m_bDialup = FALSE;
m_bLoopback = FALSE;
}
Gruß Guido
- Bearbeitet Guido Franzke Montag, 25. November 2019 15:02
-
-
Schau dir den Value von m_pNICInfo im Debugger an (type=-57266.. MACLength=221...)
Der Wert in der Struktur ist kaputt, so wie es die Fehlermeldung auch sagt. Irgendwann zwischen new und delete wird in den Speicherbereich geschrieben. Die Stelle, wo unerlaubt darein geschrieben wird, musst du mit dem Debugger suchen.
Gruß Guido
-
Hallo Guido,
ich bin jetzt der Lösung scheinbar ein ganzes Stück näher gekommen. Hier die zwei betroffenen Funktionen dazu:
void CSysInfo::DetectAdaptersMIB() { m_nMIBAdapters = m_mib.GetNICCount(TRUE,m_bMIBShowLoopback); <------- hier wird der falsche Wert in die Variable m_nMIBAdapters zurückgegeben if (m_bMIBAllocated) { free(m_pMIBAdapters); m_bMIBAllocated=FALSE; }; if (m_nMIBAdapters>0) { // Allocate memory for GetNICInfo() m_pMIBAdapters = (tSTRUCTNICINFO*)malloc(sizeof(tSTRUCTNICINFO) * m_nMIBAdapters); if (m_pMIBAdapters!=NULL) { memset(m_pMIBAdapters, 0, sizeof(tSTRUCTNICINFO) * m_nMIBAdapters); m_bMIBAllocated=TRUE; m_mib.GetNICInfo(m_pMIBAdapters); }; }; }
UINT MibII::GetNICCount(BOOL bDialup, BOOL bLoopback) { #define NUM_VARBIND_LIST 9 // SNMP interface for # of NIC Entries. UINT OID_ifNumEntries[] = {1, 3, 6, 1, 2, 1, 2, 1}; AsnObjectIdentifier MIB_ifNumEntries = {sizeof(OID_ifNumEntries) / sizeof(UINT), OID_ifNumEntries}; // SNMP interface for Entry Type. UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3}; AsnObjectIdentifier MIB_ifEntryType = {sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType}; // SNMP interface for MAC Address. UINT OID_ifMAC[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6}; AsnObjectIdentifier MIB_ifMAC = {sizeof(OID_ifMAC) / sizeof(UINT), OID_ifMAC}; // SNMP interface for IP Address. UINT OID_ifIPAddr[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 1}; AsnObjectIdentifier MIB_ifIPAddr = {sizeof(OID_ifIPAddr) / sizeof(UINT), OID_ifIPAddr}; // SNMP interface for Subnet Mask. UINT OID_ifSubnetMask[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 3}; AsnObjectIdentifier MIB_ifSubnetMask = {sizeof(OID_ifSubnetMask) / sizeof(UINT), OID_ifSubnetMask}; // SNMP interface for Description. UINT OID_ifDesc[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 2}; AsnObjectIdentifier MIB_ifDesc = {sizeof(OID_ifDesc) / sizeof(UINT), OID_ifDesc}; // SNMP interface for Interface Index UINT OID_ifIndex[] = {1, 3, 6, 1, 2, 1, 4, 20, 1, 2}; AsnObjectIdentifier MIB_ifIndex = {sizeof(OID_ifIndex) / sizeof(UINT), OID_ifIndex}; // SNMP interface for IP Routing Table UINT OID_ifIPRouteTable[] = {1, 3, 6, 1, 2, 1, 4, 21, 1}; AsnObjectIdentifier MIB_ifIPRouteTable = {sizeof(OID_ifIPRouteTable) / sizeof(UINT), OID_ifIPRouteTable}; // SNMP interface for Interface Entry Number UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 1}; AsnObjectIdentifier MIB_ifEntryNum = {sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum}; // alex // SNMP interface for Speed. UINT OID_ifSpeed[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 5}; AsnObjectIdentifier MIB_ifSpeed = {sizeof(OID_ifSpeed) / sizeof(UINT), OID_ifSpeed}; // alex // SNMP interface for OperStatus. UINT OID_ifOperStatus[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 8}; AsnObjectIdentifier MIB_ifOperStatus = {sizeof(OID_ifOperStatus) / sizeof(UINT), OID_ifOperStatus}; RFC1157VarBindList varBindList; RFC1157VarBind varBind[NUM_VARBIND_LIST]; AsnInteger errorStatus; AsnInteger errorIndex; AsnObjectIdentifier MIB_NULL = {0, 0}; int ret; UINT NICCount = 0, ifIndex = 0, i; // Initialize the variable list to be retrieved by Query varBindList.list = varBind; // varBind[0].name = MIB_NULL; // If the user wants to get the # of NICs in the system, then use only Num Entries. // Copy in the OID to find the # of entries in the Interface table varBindList.len = 1; SNMP_oidcpy(&varBind[0].name, &MIB_ifNumEntries); ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); m_ifCount = varBind[0].value.asnValue.number; if (m_ifCount > 0) { m_pNICInfo = new tSTRUCTNICINFO [m_ifCount]; m_ifIndex = new DWORD [m_ifCount]; m_ifEntryNum = new DWORD [m_ifCount]; m_ifUsed = new DWORD [m_ifCount]; m_bDialup = bDialup; m_bLoopback = bLoopback; } else return 0; // Line below is added by Alexey Kazakovsky. It was memory leak!!! SNMP_oidfree(&varBind[0].name); // Copy in the OID for the type of interface SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); // Copy in the OID for MAC Address SNMP_oidcpy(&varBind[1].name, &MIB_ifMAC); // If the user wants to get the # of NICs in the system, then use only Entry Type and MAC Address, // otherwise also retrieve IP Address, Subnet Mask, Description, Interface Index, and Interface Entry Number. varBindList.len = NUM_VARBIND_LIST; // Copy in the OID for IP Address SNMP_oidcpy(&varBind[2].name, &MIB_ifIPAddr); // Copy in the OID for Subnet Mask SNMP_oidcpy(&varBind[3].name, &MIB_ifSubnetMask); // Copy in the OID for Description SNMP_oidcpy(&varBind[4].name, &MIB_ifDesc); // Copy in the OID for Interface Index SNMP_oidcpy(&varBind[5].name, &MIB_ifIndex); // Copy in the OID for Interface Entry Number SNMP_oidcpy(&varBind[6].name, &MIB_ifEntryNum); // Alex // Copy in the OID for Interface Speed SNMP_oidcpy(&varBind[7].name, &MIB_ifSpeed); // Alex // Copy in the OID for Interface OperStatus SNMP_oidcpy(&varBind[8].name, &MIB_ifOperStatus); memset(m_pNICInfo, 0, sizeof(tSTRUCTNICINFO) * m_ifCount); // memset(m_ifIndex, 0, sizeof(DWORD) * m_ifCount); // memset(m_ifEntryNum, 0, sizeof(DWORD) * m_ifCount); // memset(m_ifUsed, 0, sizeof(DWORD) * m_ifCount); do { // Submit the query. Responses will be loaded into varBindList. We can expect this call to // succeed a # of times corresponding to the # of adapters reported to be in the system. ret = Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex); if (!ret) ret = 1; else // Confirm that the proper type has been returned ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength); if (!ret) { // Confirm that we have an address here ret = SNMP_oidncmp(&varBind[1].name, &MIB_ifMAC, MIB_ifMAC.idLength); if (!ret) { NICCount++; // Ignore Loopback devices if ((varBind[1].value.asnValue.address.length == 0 && !m_bLoopback) || // Ignore Dial-Up Networking adapters (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x44 && varBind[1].value.asnValue.address.stream[1] == 0x45 && varBind[1].value.asnValue.address.stream[2] == 0x53 && varBind[1].value.asnValue.address.stream[3] == 0x54 && !m_bDialup) || // Ignore NULL addresses returned by other network interfaces (varBind[1].value.asnValue.address.length > 0 && varBind[1].value.asnValue.address.stream[0] == 0x00 && varBind[1].value.asnValue.address.stream[1] == 0x00 && varBind[1].value.asnValue.address.stream[2] == 0x00 && varBind[1].value.asnValue.address.stream[3] == 0x00 && varBind[1].value.asnValue.address.stream[4] == 0x00 && varBind[1].value.asnValue.address.stream[5] == 0x00)) NICCount--; // Store Interface Index and Entry Numbers so we can match up the data later. m_ifIndex[ifIndex] = varBind[5].value.asnValue.number; m_ifEntryNum[ifIndex] = varBind[6].value.asnValue.number; // Store data and increment counter. m_pNICInfo[ifIndex].type = varBind[0].value.asnValue.number; m_pNICInfo[ifIndex].MACLength = varBind[1].value.asnValue.address.length; for (i = 0; i < varBind[1].value.asnValue.address.length; i++) m_pNICInfo[ifIndex].MAC[i] = varBind[1].value.asnValue.address.stream[i]; if (!SNMP_oidncmp(&varBind[2].name, &MIB_ifIPAddr, MIB_ifIPAddr.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].IP[i] = varBind[2].value.asnValue.address.stream[i]; } if (!SNMP_oidncmp(&varBind[3].name, &MIB_ifSubnetMask, MIB_ifSubnetMask.idLength)) { for (i = 0; i < 4; i++) m_pNICInfo[ifIndex].SubnetMask[i] = varBind[3].value.asnValue.address.stream[i]; } // Leave the last byte as a NULL terminator i = sizeof(m_pNICInfo[ifIndex].Description) - 1; if (varBind[4].value.asnValue.address.length < i) i = varBind[4].value.asnValue.address.length; memcpy(m_pNICInfo[ifIndex].Description, varBind[4].value.asnValue.address.stream, i); // Alex m_pNICInfo[ifIndex].Speed=varBind[7].value.asnValue.number; m_pNICInfo[ifIndex].OperStatus=varBind[8].value.asnValue.number; ifIndex++; } } } while (!ret); // Stop only on an error. An error will occur when the list of interfaces is exhausted. // Free the bindings for (i = 0; i < varBindList.len; i++) SNMP_FreeVarBind(&varBind[i]); // return NICCount; // NICCount = 4 ---> mit Abbruch return m_ifCount; // m_ifCount = 22 ---> ohne Abbruch }
Wenn ich beim return der Funktion MibII::GetNICCount die Variable m_ifCount statt der bisherigen Variable NICCount verwende, tritt der Abbruch nicht mehr auf. Soweit verstehe ich auch noch die Zusammenhänge. Ich bin mir aber nicht sicher, ob ich das so einfach machen kann, da ich den Sinn für die bisherigen Variable NICCount nicht verstehe.
Ist es richtig die Variable für den return-Wert der Funktion MibII::GetNICCount zu ändern?
Viele Güße
Bernd
- Als Antwort markiert Bernd Föry Donnerstag, 28. November 2019 09:56