亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? adapter.c

?? ReactOS是一些高手根據Windows XP的內核編寫出的類XP。內核實現機理和API函數調用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統內核的人可以看一看。
?? C
字號:
#include "rosdhcp.h"

static SOCKET DhcpSocket = INVALID_SOCKET;
static LIST_ENTRY AdapterList;
static WSADATA wsd;
extern struct interface_info *ifi;

PCHAR *GetSubkeyNames( PCHAR MainKeyName, PCHAR Append ) {
    int i = 0;
    DWORD Error;
    HKEY MainKey;
    PCHAR *Out, OutKeyName;
    DWORD CharTotal = 0, AppendLen = 1 + strlen(Append);
    DWORD MaxSubKeyLen = 0, MaxSubKeys = 0;

    Error = RegOpenKey( HKEY_LOCAL_MACHINE, MainKeyName, &MainKey );

    if( Error ) return NULL;

    Error = RegQueryInfoKey
        ( MainKey,
          NULL, NULL, NULL,
          &MaxSubKeys, &MaxSubKeyLen,
          NULL, NULL, NULL, NULL, NULL, NULL );

    DH_DbgPrint(MID_TRACE,("MaxSubKeys: %d, MaxSubKeyLen %d\n",
                           MaxSubKeys, MaxSubKeyLen));

    CharTotal = (sizeof(PCHAR) + MaxSubKeyLen + AppendLen) * (MaxSubKeys + 1);

    DH_DbgPrint(MID_TRACE,("AppendLen: %d, CharTotal: %d\n",
                           AppendLen, CharTotal));

    Out = (CHAR**) malloc( CharTotal );
    OutKeyName = ((PCHAR)&Out[MaxSubKeys+1]);

    if( !Out ) { RegCloseKey( MainKey ); return NULL; }

    i = 0;
    do {
        Out[i] = OutKeyName;
        Error = RegEnumKey( MainKey, i, OutKeyName, MaxSubKeyLen );
        if( !Error ) {
            strcat( OutKeyName, Append );
            DH_DbgPrint(MID_TRACE,("[%d]: %s\n", i, OutKeyName));
            OutKeyName += strlen(OutKeyName) + 1;
            i++;
        } else Out[i] = 0;
    } while( Error == ERROR_SUCCESS );

    RegCloseKey( MainKey );

    return Out;
}

PCHAR RegReadString( HKEY Root, PCHAR Subkey, PCHAR Value ) {
    PCHAR SubOut = NULL;
    DWORD SubOutLen = 0, Error = 0;
    HKEY  ValueKey = NULL;

    DH_DbgPrint(MID_TRACE,("Looking in %x:%s:%s\n", Root, Subkey, Value ));

    if( Subkey && strlen(Subkey) ) {
        if( RegOpenKey( Root, Subkey, &ValueKey ) != ERROR_SUCCESS )
            goto regerror;
    } else ValueKey = Root;

    DH_DbgPrint(MID_TRACE,("Got Key %x\n", ValueKey));

    if( (Error = RegQueryValueEx( ValueKey, Value, NULL, NULL,
                                  (LPBYTE)SubOut, &SubOutLen )) != ERROR_SUCCESS )
        goto regerror;

    DH_DbgPrint(MID_TRACE,("Value %s has size %d\n", Value, SubOutLen));

    if( !(SubOut = (CHAR*) malloc(SubOutLen)) )
        goto regerror;

    if( (Error = RegQueryValueEx( ValueKey, Value, NULL, NULL,
                                  (LPBYTE)SubOut, &SubOutLen )) != ERROR_SUCCESS )
        goto regerror;

    DH_DbgPrint(MID_TRACE,("Value %s is %s\n", Value, SubOut));

    goto cleanup;

regerror:
    if( SubOut ) free( SubOut );
cleanup:
    if( ValueKey && ValueKey != Root ) {
        DH_DbgPrint(MID_TRACE,("Closing key %x\n", ValueKey));
        RegCloseKey( ValueKey );
    }

    DH_DbgPrint(MID_TRACE,("Returning %x with error %d\n", SubOut, Error));

    return SubOut;
}

HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) {
    int i = 0;
    PCHAR EnumKeyName =
        "SYSTEM\\CurrentControlSet\\Control\\Class\\"
        "{4D36E972-E325-11CE-BFC1-08002BE10318}";
    PCHAR TargetKeyNameStart =
        "SYSTEM\\CurrentControlSet\\Services\\";
    PCHAR TargetKeyNameEnd = "\\Parameters\\Tcpip";
    PCHAR TargetKeyName = NULL;
    PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" );
    PCHAR *EnumKeysTop     = GetSubkeyNames( EnumKeyName, "" );
    PCHAR RootDevice = NULL, DriverDesc = NULL;
    HKEY EnumKey, OutKey = NULL;
    DWORD Error = ERROR_SUCCESS;

    if( !EnumKeysLinkage || !EnumKeysTop ) goto cleanup;

    Error = RegOpenKey( HKEY_LOCAL_MACHINE, EnumKeyName, &EnumKey );

    if( Error ) goto cleanup;

    for( i = 0; EnumKeysLinkage[i]; i++ ) {
        RootDevice = RegReadString
            ( EnumKey, EnumKeysLinkage[i], "RootDevice" );
        DriverDesc = RegReadString
            ( EnumKey, EnumKeysTop[i], "DriverDesc" );

        if( DriverDesc &&
            RootDevice &&
            !strcmp( DriverDesc, Adapter->DhclientInfo.name ) ) {
            TargetKeyName =
                (CHAR*) malloc( strlen( TargetKeyNameStart ) +
                        strlen( RootDevice ) +
                        strlen( TargetKeyNameEnd ) + 1 );
            if( !TargetKeyName ) goto cleanup;
            sprintf( TargetKeyName, "%s%s%s",
                     TargetKeyNameStart, RootDevice, TargetKeyNameEnd );
            Error = RegOpenKey( HKEY_LOCAL_MACHINE, TargetKeyName, &OutKey );
            break;
        } else {
            free( RootDevice ); RootDevice = 0;
            free( DriverDesc ); DriverDesc = 0;
        }
    }

cleanup:
    if( RootDevice ) free( RootDevice );
    if( DriverDesc ) free( DriverDesc );
    if( EnumKeysLinkage ) free( EnumKeysLinkage );
    if( EnumKeysTop ) free( EnumKeysTop );
    if( TargetKeyName ) free( TargetKeyName );

    return OutKey;
}

BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
    HKEY AdapterKey = NULL;
    PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL;
    NTSTATUS Status = STATUS_SUCCESS;
    DWORD Error = ERROR_SUCCESS;
    MIB_IPFORWARDROW DefGatewayRow;

    Adapter->DhclientState.config = &Adapter->DhclientConfig;
    strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr,
            sizeof(Adapter->DhclientInfo.name));

    AdapterKey = FindAdapterKey( Adapter );
    if( AdapterKey )
        IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" );

    if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) {
        /* Non-automatic case */
        DH_DbgPrint
            (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n",
                        Adapter->DhclientInfo.name,
                        Adapter->BindStatus,
                        IPAddress));

        Adapter->DhclientState.state = S_STATIC;

        Netmask = RegReadString( AdapterKey, NULL, "Subnetmask" );
        if( !Netmask ) Netmask = "255.255.255.0";

        Status = AddIPAddress( inet_addr( IPAddress ),
                               inet_addr( Netmask ),
                               Adapter->IfMib.dwIndex,
                               &Adapter->NteContext,
                               &Adapter->NteInstance );

        DefaultGateway = RegReadString( AdapterKey, NULL, "DefaultGateway" );

        if( DefaultGateway ) {
            DefGatewayRow.dwForwardDest = 0;
            DefGatewayRow.dwForwardMask = 0;
            DefGatewayRow.dwForwardMetric1 = 1;
            DefGatewayRow.dwForwardNextHop = inet_addr(DefaultGateway);
            Error = CreateIpForwardEntry( &DefGatewayRow );
            if( Error )
                warning("Failed to set default gateway %s: %ld\n",
                        DefaultGateway, Error);
        }

        if( DefaultGateway ) free( DefaultGateway );
        if( Netmask ) free( Netmask );
    } else {
        /* Automatic case */
        DH_DbgPrint
            (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n",
                        Adapter->DhclientInfo.name,
                        Adapter->BindStatus));
    }

    if( IPAddress ) free( IPAddress );

    return TRUE;
}

/*
 * XXX Figure out the way to bind a specific adapter to a socket.
 */

