⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nspsrvc.c

📁 WinCE5.0部分核心源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		} else if (0 == memcmp(pSvcClassId, &IANAGuid, sizeof(GUID))) {
			Flags |= IANA_LOOKUP;
			ControlFlags &= ~LUP_RETURN_ADDR;
		} else if (0 == memcmp(pSvcClassId, &Ipv6Guid, sizeof(GUID))) {
			Flags |= V6_LOOKUP;
		}
		
		fNameLookup = (0 == memcmp(pSvcClassId, &HostnameGuid, sizeof(GUID)))
						|| IS_SVCID_TCP(pSvcClassId)
						|| IS_SVCID_UDP(pSvcClassId)
			|| (0 == memcmp(pSvcClassId, &InetHostName, sizeof(GUID)))
			|| (0 == memcmp(pSvcClassId, &Ipv6Guid, sizeof(GUID)))
			|| (0 == memcmp(pSvcClassId, &AtmaGuid, sizeof(GUID)));

		if (! (pwszSvcName = pRestrict->lpszServiceInstanceName) ||
			! (*pwszSvcName)) {

			if (fNameLookup) {
				Flags |= LOCAL_LOOKUP;
				pwszSvcName = TEXT("");
			} else if ( (REVERSE_LOOKUP & Flags) && pRestrict->lpcsaBuffer &&
				(1 == pRestrict->dwNumberOfCsAddrs)) {

				pSAddr = (SOCKADDR_IN *)pRestrict->lpcsaBuffer->
												RemoteAddr.lpSockaddr;
				if (MyInetNtoaW(pwszSockAddr, pSAddr->sin_addr))
					pwszSvcName = pwszTemp;
				else {
					Err = WSAEINVAL;
					// break out somehow?
				}
			} else {
				Err = WSAEINVAL;
				// break out somehow??
			}
		} else if (fNameLookup) {
			// check for special names
			if (DnsNameCompare_W(pwszSvcName, TEXT("localhost")) ||
				DnsNameCompare_W(pwszSvcName, TEXT("loopback")))
				Flags |= LOCAL_LOOKUP | LOOP_LOOKUP;
			
		}

		if (! Err) {
			// compare protocols to return
			if (cProtocols = pRestrict->dwNumberOfProtocols) {
				pAfProtocols = pRestrict->lpafpProtocols;
				while (cProtocols-- && pAfProtocols) {
					AddrFamily = pAfProtocols->iAddressFamily;
					if (AF_UNSPEC == AddrFamily) {
						Protocols = 0x3;
						break;
					} else if (AF_INET==AddrFamily || AF_INET6==AddrFamily) {
						if (! (Prot = pRestrict->lpafpProtocols->iProtocol)) {
							Protocols = 0x3;
							break;
						} else if (IPPROTO_UDP == Prot) {
							Protocols |= 0x1;
						} else if (IPPROTO_TCP == Prot) {
							Protocols |= 0x2;
						}
						// otherwise we don't do anything just in case someone
						// adds a new protocol we don't recognize
					}
					pAfProtocols++;
				}
			} else {
				Protocols = 0x3;
			}
			// get the server and protocols if there is a string
			
			if (Protocols) {
				// ...

				// if everything ok get a handle
				// don't add 1 here b/c pQuery already has an array of WCHAR[1]
				cSvcName = (wcslen(pwszSvcName)) * sizeof(WCHAR);
				if (pQuery = LocalAlloc(LPTR, sizeof(*pQuery) + cSvcName)) {
					pQuery->cRefs = 1;
					pQuery->Flags = Flags;
					pQuery->ControlFlags = ControlFlags;
					memcpy(&pQuery->Id, pSvcClassId, sizeof(GUID));
					wcscpy(pQuery->pwszSvcName, pwszSvcName);
					
					// set other fields
					EnterCriticalSection(&v_NspmCS);
					pQuery->pNext = v_pQueryList;
					v_pQueryList = pQuery;
					LeaveCriticalSection(&v_NspmCS);
					*phLookup = (HANDLE)pQuery;

				} else
					Err = WSA_NOT_ENOUGH_MEMORY;

			} else
				Err = WSANO_DATA;
		}

		LocalFree(pwszTemp);

	}

	if (Err) {
		SetLastError(Err);
		Err = SOCKET_ERROR;
	}

	return Err;

}	// NSPLookupServiceBegin()

