Chinaunix首页 | 论坛 | 博客
  • 博客访问: 566946
  • 博文数量: 99
  • 博客积分: 3976
  • 博客等级: 中校
  • 技术积分: 1041
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-15 15:48
文章分类
文章存档

2009年(1)

2008年(5)

2007年(31)

2006年(58)

2005年(4)

分类:

2006-04-01 16:23:50

#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define UNICODE
#define _UNICODE
 
LPCTSTR GetNodeTypeName(UINT NodeType)
{
    switch (NodeType) {
        case 1: return _T("Broadcast");
        case 2: return _T("Peer To Peer");
        case 4: return _T("Mixed");
        case 8: return _T("Hybrid");
        default : return _T("unknown");
    }
}
LPCTSTR GetInterfaceTypeName(UINT InterfaceType)
{
    switch (InterfaceType) {
        case MIB_IF_TYPE_OTHER:     return _T("Other Type Of Adapter");
        case MIB_IF_TYPE_ETHERNET:  return _T("Ethernet Adapter");
        case MIB_IF_TYPE_TOKENRING: return _T("Token Ring Adapter");
        case MIB_IF_TYPE_FDDI:      return _T("FDDI Adapter");
        case MIB_IF_TYPE_PPP:       return _T("PPP Adapter");
        case MIB_IF_TYPE_LOOPBACK:  return _T("Loopback Adapter");
        case MIB_IF_TYPE_SLIP:      return _T("SLIP Adapter");
        default: return _T("unknown");
    }
}
/* print MAC address */
PTCHAR PrintMacAddr(PBYTE Mac)
{
    static TCHAR MacAddr[20];
    _stprintf(MacAddr, _T("%02x-%02x-%02x-%02x-%02x-%02x"),
        Mac[0], Mac[1], Mac[2], Mac[3], Mac[4],  Mac[5]);
    return MacAddr;
}
DWORD DoFormatMessage(DWORD ErrorCode)
{
    LPVOID lpMsgBuf;
    DWORD RetVal;
    if ((RetVal = FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            ErrorCode,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
            (LPTSTR) &lpMsgBuf,
            0,
            NULL ))) {
        _tprintf(_T("%s"), (LPTSTR)lpMsgBuf);
        LocalFree(lpMsgBuf);
        /* return number of TCHAR's stored in output buffer
         * excluding '\0' - as FormatMessage does*/
        return RetVal;
    }
    else
        return 0;
}
INT ShowInfo(BOOL bAll)
{
    PIP_ADAPTER_INFO pAdapterInfo = NULL;
    PIP_ADAPTER_INFO pAdapter = NULL;
    ULONG    adaptOutBufLen;
    PFIXED_INFO pFixedInfo;
    ULONG    netOutBufLen;
    PIP_ADDR_STRING pIPAddr = NULL;
 DWORD ErrRet = 0;
    /* assign memory for call to GetNetworkParams */
    pFixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
    netOutBufLen = sizeof(FIXED_INFO);
    /* assign memory for call to GetAdapterInfo */
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
    adaptOutBufLen = sizeof(IP_ADAPTER_INFO);
    /* set required buffer size */
    if(GetNetworkParams(pFixedInfo, &netOutBufLen) == ERROR_BUFFER_OVERFLOW)
 {
        GlobalFree(pFixedInfo);
        pFixedInfo = (FIXED_INFO *) GlobalAlloc(GPTR, netOutBufLen);
    }
    /* set required buffer size */
    if (GetAdaptersInfo( pAdapterInfo, &adaptOutBufLen) == ERROR_BUFFER_OVERFLOW)
 {
       free(pAdapterInfo);
       pAdapterInfo = (IP_ADAPTER_INFO *) malloc (adaptOutBufLen);
    }
    if ((ErrRet = GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen)) != NO_ERROR)
 {
  _tprintf(_T("GetAdaptersInfo failed : "));
  DoFormatMessage(ErrRet);
  return EXIT_FAILURE;
 }
    if ((ErrRet = GetNetworkParams(pFixedInfo, &netOutBufLen)) != NO_ERROR)
 {
  _tprintf(_T("GetNetworkParams failed : "));
  DoFormatMessage(ErrRet);
  return EXIT_FAILURE;
 }
   
    pAdapter = pAdapterInfo;
        //HKEY hKey;
        //LPCTSTR lpSubKey = _T("SYSTEM\\ControlSet\\Control\\Network");
    _tprintf(_T("\n1jjk Configuration\n\n"));

    if (bAll)
    {
        _tprintf(_T("\tHost Name . . . . . . . . . . . . : %s\n"), pFixedInfo->HostName);
        _tprintf(_T("\tPrimary DNS Suffix. . . . . . . . : \n"));
        _tprintf(_T("\tNode Type . . . . . . . . . . . . : %s\n"), GetNodeTypeName(pFixedInfo->NodeType));
        if (pFixedInfo->EnableRouting)
            _tprintf(_T("\tIP Routing Enabled. . . . . . . . : Yes\n"));
        else
            _tprintf(_T("\tIP Routing Enabled. . . . . . . . : No\n"));
        if (pAdapter->HaveWins)
            _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : Yes\n"));
        else
            _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : No\n"));
        _tprintf(_T("\tDNS Suffix Search List. . . . . . : %s\n"), pFixedInfo->DomainName);
    }
 while (pAdapter)
 {
        _tprintf(_T("\n%s ...... : \n\n"), GetInterfaceTypeName(pAdapter->Type));
       
        /* check if the adapter is connected to the media */
        if (_tcscmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") == 0)
        {
            _tprintf(_T("\tMedia State . . . . . . . . . . . : Media disconnected\n"));
            pAdapter = pAdapter->Next;
            continue;
        }
       
        _tprintf(_T("\tConnection-specific DNS Suffix. . : %s\n"), pFixedInfo->DomainName);
        if (bAll)
        {
            _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), pAdapter->Description);
            _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter->Address));
            if (pAdapter->DhcpEnabled)
                _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n"));
            else
                _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : No\n"));
            _tprintf(_T("\tAutoconfiguration Enabled . . . . : \n"));
        }
        _tprintf(_T("\tIP Address. . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpAddress.String);
        _tprintf(_T("\tSubnet Mask . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpMask.String);
        _tprintf(_T("\tDefault Gateway . . . . . . . . . : %s\n"), pAdapter->GatewayList.IpAddress.String);
        if (bAll)
        {
            if (pAdapter->DhcpEnabled)
               _tprintf(_T("\tDHCP Server . . . . . . . . . . . : %s\n"), pAdapter->DhcpServer.IpAddress.String);
            _tprintf(_T("\tDNS Servers . . . . . . . . . . . : "));
            _tprintf(_T("%s\n"), pFixedInfo->DnsServerList.IpAddress.String);
            pIPAddr = pFixedInfo -> DnsServerList.Next;
            while (pIPAddr)
            {
                _tprintf(_T("\t\t\t\t\t    %s\n"), pIPAddr ->IpAddress.String );
                pIPAddr = pIPAddr ->Next;
            }
            if (pAdapter->HaveWins)
            {
                _tprintf(_T("\tPrimary WINS Server . . . . . . . : %s\n"), pAdapter->PrimaryWinsServer.IpAddress.String);
                _tprintf(_T("\tSecondard WINS Server . . . . . . : %s\n"), pAdapter->SecondaryWinsServer.IpAddress.String);
            }
            if (pAdapter->DhcpEnabled)
            {
                _tprintf(_T("\tLease Obtained. . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter->LeaseObtained)));
                _tprintf(_T("\tLease Expires . . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter->LeaseExpires)));
            }
        }
        _tprintf(_T("\n"));
       
  pAdapter = pAdapter->Next;
    }
 
    return 0;
}
 
//以上是或者我们在ipconfig时的信息,在win下可以看到的
INT Release(TCHAR Index)
{
    IP_ADAPTER_INDEX_MAP AdapterInfo;
    DWORD dwRetVal = 0;
    /* if interface is not given, query GetInterfaceInfo */
    if (Index == (TCHAR)NULL)
    {
        PIP_INTERFACE_INFO pInfo;
        ULONG ulOutBufLen;
        pInfo = (IP_INTERFACE_INFO *) malloc(sizeof(IP_INTERFACE_INFO));
        ulOutBufLen = 0;
        /* Make an initial call to GetInterfaceInfo to get
         * the necessary size into the ulOutBufLen variable */
        if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER)
        {
            GlobalFree(pInfo);
            pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen);
        }
        /* Make a second call to GetInterfaceInfo to get the actual data we want */
        if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR )
        {
            AdapterInfo = pInfo->Adapter[0];
            _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name);
        }
        else
        {
            _tprintf(_T("\nGetInterfaceInfo failed : "));
            DoFormatMessage(dwRetVal);
        }
    }
    else
    {
        ;
        /* we need to be able to release connections by name with support for globbing
         * i.e. ipconfig /release Eth* will release all cards starting with Eth...
         *      ipconfig /release *con* will release all cards with 'con' in their name
         */
    }

    /* Call IpReleaseAddress to release the IP address on the specified adapter. */
    if ((dwRetVal = IpReleaseAddress(&AdapterInfo)) != NO_ERROR)
    {
        _tprintf(_T("\nAn error occured while releasing interface %s : "), _T("*name*"));
        DoFormatMessage(dwRetVal);
    }
    return 0;
}
 

INT Renew(TCHAR Index)
{
    IP_ADAPTER_INDEX_MAP AdapterInfo;
    DWORD dwRetVal = 0;
    /* if interface is not given, query GetInterfaceInfo */
    if (Index == (TCHAR)NULL)
    {
        PIP_INTERFACE_INFO pInfo;
        ULONG ulOutBufLen;
        pInfo = (IP_INTERFACE_INFO *) malloc(sizeof(IP_INTERFACE_INFO));
        ulOutBufLen = 0;
        /* Make an initial call to GetInterfaceInfo to get
         * the necessary size into the ulOutBufLen variable */
        if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER)
        {
            GlobalFree(pInfo);
            pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen);
        }
        /* Make a second call to GetInterfaceInfo to get the actual data we want */
        if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR )
        {
            AdapterInfo = pInfo->Adapter[0];
            _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name);
        } else {
            _tprintf(_T("\nGetInterfaceInfo failed : "));
            DoFormatMessage(dwRetVal);
        }
    }
    else
    {
        ;
        /* we need to be able to renew connections by name with support for globbing
         * i.e. ipconfig /renew Eth* will renew all cards starting with Eth...
         *      ipconfig /renew *con* will renew all cards with 'con' in their name
         */
    }

    /* Call IpRenewAddress to renew the IP address on the specified adapter. */
    if ((dwRetVal = IpRenewAddress(&AdapterInfo)) != NO_ERROR)
    {
        _tprintf(_T("\nAn error occured while renew interface %s : "), _T("*name*"));
        DoFormatMessage(dwRetVal);
    }
    return 0;
}
/* temp func for testing purposes */
VOID Info()
{
     // Declare and initialize variables
    PIP_INTERFACE_INFO pInfo;
    ULONG ulOutBufLen;
    DWORD dwRetVal;
    pInfo = (IP_INTERFACE_INFO *) malloc( sizeof(IP_INTERFACE_INFO) );
    ulOutBufLen = sizeof(IP_INTERFACE_INFO);
    dwRetVal = 0;

    // Make an initial call to GetInterfaceInfo to get
    // the necessary size in the ulOutBufLen variable
    if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER)
    {
        free(pInfo);
        pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen);
    }
    // Make a second call to GetInterfaceInfo to get
    // the actual data we need
    if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR )
    {
        int i;
        for (i=0; iNumAdapters; i++)
        {
            printf("\tAdapter Name: %S\n", pInfo->Adapter[i].Name);
            printf("\tAdapter Index: %ld\n", pInfo->Adapter[i].Index);
            printf("\tNum Adapters: %ld\n", pInfo->NumAdapters);
        }
    }
    else
    {
        printf("GetInterfaceInfo failed.\n");
        DoFormatMessage(dwRetVal);
    }
}

