none
Abbruch meiner MFC-SDI Anwendung unter Windows Server 2012 R2 Standard RRS feed

  • 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

    Montag, 25. November 2019 12:38

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
    Dienstag, 26. November 2019 10:31

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.
    Montag, 25. November 2019 12:59
  • Hallo Guido,

    danke für Deine Antwort. Deine Erklärung ist mir soweit verständlich. Leider habe ich aber noch immer einen Abbruch. 

    Hier die neue Meldung:

    Was kann ich da noch tun?

    Viele Grüße

    Bernd

    Montag, 25. November 2019 14:26
  • 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:

    Montag, 25. November 2019 14:48
  • 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:
    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;
    }
    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.

    Gruß Guido


    Montag, 25. November 2019 15:00
  • Hallo Guido,

    der Konstruktor war bereits vorhaden. Ich habe ihn entsprechend Deiner Information so ergänzt:

    Leider tritt der Abbruch noch immer auf. Hier die aktuelle Meldung:

    Wie kann ich das Problem noch weiter eingrenzen?

    Viele Grüße

    Bernd

    Dienstag, 26. November 2019 08:52
  • 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

    Dienstag, 26. November 2019 08:56
  • 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
    Dienstag, 26. November 2019 10:31