GetIfTable inerhaln nt service



  • moin.
    hab folgendes problem, hab nen nt-service geschrieben der um gewisse zeiten per SetIfEntry internetverbindungen abschaltet (MIB_IF_ADMIN_STATUS_DOWN).
    das ganze arbeitet mit zeitschaltuhr.
    unter win2k lief es auch sauber ohne probleme.
    nun hab ich das ganze unter winxp getestet und da lauft das ganze einmal.
    danach bekomm ich von GetIfTable einen fehler mit 'die anweisung in "0x0040192" verweist auf speicher "0x00000000". der vorgang "read" konnte nicht auf dem speicher durchgefuehrt werden.

    MIB_IFTABLE  *m_IfTable;
    ...
    NetworkAdapter::NetworkAdapter()
    {
    	m_IfTable=NULL;
    	Z_InitClass();
    }
    
    bool NetworkAdapter::Z_InitClass()
    {
    	DWORD size=0;
    	GetIfTable(m_IfTable,&size,true);
    	return false;
    }
    

    auch nachdem ich testweise einfach mal das versucht habe :

    MIB_IFTABLE  *m_IfTable;
    ...
    NetworkAdapter::NetworkAdapter()
    {
    	m_IfTable=NULL;
    	Z_InitClass();
    }
    
    bool NetworkAdapter::Z_InitClass()
    {
    	DWORD size=0;
    	MIB_IFTABLE  IfTable;
    	GetIfTable(&IfTable,&size,true);
    	return false;
    }
    

    gleiche fehler, auch wenn ich size=sizeof(MIB_IFTABLE) mache.
    aber immer nur wenn er es das zweite mal aufruft und nur unter winxp als service, als normale anwendung gehts auch ohne probs unter xp.
    also ich weiss net weiter, ka worans liegt 😞



  • sorry, hat sich erledigt.
    hatte ne extra klasse um zum inet zu verbinden und dadrinne war der fehler.
    ka warum win2k dat net interessiert hat und warum es bei xp erst zu meiner adapter klasse zu einem fehler kahm.
    was noch etwas komisch ist, das unter winxp der adapter name nicht vorhanden ist aba dat is im mom net so wichtig.

    aba fuer alle die interesse haben ma die adapter klasse :

    #include <IPHlpApi.h>
    #pragma comment(lib,"Iphlpapi.lib")
    
    #include <mbstring.h>
    
    class NetworkAdapter{
    public:
    	NetworkAdapter();
    	~NetworkAdapter();
    	int GetAdapterCount();
    	char* GetAdapterName(int index);
    	char* GetAdapterDescription(int index);
    	DWORD GetAdapterID(int index);
    	bool EnableAdapter(int index,bool enable);
    	bool EnableAdapter(char *name,bool enable);
    	bool EnableAdapterID(DWORD ID,bool enable);
    	bool EnableAdapterDescription(char *descr,bool enable);
    	bool Z_InitClass();
    private:
    	#pragma pack( 1 )
    	MIB_IFTABLE  *m_IfTable;
    	int m_index;
    	struct _adapter{
    		char *name;
    		char *descr;
    		DWORD ID;
    		MIB_IFROW *IfRow;
    	};
    	_adapter *m_adapter;
    };
    
    NetworkAdapter::NetworkAdapter()
    {
    	m_IfTable=NULL;
    	m_index=0;
    	m_adapter=NULL;
    	if(!Z_InitClass() ) m_index=0;
    }
    
    NetworkAdapter::~NetworkAdapter()
    {
    	if(m_IfTable!=NULL) delete [] m_IfTable;
    	if(m_adapter!=NULL)
    	{
    		for (int i=0;i<m_index;i++)
    		{
    			if(m_adapter[i].name!=NULL) delete [] m_adapter[i].name;
    			if(m_adapter[i].descr!=NULL) delete [] m_adapter[i].descr;
    		}
    		delete [] m_adapter;
    	}
    
    }
    bool NetworkAdapter::Z_InitClass()
    {
    	DWORD size=0;
    	GetIfTable(m_IfTable,&size,true);
    
    	char tmp[2];
    	m_IfTable=(MIB_IFTABLE*) new BYTE [size];
    	if(m_IfTable==NULL) return false;
    	memset(m_IfTable,0,size);
    	if (NO_ERROR!=GetIfTable(m_IfTable,&size,true) ) return false;
    	m_index=m_IfTable->dwNumEntries;
    	if(m_index==0) return false;
    	m_adapter=new _adapter [m_index];
    	if(m_adapter==NULL) return false;
    
    	for (int i=0;i<m_index;i++)
    	{
    		m_adapter[i].name=new char [MAX_INTERFACE_NAME_LEN+1];
    		if(m_adapter[i].name==NULL) return false;
    		m_adapter[i].descr=new char [MAXLEN_IFDESCR+1];
    		if(m_adapter[i].descr==NULL) return false;
    		m_adapter[i].IfRow= &m_IfTable->table[i];
    		wcstombs(m_adapter[i].name,m_adapter[i].IfRow->wszName,MAX_INTERFACE_NAME_LEN);
    
    		tmp[1]=0;
    		m_adapter[i].descr[0]=0;
    		for (int j = 0; j < (int) m_adapter[i].IfRow->dwDescrLen; j++)
    		{
    			tmp[0]=_mbbtombc(m_adapter[i].IfRow->bDescr[j]);
    			strcat(m_adapter[i].descr,tmp );
    		}
    
    		m_adapter[i].ID=m_adapter[i].IfRow->dwIndex;
    	}
    	return true;
    }
    /////////////////////////////////////////////////////
    
    int NetworkAdapter::GetAdapterCount()
    {
    	return m_index;
    }
    char* NetworkAdapter::GetAdapterName(int index)
    {
    	if(index >= m_index) return NULL;
    	return m_adapter[index].name;
    }
    char* NetworkAdapter::GetAdapterDescription(int index)
    {
    	if(index >= m_index) return NULL;
    	return m_adapter[index].descr;
    }
    DWORD NetworkAdapter::GetAdapterID(int index)
    {
    	if(index >= m_index) return NULL;
    	return m_adapter[index].ID;
    }
    bool NetworkAdapter::EnableAdapter(int index,bool enable)
    {
    	bool setit=true;
    	if(index >= m_index) return false;
    	if(enable)
    	{
    		if(m_adapter[index].IfRow->dwAdminStatus==MIB_IF_ADMIN_STATUS_UP) setit=false;
    		m_adapter[index].IfRow->dwAdminStatus=MIB_IF_ADMIN_STATUS_UP;
    	}
    	else
    	{
    		if(m_adapter[index].IfRow->dwAdminStatus==MIB_IF_ADMIN_STATUS_DOWN) setit=false;
    		m_adapter[index].IfRow->dwAdminStatus=MIB_IF_ADMIN_STATUS_DOWN;
    	}
    	if(setit) if(NO_ERROR!=SetIfEntry(m_adapter[index].IfRow) ) return false;
    	return true;
    }
    bool NetworkAdapter::EnableAdapter(char *name,bool enable)
    {
    	for (int i=0;i<m_index;i++)
    	{
    		if(strcmp(m_adapter[i].name,name)==0)
    		{
    			if(EnableAdapter(i,enable) ) return true;
    		}
    	}
    	return false;
    }
    bool NetworkAdapter::EnableAdapterID(DWORD ID,bool enable)
    {
    	for (int i=0;i<m_index;i++)
    	{
    		if(m_adapter[i].ID==ID)
    		{
    			if(EnableAdapter(i,enable) ) return true;
    		}
    	}
    	return false;
    }
    bool NetworkAdapter::EnableAdapterDescription(char *descr,bool enable)
    {
    	for (int i=0;i<m_index;i++)
    	{
    		if(strcmp(m_adapter[i].descr,descr)==0)
    		{
    			if(EnableAdapter(i,enable) ) return true;
    		}
    	}
    	return false;
    }
    

    happy day 🙂


Log in to reply