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

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

?? dhcp.c

?? wince3.0的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*****************************************************************************/
/**								Microsoft Windows							**/
/**   Copyright (c) 1997-2000 Microsoft Corporation.  All rights reserved.  **/
/*****************************************************************************/

/*
	dhcp.c

  DESCRIPTION:



*/

#include "dhcpp.h"
#include "dhcp.h"
#include "protocol.h"
#include "netui.h"

BOOL		v_fWorkerThread;
DhcpInfo	*v_pWaitingList;
DhcpInfo	*v_pEstablishedList;
DhcpInfo	*v_pCurrent;
DhcpInfo	*v_pDelete;
DEFINE_LOCK_STRUCTURE(v_GlobalListLock)

#define DEFAULT_MAX_RETRIES		2
#define DEFAULT_RETRY_DIALOGUE	2
#define DEFAULT_INIT_DELAY		10000		// 10 secs

// local externs
extern void ProcessT1(DhcpInfo *pDhcp);
extern void ProcessT2(DhcpInfo *pDhcp);

void mul64_32_64(const FILETIME *lpnum1, DWORD num2, LPFILETIME lpres) {
	__int64 num1;
	num1 = (__int64)lpnum1->dwLowDateTime * (__int64)num2;
	num1 += ((__int64)lpnum1->dwHighDateTime * (__int64)num2)<<32;
	lpres->dwHighDateTime = (DWORD)(num1>>32);
	lpres->dwLowDateTime = (DWORD)(num1&0xffffffff);
}

void add64_32_64(const FILETIME *lpnum1, DWORD num2, LPFILETIME lpres) {
	DWORD bottom = lpnum1->dwLowDateTime + num2;
	lpres->dwHighDateTime = lpnum1->dwHighDateTime +
		(bottom < lpnum1->dwLowDateTime ? 1 : 0);
	lpres->dwLowDateTime = bottom;
}

#ifdef THUMB
#pragma optimize("",off)
#endif
void add64_64_64(const FILETIME *lpnum1, LPFILETIME lpnum2, LPFILETIME lpres) {
	__int64 num1, num2;
	num1 = (((__int64)lpnum1->dwHighDateTime)<<32)+(__int64)lpnum1->dwLowDateTime;
	num2 = (((__int64)lpnum2->dwHighDateTime)<<32)+(__int64)lpnum2->dwLowDateTime;
	num1 += num2;
	lpres->dwHighDateTime = (DWORD)(num1>>32);
	lpres->dwLowDateTime = (DWORD)(num1&0xffffffff);
}

void sub64_64_64(const FILETIME *lpnum1, LPFILETIME lpnum2, LPFILETIME lpres) {
	__int64 num1, num2;
	num1 = (((__int64)lpnum1->dwHighDateTime)<<32)+(__int64)lpnum1->dwLowDateTime;
	num2 = (((__int64)lpnum2->dwHighDateTime)<<32)+(__int64)lpnum2->dwLowDateTime;
	num1 -= num2;
	lpres->dwHighDateTime = (DWORD)(num1>>32);
	lpres->dwLowDateTime = (DWORD)(num1&0xffffffff);
}
#ifdef THUMB
#pragma optimize("",on)
#endif

// Unsigned divide
// Divides a 64 bit number by a *31* bit number.  Doesn't work for 32 bit divisors!

void div64_32_64(const FILETIME *lpdividend, DWORD divisor, LPFILETIME lpresult) {
	DWORD bitmask;
	DWORD top;
	FILETIME wholetop = *lpdividend;
	top = 0;
	lpresult->dwHighDateTime = 0;
	for (bitmask = 0x80000000; bitmask; bitmask >>= 1) {
		top = (top<<1) + ((wholetop.dwHighDateTime&bitmask) ? 1 : 0);
		if (top >= divisor) {
			top -= divisor;
			lpresult->dwHighDateTime |= bitmask;
		}
	}
	lpresult->dwLowDateTime = 0;
	for (bitmask = 0x80000000; bitmask; bitmask >>= 1) {
		top = (top<<1) + ((wholetop.dwLowDateTime&bitmask) ? 1 : 0);
		if (top >= divisor) {
			top -= divisor;
			lpresult->dwLowDateTime |= bitmask;
		}
	}
}


