?? readmac1.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 + -