void AdapterInit() {
    PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
    DWORD Error, Size, i;
    PDHCP_ADAPTER Adapter = NULL;

    WSAStartup(0x0101,&wsd);

    InitializeListHead( &AdapterList );

    DH_DbgPrint(MID_TRACE,("Getting Adapter List...\n"));

    while( (Error = GetIfTable(Table, &Size, 0 )) ==
           ERROR_INSUFFICIENT_BUFFER ) {
        DH_DbgPrint(MID_TRACE,("Error %d, New Buffer Size: %d\n", Error, Size));
        free( Table );
        Table = (PMIB_IFTABLE) malloc( Size );
    }

    if( Error != NO_ERROR ) goto term;

    DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));

    for( i = 0; i < Table->dwNumEntries; i++ ) {
        DH_DbgPrint(MID_TRACE,("Getting adapter %d attributes\n",
                               Table->table[i].dwIndex));
        Adapter = (DHCP_ADAPTER*) calloc( sizeof( DHCP_ADAPTER ) + Table->table[i].dwMtu, 1 );

        if( Adapter && Table->table[i].dwType == MIB_IF_TYPE_ETHERNET ) {
            memcpy( &Adapter->IfMib, &Table->table[i],
                    sizeof(Adapter->IfMib) );
            Adapter->DhclientInfo.client = &Adapter->DhclientState;
            Adapter->DhclientInfo.rbuf = Adapter->recv_buf;
            Adapter->DhclientInfo.rbuf_max = Table->table[i].dwMtu;
            Adapter->DhclientInfo.rbuf_len =
                Adapter->DhclientInfo.rbuf_offset = 0;
            memcpy(Adapter->DhclientInfo.hw_address.haddr,
                   Adapter->IfMib.bPhysAddr,
                   Adapter->IfMib.dwPhysAddrLen);
            Adapter->DhclientInfo.hw_address.hlen  =
                Adapter->IfMib.dwPhysAddrLen;
            /* I'm not sure where else to set this, but
               some DHCP servers won't take a zero.
               We checked the hardware type earlier in
               the if statement. */
            Adapter->DhclientInfo.hw_address.htype  =
                HTYPE_ETHER;

            if( DhcpSocket == INVALID_SOCKET ) {
                DhcpSocket =
                    Adapter->DhclientInfo.rfdesc =
                    Adapter->DhclientInfo.wfdesc =
                    socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
                Adapter->ListenAddr.sin_family = AF_INET;
                Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
                Adapter->BindStatus =
                    (bind( Adapter->DhclientInfo.rfdesc,
                           (struct sockaddr *)&Adapter->ListenAddr,
                           sizeof(Adapter->ListenAddr) ) == 0) ?
                    0 : WSAGetLastError();
            } else {
                Adapter->DhclientInfo.rfdesc =
                    Adapter->DhclientInfo.wfdesc = DhcpSocket;
            }

            Adapter->DhclientConfig.timeout = DHCP_PANIC_TIMEOUT;
            Adapter->DhclientConfig.initial_interval = DHCP_DISCOVER_INTERVAL;
            Adapter->DhclientConfig.retry_interval = DHCP_DISCOVER_INTERVAL;
            Adapter->DhclientConfig.select_interval = 1;
            Adapter->DhclientConfig.reboot_timeout = DHCP_REBOOT_TIMEOUT;
            Adapter->DhclientConfig.backoff_cutoff = DHCP_BACKOFF_MAX;
            Adapter->DhclientState.interval =
                Adapter->DhclientConfig.retry_interval;

            if( PrepareAdapterForService( Adapter ) ) {
                Adapter->DhclientInfo.next = ifi;
                ifi = &Adapter->DhclientInfo;
                InsertTailList( &AdapterList, &Adapter->ListEntry );
            } else { free( Adapter ); Adapter = 0; }
        } else { free( Adapter ); Adapter = 0; }

        if( !Adapter )
            DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n",
                                   Table->table[i].dwIndex));
    }

    DH_DbgPrint(MID_TRACE,("done with AdapterInit\n"));

term:
    if( Table ) free( Table );
}

void AdapterStop() {
    PLIST_ENTRY ListEntry;
    PDHCP_ADAPTER Adapter;
    while( !IsListEmpty( &AdapterList ) ) {
        ListEntry = (PLIST_ENTRY)RemoveHeadList( &AdapterList );
        Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
        free( Adapter );
    }
    WSACleanup();
}