#define NAME_SIZE	168	// make this a multiple of 4

INT WSAAPI NSPLookupServiceNext(
	HANDLE			hLookup,
	DWORD			ControlFlags,
	DWORD			*pcBuf,
	LPWSAQUERYSETW	pResults) {

	int				Err = 0;
	QueryContext	*pQuery, **ppQuery;
	WSAQUERYSETW	QuerySet;
	SOCK_THREAD		*pThread;
	HOSTENT			*pHost;
	CSADDR_INFO		*pCsAddr;
	SOCKADDR		*pSAddr;
	SOCKADDR_IN		*pSAddrIn;
	SOCKADDR_IN6	*pSAddrIn6;
	char			*p;
	unsigned int	cBuf, cAddr;
	int				i, cSize, cName;
	BLOB			*pBlob;
	WCHAR			wName[NAME_SIZE];
	DWORD			IPAddr[4];
	HKEY			hKey;
	LONG			hRet;
	DWORD			Type;
	int				fLocalLookup;
	AFD_OPTIONS		AfdOptions;
	ushort			Family;

		if(!hLookup || !pcBuf || !pResults) {
		Err = WSAEFAULT;
	} else if ((ControlFlags & LUP_CONTAINERS) && (ControlFlags & LUP_NOCONTAINERS)) {
		Err = WSAEINVAL;
	} else if (ControlFlags & LUP_CONTAINERS) {
		Err = WSANO_DATA;
	} else {
		if (! pResults && *pcBuf) {
			// the caller lied to us!
			*pcBuf = 0;
		}
		if (*pcBuf < sizeof(WSAQUERYSETW)) {
			pResults = &QuerySet;
		}
    
		memset(pResults, 0, sizeof(WSAQUERYSETW));
		pResults->dwNameSpace = NS_DNS;
		pResults->dwSize = sizeof(WSAQUERYSETW);

		EnterCriticalSection(&v_NspmCS);
		pQuery = *_FindQuery(hLookup);
		pQuery->cRefs++;
		LeaveCriticalSection(&v_NspmCS);

		if (pQuery) {

			if (V6_LOOKUP & pQuery->Flags) {
				AfdOptions.Type = T_AAAA;
				cAddr = sizeof(SOCKADDR_IN6);
				Family = AF_INET6;
			} else {
				AfdOptions.Type = T_A;
				cAddr = sizeof(SOCKADDR_IN);
				Family = AF_INET;
			}
				

			if (DONE_LOOKUP & pQuery->Flags) {
				Err = WSA_E_NO_MORE;
			} else if (IANA_LOOKUP & pQuery->Flags) {
				ASSERT(0);
				

			} else if (REVERSE_LOOKUP & pQuery->Flags) {

				if (AF_INET6 == Family) {
					// we don't yet handle reverse queries for v6
					Err = WSANO_DATA;
					goto Done;
				} else {
					IPAddr[0] = MyInetAddrW(pQuery->pwszSvcName);
				}
				if (INADDR_NONE != IPAddr[0]) {
					if (pThread = LocalAlloc(LPTR, sizeof(*pThread))) {
						if (AFDGetHostentByAttr(pThread, NULL, 
							(BYTE *)IPAddr, &AfdOptions)) {

							pHost = &(pThread->GETHOST_host);

							p = (char *)(pResults + 1);
							cBuf = (DWORD)(pResults + 1) - (DWORD)pResults;

							ASSERT(!((DWORD)p & 0x3));

							memset(&QuerySet, 0, sizeof(QuerySet));
							// copy stuff into the query structure...
							QuerySet.dwSize = sizeof(QuerySet);

							// very silly: copy GUID from LookupServiceBegin
							if (LUP_RETURN_TYPE & pQuery->ControlFlags) {
								cSize = sizeof(GUID);
								cBuf += cSize;
								if (cBuf <= *pcBuf) {
									QuerySet.lpServiceClassId = (GUID *)p;
									memcpy(p, &pQuery->Id, cSize);
									p += cSize;

									ASSERT(!((DWORD)p & 0x3));
								}
							}
							// seems to be not set by NT
	//						QuerySet.lpVersion = NULL;
	//						QuerySet.lpszComment = NULL;
							QuerySet.dwNameSpace = NS_DNS;

							cSize = sizeof(GUID);
							cBuf += cSize;
							if (cBuf <= *pcBuf) {
								QuerySet.lpNSProviderId = (GUID *)p;
								memcpy(p, &NsId, cSize);
								p += cSize;

								ASSERT(!((DWORD)p & 0x3));
							}
	//						QuerySet.lpszContext = NULL;
	//						QuerySet.dwNumberOfProtocols = 0;
	//						QuerySet.lpafpProtocols = NULL;
	//						QuerySet.lpszQueryString = NULL;

							ASSERT(!((DWORD)p & 0x3));

							if (LUP_RETURN_ADDR & pQuery->ControlFlags) {
								// we'll only add one address for now...the one
								// that was given to us
								i = 1;
								// each pCsAddr will have two pointers to 
								// SOCKADDRS so calculate them in too...
								cSize = sizeof(*pCsAddr) + (cAddr << 1);
								cBuf += cSize;

								ASSERT(!((DWORD)cSize & 0x3));

								// if they're not all going to fit in, then don't
								// return partial info...
								if (cBuf <= *pcBuf) {
									QuerySet.dwNumberOfCsAddrs = i;
									QuerySet.lpcsaBuffer = pCsAddr = 
										(CSADDR_INFO *)p;
									p += sizeof(*pCsAddr) * i;
								
									pSAddr = (SOCKADDR *)p;

									// now copy them in...
									memset(pCsAddr, 0, sizeof(*pCsAddr));
									// copy the non-pointer info first
									
																		pCsAddr[0].iSocketType = SOCK_STREAM;
									pCsAddr[0].iProtocol = IPPROTO_TCP;
									
									pCsAddr[0].LocalAddr.iSockaddrLength = 
										pCsAddr[0].RemoteAddr.iSockaddrLength
										= cAddr;

									pCsAddr[0].LocalAddr.lpSockaddr = pSAddr;
									memset(pSAddr, 0, cAddr);
									pSAddr->sa_family = Family;
									// local address will be blank

									p += cAddr;
									ASSERT(!((DWORD)p & 0x3));
									pSAddr = (SOCKADDR *)p;
									
									pCsAddr[0].RemoteAddr.lpSockaddr = pSAddr;
									memset(pSAddr, 0, cAddr);
									// pSAddrIn->sin_port already memset to 0
									pSAddr->sa_family = Family;
									if (Family == AF_INET) {
										pSAddrIn = (SOCKADDR_IN *)p;
										pSAddrIn->sin_addr.s_addr = IPAddr[0];
									} else {
										pSAddrIn6 = (SOCKADDR_IN6 *)p;
										memcpy(&pSAddrIn6->sin6_addr, IPAddr, 
											sizeof(struct in6_addr));
									}

									p += cAddr;
									ASSERT(!((DWORD)p & 0x3));
									
								}	// if (cBuf <= *pcBuf)
							}	// if (LUP_RETURN_ADDR & pQuery->ControlFlags
							
							// if this is an alias set this to RESULT_IS_ALIAS
	//						QuerySet.dwOutputFlags = 0;

							if (LUP_RETURN_BLOB & pQuery->ControlFlags) {
								QuerySet.lpBlob = pBlob = (BLOB *)p;
								// make sure this is a SVCID_INET_HOSTADDRBYNAME
								cSize = sizeof(BLOB);
								cBuf += cSize;
								if (cBuf <= *pcBuf) {
									p += cSize;
									ASSERT(!((DWORD)p & 0x3));
									pBlob->pBlobData = p;
								}

								Err = CopyHostentToBlob(pHost, p, *pcBuf - cBuf, 
									&cSize);
								if (! Err) {
									PointerToOffset((HOSTENT*)p);
									pBlob->cbSize = cSize;
									cSize = (cSize + 3) & ~3;
									p += cSize;
									cBuf += cSize;
								} else {
									cSize = (cSize + 3) & ~3;
									cBuf += cSize;
								}
								ASSERT(!((DWORD)p & 0x3));
							}

							if (LUP_RETURN_NAME & pQuery->ControlFlags) {

								cName = strlen(pHost->h_name) + 1;
								cSize = ((cName *2) + 3) & (~3);
								ASSERT(!((DWORD)cSize & 0x3));

								cBuf += cSize;
								if (cBuf <= *pcBuf) {
									QuerySet.lpszServiceInstanceName = (WCHAR *)p;
									MultiByteToWideChar(CP_ACP, 0, pHost->h_name, -1, (WCHAR *)p, cName);
									p += cSize;
									ASSERT(!((DWORD)p & 0x3));
								}
							}
							if (cBuf > *pcBuf) {
								Err = WSAEFAULT;
								*pcBuf = cBuf;
							} else
								memcpy(pResults, &QuerySet, sizeof(QuerySet));
							

						} else	// if (AFDGetHostentByAttr...)
							Err = GetLastError();
							
						LocalFree(pThread);
					} else
						Err = WSA_NOT_ENOUGH_MEMORY;
					

				} else {
					// what should we do here?
					ASSERT(0);
					Err = WSAEINVAL;
				}

			} else {

				if (LOCAL_LOOKUP & pQuery->Flags) {
					fLocalLookup = TRUE;

					if (! ((LUP_RETURN_NAME | LUP_RETURN_ADDR) & 
						pQuery->ControlFlags)) {
						Err = WSAEINVAL;
					} else if ( 
						! ((LUP_RETURN_NAME | LUP_RETURN_ADDR |LUP_RETURN_BLOB)
						& pQuery->ControlFlags)) {
						Err = WSAEINVAL;
					}
					if (Err)
						goto Done;

					p = (char *)(pResults + 1);
					cBuf = (DWORD)(pResults + 1) - (DWORD)pResults;

					memset(&QuerySet, 0, sizeof(QuerySet));

					// copy stuff into the query structure...
					QuerySet.dwSize = sizeof(QuerySet);

					QuerySet.dwNameSpace = NS_DNS;
					cSize = sizeof(GUID);
					cBuf += cSize;
					if (cBuf <= *pcBuf) {
						QuerySet.lpNSProviderId = (GUID *)p;
						memcpy(p, &NsId, cSize);
						p += cSize;
					}
					ASSERT(!((DWORD)p & 0x3));

					i = 0;
					if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_LOCAL_MACHINE, 
												TEXT("Ident"), 0, 0, &hKey)) {
						cName = sizeof(wName);
						hRet = RegQueryValueEx(hKey, TEXT("Name"), 0, &Type,
							(char *)wName, &cName);
						RegCloseKey (hKey);
						
						if ((hRet == ERROR_SUCCESS) && (Type == REG_SZ)) {
							i++;
						}
					}
					if (! i) {
						wcscpy(wName, TEXT("WindowsCE"));
						cName = 20;
					}
					cSize = (cName + 3) & (~3);
					ASSERT(!((DWORD)cSize & 0x3));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -