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

📄 readmac1.c

📁 Read MCP55 chipset macaddr in dos system.
💻 C
字号:
// Read and compare MAC Addresses 
//*******************************************************
//* Rev.   Date        By            Description       *
//******************************************************
//* 1.0   2007/3/7   WenxiaoGuo   Initial version

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <mem.h>
#include <conio.h>
#include <stdarg.h>
#include <malloc.h>  

#define nic_control_type_count  2

struct NIC_control_type
{
	unsigned int	pci_device_vendorID;
	unsigned int	pci_bar0_offset;
	unsigned short	mac_addr_offset;
};   

struct NIC_control_type nic_control_type[2]=
{
	{0x037310de, 0x10, 0xa8},
	{0x005710de, 0x10, 0xa8},
};  

struct pci
{
	unsigned int  busnum;
	unsigned int  devnum;
	unsigned int  funnum;
};    
typedef struct pci PCI;

struct nic_info
{
	unsigned short	mac_addr_offset;
	unsigned char	mac_addr[6];
	unsigned int	mem_base_addr;
	unsigned int	pci_bar0_offset;
	unsigned int	pci_device_vendorID;
	unsigned int	classcode; 
	PCI				pci;
};   
typedef struct nic_info NIC;


char* macform(char* macaddr)
{
	static char macbuf[13];
	unsigned short i;

	memset((void*)macbuf, (int)"0", sizeof(macbuf));
	for(i = 0; i < 6; i++)
	{
		sprintf(&(macbuf[i * 2]), "%02X", *(macaddr + 5 - i));
	}    
	macbuf[13] = '\0';
	return macbuf;
}

unsigned int pci_read_config_dword(PCI pcidevice, unsigned int reg_offset)
{
	unsigned long config;
	unsigned int _value = 0;
	config = (0x80000000 | (pcidevice.busnum << 16) | (pcidevice.devnum << 11) | (pcidevice.funnum << 8)) + reg_offset;
	
	__asm
	{
		.386
		mov  dx, 0xcf8h
		mov  eax, config
		out  dx, eax
		mov  dx, 0xcfch
		in   eax, dx
		mov  _value, eax
	};
	return _value;
}   

unsigned int find_nic(NIC** pnic)
{
	unsigned short bus_index = 0;
	unsigned short dev_index = 0;
	unsigned short fun_index = 0;
	unsigned short find_nic_count = 0;
	NIC *nic = NULL;

	for(bus_index = 0; bus_index < 256; bus_index++)  //loop1
	{
		for(dev_index = 0; dev_index < 32; dev_index++) //loop2
		{
			for(fun_index = 0; fun_index < 8; fun_index++)  //loop3
			{
				PCI pci;
				unsigned long pci_device_vendorID;
				unsigned int pci_classcode;

				pci.busnum = bus_index;
				pci.devnum = dev_index;
				pci.funnum = fun_index;

				/* 
				*  Read device_id, vendor_id and fun_dev
				*/                                  
				pci_device_vendorID = pci_read_config_dword(pci, 0x0);
				if (pci_device_vendorID == 0xFFFFFFFF)  
					continue;

				/*
				*  Read class code and sub-class code
				*/                           
				pci_classcode = pci_read_config_dword(pci, 0x8) >> 16;
				if((pci_classcode != 0x200) && (pci_classcode != 0x680))//Ethernet controller or other bridge device 
					continue;  

				if(!nic)
					nic = (NIC*)malloc(sizeof(NIC));       
				else
					nic = (NIC*)realloc(nic, (find_nic_count + 1) * sizeof(NIC));
				if(!nic)
				{
					printf("malloc failed\n");
				}   

				(nic + find_nic_count)->pci = pci;     
				(nic + find_nic_count)->pci_device_vendorID = pci_device_vendorID;
				(nic + find_nic_count)->classcode = pci_classcode;
				find_nic_count++;
			}//loop3
		}//loop2  
	}//loop1       

	*pnic = nic;
	return find_nic_count;
};    

void fill_nic_info(NIC** pnic, unsigned char nic_count)
{
	unsigned int nic_type_index = 0;
	unsigned int nic_index = 0;
	NIC* nic;

	nic = *pnic;
	for(nic_index = 0; nic_index < nic_count; nic_index++)
	{
		for(nic_type_index = 0; nic_type_index < nic_control_type_count; nic_type_index++ )
		{
			if((nic + nic_index)->pci_device_vendorID == nic_control_type[nic_type_index].pci_device_vendorID)
			{
				unsigned short i = 0;
				unsigned short mac_offset;

				(nic + nic_index)->mac_addr_offset = nic_control_type->mac_addr_offset;
				(nic + nic_index)->pci_bar0_offset = nic_control_type->pci_bar0_offset;   
				(nic + nic_index)->mem_base_addr = pci_read_config_dword((nic + nic_index)->pci, (nic + nic_index)->pci_bar0_offset);
				
				mac_offset = (nic + nic_index)->mac_addr_offset;  
				for(i = mac_offset; i < mac_offset + 6; i++)  
				{
					char* pvalue;     
					pvalue = (char*)((nic + nic_index)->mem_base_addr) + i;             
					(nic + nic_index)->mac_addr[i - mac_offset] = *pvalue;                                                                                                                                                        
				}                                            
				break;
			}   
		}
	}      
}    

int main(void)
{
	NIC** ppnic_info;
	unsigned short reval;
	int nic_index = 0;

	ppnic_info = malloc(sizeof(NIC*)); 
	reval = find_nic(ppnic_info);
	fill_nic_info(ppnic_info, reval);

	for(nic_index = 0; nic_index < reval; nic_index++)
	{
		NIC* nic = *(ppnic_info);
		printf("Find the NIC%d at %02x:%02x.%02x, and MAC is %s \n", nic_index, (nic + nic_index)->pci.busnum, (nic + nic_index)->pci.devnum,
			(nic + nic_index)->pci.funnum, macform((nic + nic_index)->mac_addr));  
	}    

	if(ppnic_info)
	{
		if(*ppnic_info)
			free(*ppnic_info);        
		free(ppnic_info);
	}       
	return 0; 
}    

⌨️ 快捷键说明

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