PDHCP_ADAPTER AdapterFindIndex( unsigned int indx ) {
    PDHCP_ADAPTER Adapter;
    PLIST_ENTRY ListEntry;

    for( ListEntry = AdapterList.Flink;
         ListEntry != &AdapterList;
         ListEntry = ListEntry->Flink ) {
        Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
        if( Adapter->IfMib.dwIndex == indx ) return Adapter;
    }

    return NULL;
}

PDHCP_ADAPTER AdapterFindName( const WCHAR *name ) {
    PDHCP_ADAPTER Adapter;
    PLIST_ENTRY ListEntry;

    for( ListEntry = AdapterList.Flink;
         ListEntry != &AdapterList;
         ListEntry = ListEntry->Flink ) {
        Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
        if( !wcsicmp( Adapter->IfMib.wszName, name ) ) return Adapter;
    }

    return NULL;
}

PDHCP_ADAPTER AdapterFindInfo( struct interface_info *ip ) {
    PDHCP_ADAPTER Adapter;
    PLIST_ENTRY ListEntry;

    for( ListEntry = AdapterList.Flink;
         ListEntry != &AdapterList;
         ListEntry = ListEntry->Flink ) {
        Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
        if( ip == &Adapter->DhclientInfo ) return Adapter;
    }

    return NULL;
}

PDHCP_ADAPTER AdapterGetFirst() {
    if( IsListEmpty( &AdapterList ) ) return NULL; else {
        return CONTAINING_RECORD
            ( AdapterList.Flink, DHCP_ADAPTER, ListEntry );
    }
}

PDHCP_ADAPTER AdapterGetNext( PDHCP_ADAPTER This )
{
    if( This->ListEntry.Flink == &AdapterList ) return NULL;
    return CONTAINING_RECORD
        ( This->ListEntry.Flink, DHCP_ADAPTER, ListEntry );
}

void if_register_send(struct interface_info *ip) {

}

