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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产激情一区二区三区蜜月| 欧美日韩mp4| 天天影视涩香欲综合网| 欧美国产欧美综合| 日韩写真欧美这视频| 欧美色图免费看| 91在线一区二区三区| 久久国产精品99久久人人澡| 国产精品嫩草久久久久| 欧美变态tickling挠脚心| 日韩欧美一区二区久久婷婷| 国产精品自在在线| 丝袜美腿亚洲综合| 一区二区三区丝袜| 国产精品国产三级国产| 国产日韩欧美综合一区| 欧美www视频| 欧美岛国在线观看| 日韩一区二区在线看片| 欧美日韩高清影院| 在线区一区二视频| 国产精品456| 成人高清免费在线播放| 国产成人亚洲综合a∨猫咪| 久久66热偷产精品| 黄色日韩网站视频| 精品一区二区三区香蕉蜜桃| 奇米777欧美一区二区| 日本欧美一区二区| 久久精品国内一区二区三区| 蜜臀久久99精品久久久画质超高清| 伊人色综合久久天天人手人婷| 国产精品国产自产拍高清av| 中文字幕第一页久久| 国产精品不卡在线| 国产精品免费av| 夜夜精品浪潮av一区二区三区| 亚洲另类一区二区| 日韩黄色片在线观看| 精品伊人久久久久7777人| 狠狠色伊人亚洲综合成人| 99视频在线精品| 久久精品国产99久久6| 免费成人在线观看| 韩国成人在线视频| 高清不卡在线观看av| 欧美性大战久久久久久久蜜臀| 国产69精品久久久久777| 成人激情电影免费在线观看| 91精品国产综合久久福利| 欧美一区二区人人喊爽| 欧美日本视频在线| 欧美一区二区在线免费播放| 欧美激情一区二区在线| 亚洲欧美韩国综合色| 婷婷国产在线综合| 国产一二三精品| 欧美视频一区二| 久久久久国产一区二区三区四区| 国产精品麻豆99久久久久久| 亚洲一区二区偷拍精品| 久久精品国产免费| 99久久伊人久久99| 欧美肥妇bbw| 亚洲欧美在线视频观看| 老司机精品视频线观看86| 成人黄色网址在线观看| 欧美老女人在线| 国产精品国产馆在线真实露脸 | 国产成人在线电影| 在线观看亚洲精品| 亚洲国产精品成人综合| 美女视频黄a大片欧美| 在线免费观看不卡av| 欧美激情在线观看视频免费| 亚洲国产精品久久久久婷婷884| 精品综合久久久久久8888| 欧美日韩电影一区| 自拍偷拍国产精品| 国产精品一区一区三区| 欧美一区二区视频在线观看2020| 亚洲乱码国产乱码精品精小说| 国产一区二区久久| 日韩亚洲欧美中文三级| 日本va欧美va瓶| 欧美日韩国产bt| 夜色激情一区二区| 成人美女视频在线观看| 国产欧美一区二区三区鸳鸯浴 | 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美性受xxxx黑人xyx| 亚洲嫩草精品久久| 欧美日韩一区三区| 久久99久久久欧美国产| 自拍偷自拍亚洲精品播放| 欧美日本一区二区三区| 欧美精品xxxxbbbb| 久久国产精品色婷婷| 欧美国产成人在线| 欧美日韩一区不卡| 国产美女在线精品| 亚洲国产精品一区二区www在线| 日韩一区二区三区视频| 91麻豆免费视频| 激情久久久久久久久久久久久久久久| 国产精品视频你懂的| 欧美人体做爰大胆视频| 国产成人免费视频精品含羞草妖精 | 精品蜜桃在线看| 成人性生交大片免费看中文网站| 亚洲精品一二三四区| 日韩一级黄色片| 国产成人精品免费在线| 国产精品久久久久久久久免费桃花| 欧美性猛交xxxxxxxx| 一本久久a久久精品亚洲| 国产精品影视天天线| 日韩中文字幕麻豆| 一区二区三区精密机械公司| 国产精品久久一级| 国产精品网曝门| 中文一区在线播放| 国产欧美日韩另类一区| 精品国产3级a| 欧美zozozo| 国产午夜精品理论片a级大结局| 欧美成人午夜电影| 日韩视频一区二区三区| 91精品免费在线观看| 欧美肥胖老妇做爰| 中国av一区二区三区| 久久伊人中文字幕| 久久亚洲私人国产精品va媚药| 久久久久久免费网| 国产欧美日韩在线视频| 亚洲国产精品精华液2区45| 国产精品第13页| 亚洲欧美日韩国产成人精品影院| 日韩亚洲欧美综合| 2023国产一二三区日本精品2022| 精品粉嫩aⅴ一区二区三区四区| 久久一区二区三区国产精品| 欧美国产一区在线| 亚洲免费在线视频一区 二区| 午夜精品久久久久久久99水蜜桃| 日韩av一区二区在线影视| 国产中文字幕一区| 欧美人与z0zoxxxx视频| 久久久久久久免费视频了| 亚洲欧洲国产日韩| 日本成人中文字幕在线视频 | 成人黄色网址在线观看| 欧美视频在线一区二区三区 | 亚洲精品一二三四区| 91片在线免费观看| 91精品黄色片免费大全| 中文字幕日韩一区| 精品一区二区三区免费毛片爱 | 狠狠色丁香久久婷婷综| 欧洲一区二区三区免费视频| 精品国产乱码久久久久久久| 日韩专区中文字幕一区二区| 高清不卡在线观看| 欧美成人a∨高清免费观看| 自拍偷拍国产精品| 美女脱光内衣内裤视频久久网站 | 亚洲一区二区影院| 成人免费福利片| 精品欧美黑人一区二区三区| 视频一区中文字幕| 日本高清成人免费播放| 中文字幕乱码日本亚洲一区二区| 日韩国产欧美一区二区三区| 成人av在线影院| 精品国产自在久精品国产| 洋洋成人永久网站入口| 99久久精品国产观看| 国产精品色在线观看| 国产福利一区二区三区视频| 亚洲精品一区二区三区香蕉| 麻豆精品视频在线观看| 欧美一区二区黄色| 另类小说综合欧美亚洲| 欧美经典一区二区| 国产成人av资源| 国产精品丝袜在线| 91色九色蝌蚪| 免费人成精品欧美精品| 欧美精品一区二区三区高清aⅴ| 精品影视av免费| 国产午夜三级一区二区三| 国产在线一区观看| 国产精品久久久久久久第一福利| 高清日韩电视剧大全免费| 亚洲欧美二区三区| 日韩欧美专区在线| 国产精品综合久久| 一区二区三区鲁丝不卡| 欧美本精品男人aⅴ天堂| 国产精品一品视频|