//	Len, SubnetMask(1), DomainName(15), Router(3), NB Name Server(44), 
//	NB Node Type(46), NBT Scope (47), DomainServer(6)
unsigned char v_aDftReqOptions[] = 
{7, 0x01, 0x03, 0x06, 0x0f, 0x2c, 0x2e, 0x2f, 0x0};

unsigned int v_cXid;
int	v_fXidInit;

unsigned int GetXid(char *pMacAddr) {
	unsigned int i;

	if (! v_fXidInit) {
		memcpy(&i, pMacAddr + 2, 4);
		v_cXid ^= i;
		v_fXidInit++;
	}

//	CTEGetLock(&v_MiscLock, 0);
	if (i = v_cXid++)
		;
	else	// if it is 0, we increment again!
		i = v_cXid++;
	
//	CTEFreeLock(&v_MiscLock, 0);

	return i;
}	// GetXid()


DhcpInfo *NewDhcpInfo(int cName) {
	DhcpInfo *pDhcp;

	pDhcp = LocalAlloc(LPTR, sizeof(*pDhcp) + cName);
	if (NULL != pDhcp) {
        pDhcp->ARPEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // manual reset
        if (NULL == pDhcp->ARPEvent) {
            DEBUGMSG(ZONE_WARN, (L"DHCP:NewDhcpInfo - CreateEvent failed!\n"));
            LocalFree(pDhcp);
            return NULL;
        }
    
		CTEInitLock(&pDhcp->Lock);
		// technically speaking should be net_long(INADDR_BROADCAST);
		pDhcp->DhcpServer = INADDR_BROADCAST;

        pDhcp->Flags = AUTO_IP_ENABLED_FL;
        pDhcp->AutoInterval = DHPC_IPAUTOCONFIG_DEFAULT_INTERVAL;
        pDhcp->AutoMask = DHCP_IPAUTOCONFIGURATION_DEFAULT_MASK;
        pDhcp->AutoSubnet = DHCP_IPAUTOCONFIGURATION_DEFAULT_SUBNET;
	}
	DEBUGMSG(ZONE_WARN, (TEXT("*NewDhcpInfo: %X\n"), pDhcp));
	return pDhcp;

}	// NewDhcpInfo()


void FreeDhcpInfo(DhcpInfo *pDhcp) {
	DEBUGMSG(ZONE_WARN, (TEXT("*FreeDhcpInfo: %X\n"), pDhcp));
	CTEStopFTimer(&pDhcp->Timer);
	CTEDeleteLock(&pDhcp->Lock);
	if (pDhcp->pSendOptions) {
		LocalFree(pDhcp->pSendOptions);
	}
    if (pDhcp->ARPEvent) {
        CloseHandle(pDhcp->ARPEvent);
    }
	LocalFree(pDhcp);
}	// FreeDhcpInfo()

// assumes pDhcp->Lock is NOT held
// it gets the v_GlobalListLock, tries to find a double-ptr to the dhcp
// and gets its lock
// always returns with v_GlobalListLock held
DhcpInfo **_FindDhcp(DhcpInfo *pDhcp, PTSTR pName) {
	DhcpInfo	**ppTemp;
	
	CTEGetLock(&v_GlobalListLock, 0);

	ppTemp = &v_pEstablishedList;
	for ( ; *ppTemp; ppTemp = &(*ppTemp)->pNext) {
		if (pDhcp) {
			if (*ppTemp == pDhcp)
				break;
		} else if (0 == _tcscmp((*ppTemp)->Name, pName))
			break;
	}	// for()
	if (*ppTemp)
		CTEGetLock(&(*ppTemp)->Lock, 0);

	return ppTemp;

}	// _FindDhcp()


BOOL StringToAddr(TCHAR *AddressString, DWORD *AddressValue) {
	TCHAR	*pStr = AddressString;
	PUCHAR	AddressPtr = (PUCHAR)AddressValue;
	int		i;
	int		Value;

	// Parse the four pieces of the address.
	for (i=0; *pStr && (i < 4); i++) {
		Value = 0;
		while (*pStr && TEXT('.') != *pStr) {
			if ((*pStr < TEXT('0')) || (*pStr > TEXT('9'))) {
				DEBUGMSG (ZONE_INIT,
						  (TEXT("Unable to convert %s to address\r\n"),
						   AddressString));
				return FALSE;
			}
			Value *= 10;
			Value += *pStr - TEXT('0');
			pStr++;
		}
		if (Value > 255) {
			DEBUGMSG (ZONE_INIT,
					  (TEXT("Unable to convert %s to address\r\n"),
					   AddressString));
			return FALSE;
		}
		AddressPtr[i] = Value;
		if (TEXT('.') == *pStr) {
			pStr++;
		}
	}

	// Did we get all of the pieces?
	if (i != 4) {
		DEBUGMSG (ZONE_INIT,
				  (TEXT("Unable to convert %s to address\r\n"),
				   AddressString));
		return FALSE;
	}

	DEBUGMSG (ZONE_INIT,
			  (TEXT("Converted %s to address %X\r\n"),
			   AddressString, *AddressValue));

	return TRUE;
}	// StringToAddr()


LPTSTR AddrToString(DWORD Addr, TCHAR *pString) {
	TCHAR			Buffer[16], *p;
	int				i;
	unsigned char	*aAddr;

	DEBUGMSG(ZONE_WARN, (TEXT("+AddrToString: %X\r\n"),
		Addr));
	
    p = Buffer;
    Addr = net_long(Addr);  // put it in the desired format
	aAddr = (unsigned char *)&Addr;

	for (i = 0; i < 4; i++) {
		do {
			*p++ = aAddr[i] % 10 + TEXT('0');
		} while (aAddr[i] /= 10);
		*p++ = TEXT('.');
	}
	*(--p) = '\0';	// get rid of last '.' & end str

	for (i = 0; i <= 16 && p > Buffer; i++) {
			pString[i] = *(--p);
	}
	pString[i] = TEXT('\0');

	DEBUGMSG(ZONE_WARN, (TEXT("-AddrToString: %s\r\n"), pString));
	return pString;
}	// AddrToString()

// our list is typically < 10 elts so this n^2 algo shld work
void InsSort(int cBuf, uchar *pBuf) {
	uchar	c, *p, *pBig, *pEnd = pBuf + cBuf;

	while ((pBig = pBuf) < pEnd) {
		for (p = pBuf; p < pEnd; p++) {
			if (*p > *pBig)
				pBig = p;
		}
		if (pBig < --pEnd) {
			c = *pBig;
			*pBig = *pEnd;
			*pEnd = c;
		}
	}
}	// InsSort


// returns 0, if not valid #
int Convert(TCHAR *szName, DWORD cName, uchar *pc) {
	uchar c = 0;

	for ( ; cName--  > 0 && *szName != TEXT('\0'); szName++) {
		if (*szName < TEXT('0') || *szName > TEXT('9'))
			return 0;
		c *= 10;
		c += *szName - TEXT('0');
	}
	*pc = c;
	return 1;
}


STATUS GetReqOptions(HKEY hRoot, DhcpInfo *pDhcp) {
	HKEY	hKey;
	LONG	hRes;
	TCHAR	szName[4];
	DWORD	i, j, cName, cBuf, Type;
	uchar	*p, aBuf[OPTIONS_LEN], aPrevReqOptions[MAX_DHCP_REQ_OPTIONS+1];

	pDhcp->Flags &= ~(OPTION_CHANGE_FL | USER_OPTIONS_FL);

	p = aBuf + 1;
	hRes = RegOpenKeyEx(hRoot, TEXT("DhcpOptions"), 0, 0, &hKey);

	if (ERROR_SUCCESS == hRes) {
		cName = sizeof(szName);
		hRes = RegQueryValueEx(hKey, NULL, NULL, NULL, NULL, &cName);
		if (ERROR_SUCCESS == hRes && cName) {
			pDhcp->Flags |= USER_OPTIONS_FL;
			// RegDeleteValue(hKey, NULL);
		
			i = 0;
			while (i < MAX_DHCP_REQ_OPTIONS) {
				cName = sizeof(szName)/sizeof(szName[0]);
				hRes = RegEnumValue(hKey, i++, szName, &cName, NULL, NULL, 
					NULL, NULL);
				if (ERROR_SUCCESS == hRes) {
					if (Convert(szName, 4, p))
						p++;
				} else
					break;
			}	// while()
			
			aBuf[0] = (uchar)(p - aBuf - 1);
			InsSort(aBuf[0], &aBuf[1]);

			memcpy(pDhcp->ReqOptions, aBuf, aBuf[0] + 1);
			
		} else {
			memcpy(pDhcp->ReqOptions, v_aDftReqOptions, 
				v_aDftReqOptions[0] + 1);
		}
		RegCloseKey (hKey);
		
	} else {
		memcpy(pDhcp->ReqOptions, v_aDftReqOptions, v_aDftReqOptions[0] + 1);
	}

	// RFC 2131 requires that if a client requests parameters in a DISCOVER, the 
	// list must be included in subsequent REQUEST messages. So, if our option 
	// list changes, set a flag which will drop us back to INIT state.
	cBuf = sizeof(aPrevReqOptions);
	if (GetRegBinaryValue(hRoot,TEXT("PrevReqOptions"),aPrevReqOptions,&cBuf)) {
		ASSERT(cBuf == (DWORD)(aPrevReqOptions[0] + 1));
		if (memcmp(aPrevReqOptions,pDhcp->ReqOptions,cBuf)) {
			DEBUGMSG(ZONE_WARN,(TEXT("\tGetReqOptions, detected ReqOptions change\r\n")));
			pDhcp->Flags |= OPTION_CHANGE_FL;
		}
	}

	hRes = RegOpenKeyEx(hRoot, TEXT("DhcpSendOptions"), 0, 0, &hKey);
	if (ERROR_SUCCESS == hRes) {
		cName = sizeof(szName);
		hRes = RegQueryValueEx(hKey, NULL, NULL, NULL, NULL, &cName);
		if (ERROR_SUCCESS == hRes && cName) {
			pDhcp->Flags |= SEND_OPTIONS_FL;
			// RegDeleteValue(hKey, NULL);
		
			i = j = 0;
			while (j < OPTIONS_LEN - MAX_DHCP_REQ_OPTIONS - 4 - 3 - 9 - 6) {
				cName = sizeof(szName)/sizeof(szName[0]);
				cBuf = OPTIONS_LEN - j - 22;
				hRes = RegEnumValue(hKey, i++, szName, &cName, NULL, &Type, 
					&aBuf[j], &cBuf);
				if (ERROR_SUCCESS == hRes && REG_BINARY == Type) {
					j += cBuf;
				} else if (ERROR_NO_MORE_ITEMS == hRes)
					break;
			}	// while()

			if (j > 0) {
				if (p = LocalAlloc(LPTR, j)) {
					if (pDhcp->pSendOptions)
						LocalFree(pDhcp->pSendOptions);
					pDhcp->pSendOptions = p;
					memcpy(p, aBuf, j);
					pDhcp->cSendOptions = j;
				}
			} else {
				ASSERT(j == 0);
				// note cSendOptions only valid when pSendOptions != NULL
				LocalFree(pDhcp->pSendOptions);
				pDhcp->pSendOptions = NULL;
			}
		}

		RegCloseKey (hKey);
	}

	return ERROR_SUCCESS;
}	// GetReqOptions


// Read IP address strings from the registry and convert them to DWORDs
BOOL GetRegIPAddr(HKEY hKey, LPTSTR lpVal, LPDWORD lpdwIPAddrs, DWORD dwNumIPAddrs) {
	TCHAR	Buffer[MAX_REG_STR];
    LPTSTR  lpBuf = Buffer;

    Buffer[0] = TEXT('\0');
    // GetRegMultiSZValue works on REG_SZ strings as well as REG_MULTI_SZ
    if (!GetRegMultiSZValue(hKey, lpVal, lpBuf, sizeof(Buffer))) {
        return FALSE;
    }

    while (dwNumIPAddrs) {
        if (TEXT('0') == *lpBuf) {
            *lpdwIPAddrs = 0;
        } else {
            StringToAddr(lpBuf, lpdwIPAddrs);
            lpBuf += _tcslen(lpBuf) + 1;
        }
        lpdwIPAddrs++;
        dwNumIPAddrs--;
    }
    return TRUE;

}   // GetRegIPAddr

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品欧美一二99| 日韩精品资源二区在线| 国产精品情趣视频| 蜜臀99久久精品久久久久久软件| 国产福利精品一区| 亚洲精品在线电影| 久久av老司机精品网站导航| 91麻豆精品国产91久久久久久久久 | 91黄视频在线| 国产精品久久久久久久久晋中 | 国产精品美女视频| 国产精品主播直播| 精品999在线播放| 久久精品国产成人一区二区三区| 欧美一区二区三级| 麻豆成人久久精品二区三区红| 日韩精品一区二区三区在线播放 | 日韩视频永久免费| 天堂av在线一区| 欧美成人国产一区二区| 韩国一区二区三区| 欧美国产精品v| av福利精品导航| 一区二区日韩av| 欧美一级欧美三级在线观看| 国内精品国产成人国产三级粉色 | 欧美精品在欧美一区二区少妇| 日韩成人免费看| 国产精品系列在线| 欧美日韩高清不卡| 国内国产精品久久| 一区二区三区欧美久久| 欧美精品一二三区| 国产剧情在线观看一区二区| 亚洲精品亚洲人成人网在线播放| 欧美精品自拍偷拍动漫精品| 国产ts人妖一区二区| 亚洲成人你懂的| 中文字幕久久午夜不卡| 欧美欧美欧美欧美| 成人免费视频免费观看| 免费看日韩a级影片| 亚洲欧美日韩系列| 久久影音资源网| 欧美一级艳片视频免费观看| 成人性生交大片免费看中文| 免费久久99精品国产| 亚洲一区在线观看免费观看电影高清| 久久久亚洲精品石原莉奈 | 亚洲一二三四在线| 国产精品视频看| 久久伊人中文字幕| 日韩美女在线视频| 欧美巨大另类极品videosbest| 91老师片黄在线观看| 高清shemale亚洲人妖| 精品一区二区三区欧美| 男女男精品视频| 午夜精品成人在线视频| 中文字幕一区二区三区乱码在线 | 亚洲国产一区二区a毛片| 亚洲欧美日韩人成在线播放| 久久99蜜桃精品| 精品一区二区三区免费视频| 免费成人在线网站| 久久超级碰视频| 九九久久精品视频 | 欧美美女直播网站| 欧美精品日韩一本| 51精品视频一区二区三区| 在线中文字幕一区二区| 91免费视频网址| 成a人片亚洲日本久久| 丁香婷婷综合色啪| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产清纯白嫩初高生在线观看91| 日韩欧美电影一区| 久久久www成人免费无遮挡大片| 欧美sm美女调教| 亚洲精品在线网站| 国产精品视频一二三区| 《视频一区视频二区| 亚洲免费色视频| 日日噜噜夜夜狠狠视频欧美人| 日本欧美一区二区三区| 久久机这里只有精品| 大白屁股一区二区视频| 一本色道久久综合狠狠躁的推荐| 色国产综合视频| 91精品国产综合久久婷婷香蕉| 欧美一区二区视频免费观看| 欧美大片免费久久精品三p| 日本一区二区三区久久久久久久久不| 国产精品乱码妇女bbbb| 一区二区三区在线观看网站| 麻豆精品新av中文字幕| 成人高清视频在线| 欧美一区二区三区免费大片| 中文字幕一区二区三区不卡| 秋霞影院一区二区| 在线亚洲高清视频| 精品国产凹凸成av人网站| 亚洲一线二线三线久久久| 国产精品123| 日韩欧美区一区二| 婷婷一区二区三区| 99国产精品一区| 国产日韩精品视频一区| 免费欧美在线视频| 欧美老女人第四色| 亚洲成av人在线观看| 91日韩一区二区三区| 中文字幕欧美区| 麻豆精品精品国产自在97香蕉 | 中文字幕综合网| 国产不卡在线一区| 久久众筹精品私拍模特| 久久99精品久久久久婷婷| 欧美人与禽zozo性伦| 亚洲综合区在线| 色噜噜狠狠色综合欧洲selulu| 国产精品天美传媒| 黄色资源网久久资源365| 制服丝袜中文字幕亚洲| 亚洲成人tv网| 717成人午夜免费福利电影| 伊人色综合久久天天人手人婷| 99在线视频精品| 亚洲日本一区二区| 91亚洲精华国产精华精华液| 成人欧美一区二区三区在线播放| 国产电影精品久久禁18| 国产精品毛片无遮挡高清| voyeur盗摄精品| 亚洲高清在线视频| 日韩午夜激情电影| 国产不卡在线一区| 国产精品国产三级国产aⅴ中文 | 日本一区二区三区四区| 成人午夜视频在线观看| 亚洲国产成人私人影院tom| 一本色道久久综合狠狠躁的推荐| 亚洲视频 欧洲视频| 欧美精品一二三四| 成a人片国产精品| 亚洲v日本v欧美v久久精品| 欧美不卡视频一区| 99精品在线免费| 日韩—二三区免费观看av| 国产三级精品在线| 欧美人与禽zozo性伦| 成人动漫精品一区二区| 毛片av一区二区三区| 亚洲人吸女人奶水| 精品少妇一区二区三区在线视频| 成人福利视频网站| 久久99精品一区二区三区| 日韩一区欧美小说| 久久影院视频免费| 7777精品伊人久久久大香线蕉的| 成人在线视频首页| 蜜桃视频免费观看一区| 一区二区三区四区蜜桃| 久久久精品人体av艺术| 欧美一区二区三区在线视频| 99国产精品99久久久久久| 国产制服丝袜一区| 日本不卡在线视频| 亚洲一区二区三区四区在线观看 | 国产人久久人人人人爽| 日韩欧美的一区二区| 欧美精品1区2区3区| 在线视频亚洲一区| 一本在线高清不卡dvd| 成人午夜av在线| 国产麻豆视频一区二区| 国产一区二区视频在线| 五月天一区二区三区| 一区二区三区在线视频免费| 亚洲视频香蕉人妖| ㊣最新国产の精品bt伙计久久| 久久久精品中文字幕麻豆发布| 欧美久久久久中文字幕| 欧美男女性生活在线直播观看| 色哦色哦哦色天天综合| 94-欧美-setu| 91在线精品一区二区| www.日韩av| 色呦呦一区二区三区| 色系网站成人免费| 欧美中文字幕亚洲一区二区va在线| 色综合久久久久综合体桃花网| 91蜜桃传媒精品久久久一区二区| 国产a级毛片一区| 91麻豆产精品久久久久久| 欧美日韩视频在线一区二区| 91精品国产黑色紧身裤美女| 精品国产91亚洲一区二区三区婷婷| 精品国产一区二区三区久久影院| 国产三级久久久|