void if_register_receive(struct interface_info *ip) {
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国v欧美v日本v亚洲v| 久久精品噜噜噜成人av农村| 欧美乱熟臀69xxxxxx| 99久久综合精品| 亚洲欧美激情视频在线观看一区二区三区 | 欧美人xxxx| 成人精品视频一区二区三区| 韩日av一区二区| 一区二区高清视频在线观看| 日韩精品在线网站| 欧美丰满美乳xxx高潮www| 美国十次了思思久久精品导航| 欧美va亚洲va| 色婷婷av久久久久久久| 一区二区三区日韩| 久久久久9999亚洲精品| 日韩免费视频一区二区| 亚洲综合免费观看高清完整版在线 | 亚洲福利电影网| 免费成人在线观看视频| 色综合天天综合给合国产| 日本大香伊一区二区三区| 国产在线精品一区二区夜色| 精品一区二区久久| 国模少妇一区二区三区| 另类欧美日韩国产在线| 久久97超碰国产精品超碰| 国产成人亚洲综合色影视| 成人av先锋影音| 蜜臀av亚洲一区中文字幕| 91精品国产综合久久小美女| 91精品国产高清一区二区三区| 91精品国产欧美一区二区成人 | 东方aⅴ免费观看久久av| 99精品热视频| 欧美日韩国产乱码电影| 欧美一区二区三区精品| 久久久久久久综合日本| 亚洲情趣在线观看| 亚洲午夜精品久久久久久久久| 视频一区国产视频| 国产一区二区在线观看免费| 99精品在线观看视频| 色94色欧美sute亚洲13| 精品免费国产二区三区| 国产精品网站在线| 亚洲国产aⅴ成人精品无吗| 久久成人18免费观看| 成人精品视频一区二区三区尤物| 欧美三级中文字幕在线观看| 精品国产污污免费网站入口 | 精品午夜久久福利影院| 99久久综合狠狠综合久久| 欧美日韩精品免费观看视频| 久久众筹精品私拍模特| 一区二区三区在线观看动漫| 精品一区二区影视| 91国产福利在线| 国产日产亚洲精品系列| 亚洲va天堂va国产va久| 国产精品一区二区久久精品爱涩 | jizzjizzjizz欧美| 欧美喷水一区二区| 中文一区二区在线观看| 天堂久久久久va久久久久| 成人听书哪个软件好| 欧美大胆人体bbbb| 亚洲一区二区三区四区在线免费观看| 国产成人在线视频网站| 91精品啪在线观看国产60岁| 国产午夜精品久久| 一本大道久久a久久精品综合| 亚洲私人黄色宅男| 日韩成人一级片| 97精品国产露脸对白| 国产精品青草综合久久久久99| 奇米一区二区三区| 欧美视频中文一区二区三区在线观看| 欧美成人在线直播| 婷婷开心久久网| 欧美视频完全免费看| 亚洲免费av网站| 欧美无乱码久久久免费午夜一区| 久久久www成人免费毛片麻豆| 免费黄网站欧美| 精品国产一区二区精华| 国产福利一区二区三区在线视频| 欧美岛国在线观看| 国产精品一区在线| 久久久久久久电影| 99re这里只有精品视频首页| 91成人国产精品| 91一区二区三区在线播放| 欧美激情在线一区二区三区| 精品视频1区2区3区| 欧美专区亚洲专区| 亚洲老妇xxxxxx| 国产麻豆精品theporn| 精品国产免费人成电影在线观看四季 | 91免费在线看| 久久婷婷一区二区三区| 欧美三级电影在线观看| 国产一区二区三区综合| 欧美一区在线视频| 麻豆免费精品视频| 欧美日韩精品一区二区| 日本美女一区二区| 99久久国产综合精品色伊| 亚洲精品欧美激情| 日韩一级在线观看| 国产福利不卡视频| 中文字幕欧美区| av毛片久久久久**hd| 狠狠色丁香久久婷婷综合_中| 亚洲品质自拍视频| 一二三区精品福利视频| 欧美视频一区二区在线观看| 国产成人免费在线视频| 国产精品美女www爽爽爽| 国产精品18久久久久久久网站| 国产日韩精品一区二区浪潮av| 色8久久人人97超碰香蕉987| 国产91精品露脸国语对白| 天天免费综合色| 亚洲一卡二卡三卡四卡五卡| 亚洲高清视频的网址| 亚洲一区二区三区四区五区中文| 亚洲一二三四久久| av在线不卡免费看| 欧美无砖专区一中文字| 中文字幕精品综合| 日韩av在线免费观看不卡| 激情成人综合网| 一本一道波多野结衣一区二区| 成人综合婷婷国产精品久久蜜臀 | 欧美国产视频在线| 欧美亚洲愉拍一区二区| jlzzjlzz亚洲日本少妇| 成人毛片在线观看| 青青草97国产精品免费观看 | 欧洲精品一区二区三区在线观看| 国产精品麻豆久久久| 欧美精品在线视频| 久久综合九色综合97婷婷| 国产精品美女久久久久久久久久久 | 一区二区中文视频| 国产精品人人做人人爽人人添| 亚洲精品综合在线| 中文字幕亚洲区| 最新高清无码专区| 亚洲国产一区二区三区| 91精品国产综合久久小美女| 日韩精品一区二区在线观看| 国产精品免费视频一区| 久久久国产精品午夜一区ai换脸| 亚洲欧美二区三区| 91免费观看在线| 精品99一区二区| 亚洲欧美日韩国产另类专区| 一本色道**综合亚洲精品蜜桃冫| 制服丝袜亚洲色图| 日韩精品免费视频人成| 欧美色综合天天久久综合精品| 中文字幕人成不卡一区| 成人黄色综合网站| 怡红院av一区二区三区| 欧美激情资源网| 亚洲一区影音先锋| 亚洲成av人片| 免费成人你懂的| 色综合久久六月婷婷中文字幕| 91.成人天堂一区| 中文字幕在线不卡国产视频| 亚洲电影中文字幕在线观看| 国产福利不卡视频| 久久久久亚洲蜜桃| 亚洲视频网在线直播| 蜜臀va亚洲va欧美va天堂| 国模大尺度一区二区三区| 在线播放日韩导航| 日韩欧美精品在线视频| 日韩avvvv在线播放| 国产成人自拍在线| 欧美麻豆精品久久久久久| 国产精品久久久久影视| 国产中文字幕精品| 精品国产一区二区三区av性色| 国产亚洲精品资源在线26u| 亚洲午夜成aⅴ人片| 国产精品一二三四| 2014亚洲片线观看视频免费| 久久99精品网久久| 中文字幕免费观看一区| 久久久国际精品| 蜜桃视频一区二区三区在线观看 | 一区二区在线观看视频| 欧美中文字幕不卡| 成人免费三级在线| 日本vs亚洲vs韩国一区三区二区| 自拍偷自拍亚洲精品播放|