VOID Usage(VOID)
{
    _tprintf(_T("\nUSAGE:\n"
    "    ipconfig [/? | /all | /renew [adapter] | /release [adapter] |\n"
    "              /flushdns | /displaydns | /registerdns |\n"
    "              /showclassid adapter |\n"
    "              /setclassid adapter [classid] ]\n"
    "\n"
    "where\n"
    "    adapter         Connection name\n"
    "                   (wildcard characters * and ? allowed, see examples)\n"
    "\n"
    "    Options:\n"
    "       /?           Display this help message\n"
    "       /all         Display full configuration information.\n"
    "       /release     Release the IP address for the specified adapter.\n"
    "       /renew       Renew the IP address for the specified adapter.\n"
    "       /flushdns    Purges the DNS Resolver cache.\n"
    "       /registerdns Refreshes all DHCP leases and re-registers DNS names.\n"
    "       /displaydns  Display the contents of the DNS Resolver Cache.\n"
    "       /showclassid Displays all the dhcp class IDs allowed for adapter.\n"
    "       /setclassid  Modifies the dhcp class id.\n"
    "\n"
    "The default is to display only the IP address, subnet mask and\n"
    "default gateway for each adapter bound to TCP/IP.\n"
    "\n"
    "For Release and Renew, if no adapter name is specified, then the IP address\n"
    "leases for all adapters bound to TCP/IP will be released or renewed.\n"
    "\n"
    "For Setclassid, if no ClassId is specified, then the ClassId is removed.\n"
    "\n"
    "Examples:\n"
    "    > ipconfig                   ... Show information.\n"
    "    > ipconfig /all              ... Show detailed information\n"
    "    > ipconfig /renew            ... renew all adapters\n"
    "    > ipconfig /renew EL*        ... renew any connection that has its\n"
    "                                     name starting with EL\n"
    "    > ipconfig /release *Con*    ... release all matching connections,\n"
    "                                     eg. \"Local Area Connection 1\" or\n"
    "                                         \"Local Area Connection 2\"\n"));
}
int main(int argc, char *argv[])
{
    BOOL DoUsage=FALSE;
    BOOL DoAll=FALSE;
    BOOL DoRelease=FALSE;
    BOOL DoRenew=FALSE;
    BOOL DoFlushdns=FALSE;
    BOOL DoRegisterdns=FALSE;
    BOOL DoDisplaydns=FALSE;
    BOOL DoShowclassid=FALSE;
    BOOL DoSetclassid=FALSE;
    /* Parse command line for options we have been given. */
    if ( (argc > 1)&&(argv[1][0]=='/') )
    {
        if( !_tcsicmp( &argv[1][1], _T("?") ))
        {
            DoUsage = TRUE;
        }
        else if( !_tcsnicmp( &argv[1][1], _T("ALL"), _tcslen(&argv[1][1]) ))
        {
           DoAll = TRUE;
        }
        else if( !_tcsnicmp( &argv[1][1], _T("RELEASE"), _tcslen(&argv[1][1]) ))
        {
            DoRelease = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("RENEW"), _tcslen(&argv[1][1]) ))
        {
            DoRenew = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("FLUSHDNS"), _tcslen(&argv[1][1]) ))
        {
            DoFlushdns = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("FLUSHREGISTERDNS"), _tcslen(&argv[1][1]) ))
        {
            DoRegisterdns = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("DISPLAYDNS"), _tcslen(&argv[1][1]) ))
        {
            DoDisplaydns = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("SHOWCLASSID"), _tcslen(&argv[1][1]) ))
        {
            DoShowclassid = TRUE;
        }
        else if( ! _tcsnicmp( &argv[1][1], _T("SETCLASSID"), _tcslen(&argv[1][1]) ))
        {
            DoSetclassid = TRUE;
        }
    }
    switch (argc)
    {
        case 1:  /* Default behaviour if no options are given*/
            ShowInfo(FALSE);
            break;
        case 2:  /* Process all the options that take no paramiters */
            if (DoUsage)
                Usage();
            else if (DoAll)
                ShowInfo(TRUE);
            else if (DoRelease)
                Release((TCHAR)NULL);
            else if (DoRenew)
                Renew((TCHAR)NULL);
            else if (DoFlushdns)
                _tprintf(_T("\nSorry /flushdns is not implemented yet\n"));
            else if (DoRegisterdns)
                _tprintf(_T("\nSorry /registerdns is not implemented yet\n"));
            else if (DoDisplaydns)
                _tprintf(_T("\nSorry /displaydns is not implemented yet\n"));
            else
                Usage();
            break;
        case 3: /* Process all the options that can have 1 paramiters */
            if (DoRelease)
                _tprintf(_T("\nSorry /release [adapter] is not implemented yet\n"));
                //Release(argv[2]);
            else if (DoRenew)
                _tprintf(_T("\nSorry /renew [adapter] is not implemented yet\n"));
            else if (DoShowclassid)
                _tprintf(_T("\nSorry /showclassid adapter is not implemented yet\n"));
            else if (DoSetclassid)
                _tprintf(_T("\nSorry /setclassid adapter is not implemented yet\n"));
            else
                Usage();
            break;
        case 4:  /* Process all the options that can have 2 paramiters */
            if (DoSetclassid)
                _tprintf(_T("\nSorry /setclassid adapter [classid]is not implemented yet\n"));
            else
                Usage();
            break;
        default:
            Usage();
    }
    return 0;
}
 
 

 
阅读(2227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~