15 #include "mswhelper.h"
20 #define NSP_CALLID_DNS 0x0001
21 #define NSP_CALLID_HOSTNAME 0x0002
22 #define NSP_CALLID_HOSTBYNAME 0x0003
23 #define NSP_CALLID_SERVICEBYNAME 0x0004
28 #ifndef WS2_INTERNAL_MAX_ALIAS
29 #define WS2_INTERNAL_MAX_ALIAS 512
30 #endif // WS2_INTERNAL_MAX_ALIAS
32 //#define IP_LOCALHOST 0x0100007F
34 //#define NSP_REDIRECT
41 CHAR
** servaliasesA
; /* array */
43 } WSHOSTINFOINTERN
, *PWSHOSTINFOINTERN
;
46 GUID providerId
; /* Provider-ID */
47 DWORD dwControlFlags
; /* dwControlFlags (WSALookupServiceBegin) */
48 DWORD CallID
; /* List for LookupServiceNext-Calls */
49 DWORD CallIDCounter
; /* call-count of the current CallID. */
50 WCHAR
* hostnameW
; /* hostbyname */
55 } WSHANDLEINTERN
, *PWSHANDLEINTERN
;
57 static const GUID guid_NULL
= {0};
58 static const GUID guid_HOSTNAME
= SVCID_HOSTNAME
;
59 static const GUID guid_INET_HOSTADDRBYINETSTRING
= SVCID_INET_HOSTADDRBYINETSTRING
;
60 static const GUID guid_INET_HOSTADDRBYNAME
= SVCID_INET_HOSTADDRBYNAME
;
61 static const GUID guid_INET_SERVICEBYNAME
= SVCID_INET_SERVICEBYNAME
;
63 /* GUIDs - maybe they should be loaded from registry? */
65 static const GUID guid_mswsock_TcpIp
= {/*Data1:*/ 0x22059D40,
68 /*Data4:*/ {0xAE, 0x5A, 0x00, 0xAA, 0x00, 0xA7, 0x11, 0x2B}};
70 /* {6642243A-3BA8-4AA6-BAA5-2E0BD71FDD83} */
72 static const GUID guid_mswsock_NLA
= {/*Data1:*/ 0x6642243A,
75 /*Data4:*/ {0xBA, 0xA5, 0x2E, 0x0B, 0xD7, 0x1F, 0xDD, 0x83}};
80 (CALLBACK
*lpRdrNSPStartup
)(
82 LPNSP_ROUTINE lpRout
);
84 const rdrLib
= "mswsock.dll-original";
85 lpRdrNSPStartup rdrNSPStartup
;
87 NSP_ROUTINE rdrproc_tcpip
;
88 NSP_ROUTINE rdrproc_nla
;
90 #endif /* NSP_REDIRECT */
97 LPNSP_ROUTINE lpRout
);
100 NSP_LookupServiceBeginW(
101 PWSHANDLEINTERN data
,
107 NSP_LookupServiceNextW(
108 _In_ PWSHANDLEINTERN data
,
109 _In_ DWORD dwControlFlags
,
110 _Inout_ LPWSAQUERYSETW lpRes
,
111 _Inout_ LPDWORD lpResLen
);
114 NSP_GetHostNameHeapAllocW(
115 _Out_ WCHAR
** hostname
);
118 NSP_GetHostByNameHeapAllocW(
119 _In_ PWSHANDLEINTERN data
,
120 _In_ DWORD dwControlFlags
,
121 _Out_ PWSHOSTINFOINTERN hostinfo
);
124 NSP_GetServiceByNameHeapAllocW(
125 _In_ PWSHANDLEINTERN data
,
126 _In_ DWORD dwControlFlags
,
127 _Out_ PWSHOSTINFOINTERN hostinfo
);
129 /* Implementations - Internal */
133 mwsNSPCleanUp(_In_ LPGUID lpProviderId
)
135 //WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
136 //return ERROR_CALL_NOT_IMPLEMENTED;
137 return ERROR_SUCCESS
;
143 return ERROR_SUCCESS
;
148 mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId
,
149 _In_ LPWSAQUERYSETW lpqsRestrictions
,
150 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo
,
151 _In_ DWORD dwControlFlags
,
152 _Out_ LPHANDLE lphLookup
)
154 PWSHANDLEINTERN pLook
;
157 if (IsEqualGUID(lpProviderId
, &guid_mswsock_TcpIp
))
161 else if (IsEqualGUID(lpProviderId
, &guid_mswsock_NLA
))
163 WSASetLastError(WSASERVICE_NOT_FOUND
);
168 return ERROR_CALL_NOT_IMPLEMENTED
;
171 /* allocate internal structure */
172 pLook
= HeapAlloc(GetProcessHeap(), 0, sizeof(WSHANDLEINTERN
));
175 WSASetLastError(WSAEFAULT
);
179 *lphLookup
= (HANDLE
)pLook
;
181 RtlZeroMemory(pLook
, sizeof(*pLook
));
183 /* Anyway the ControlFlags "should" be needed
184 in NSPLookupServiceNext. (see doku) But
185 thats not the fact ATM. */
186 pLook
->dwControlFlags
= dwControlFlags
;
187 pLook
->providerId
= *lpProviderId
;
191 if (IsEqualGUID(lpProviderId
, &guid_mswsock_TcpIp
))
193 pLook
->rdrproc
= rdrproc_tcpip
;
195 else if (IsEqualGUID(lpProviderId
, &guid_mswsock_NLA
))
197 pLook
->rdrproc
= rdrproc_nla
;
201 return ERROR_CALL_NOT_IMPLEMENTED
;
204 if (pLook
->rdrproc
.NSPLookupServiceBegin(lpProviderId
,
208 &pLook
->rdrLookup
) == NO_ERROR
)
214 wsaErr
= WSAGetLastError();
219 res = WSAGetLastError();
222 #else /* NSP_REDIRECT */
224 wsaErr
= ERROR_CALL_NOT_IMPLEMENTED
;
225 if (IsEqualGUID(lpqsRestrictions
->lpServiceClassId
, &guid_NULL
))
227 wsaErr
= ERROR_CALL_NOT_IMPLEMENTED
;
229 else if (IsEqualGUID(lpqsRestrictions
->lpServiceClassId
, &guid_HOSTNAME
))
231 wsaErr
= NSP_LookupServiceBeginW(pLook
,
234 NSP_CALLID_HOSTNAME
);
236 else if (IsEqualGUID(lpqsRestrictions
->lpServiceClassId
,
237 &guid_INET_HOSTADDRBYNAME
))
239 wsaErr
= NSP_LookupServiceBeginW(pLook
,
241 lpqsRestrictions
->lpszServiceInstanceName
,
242 NSP_CALLID_HOSTBYNAME
);
244 else if (IsEqualGUID(lpqsRestrictions
->lpServiceClassId
,
245 &guid_INET_SERVICEBYNAME
))
247 wsaErr
= NSP_LookupServiceBeginW(pLook
,
249 lpqsRestrictions
->lpszServiceInstanceName
,
250 NSP_CALLID_SERVICEBYNAME
);
252 else if (IsEqualGUID(lpqsRestrictions
->lpServiceClassId
,
253 &guid_INET_HOSTADDRBYINETSTRING
))
255 wsaErr
= ERROR_CALL_NOT_IMPLEMENTED
;
258 #endif /* NSP_REDIRECT */
260 if (wsaErr
!= NO_ERROR
)
262 WSASetLastError(wsaErr
);
270 mwsNSPLookupServiceNext(_In_ HANDLE hLookup
,
271 _In_ DWORD dwControlFlags
,
272 _Inout_ LPDWORD lpdwBufferLength
,
273 //_Out_writes_bytes_to_(*lpdwBufferLength, *lpdwBufferLength)
274 LPWSAQUERYSETW lpqsResults
)
276 PWSHANDLEINTERN pLook
= hLookup
;
281 INT res
= pLook
->rdrproc
.NSPLookupServiceNext(pLook
->rdrLookup
,
285 wsaErr
= WSAGetLastError();
286 if (res
!= ERROR_SUCCESS
)
288 wsaErr
= WSAGetLastError();
294 #else /* NSP_REDIRECT */
296 if ((lpdwBufferLength
== NULL
) || (*lpdwBufferLength
== 0))
298 wsaErr
= WSA_NOT_ENOUGH_MEMORY
;
302 RtlZeroMemory(lpqsResults
, *lpdwBufferLength
);
303 lpqsResults
->dwSize
= sizeof(*lpqsResults
);
305 wsaErr
= NSP_LookupServiceNextW(pLook
,
311 #endif /* NSP_REDIRECT */
316 WSASetLastError(wsaErr
);
324 mwsNSPIoCtl(_In_ HANDLE hLookup
,
325 _In_ DWORD dwControlCode
,
326 _In_reads_bytes_(cbInBuffer
) LPVOID lpvInBuffer
,
327 _In_ DWORD cbInBuffer
,
328 _Out_writes_bytes_to_(cbOutBuffer
, *lpcbBytesReturned
) LPVOID lpvOutBuffer
,
329 _In_ DWORD cbOutBuffer
,
330 _Out_ LPDWORD lpcbBytesReturned
,
331 _In_opt_ LPWSACOMPLETION lpCompletion
,
332 _In_ LPWSATHREADID lpThreadId
)
334 WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
335 return ERROR_CALL_NOT_IMPLEMENTED
;
340 mwsNSPLookupServiceEnd(_In_ HANDLE hLookup
)
342 PWSHANDLEINTERN pLook
;
347 pLook
= (PWSHANDLEINTERN
)hLookup
;
348 hHeap
= GetProcessHeap();
351 res
= pLook
->rdrproc
.NSPLookupServiceEnd(pLook
->rdrLookup
);
354 if (pLook
->hostnameW
!= NULL
)
355 HeapFree(hHeap
, 0, pLook
->hostnameW
);
357 HeapFree(hHeap
, 0, pLook
);
363 mwsNSPSetService(_In_ LPGUID lpProviderId
,
364 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo
,
365 _In_ LPWSAQUERYSETW lpqsRegInfo
,
366 _In_ WSAESETSERVICEOP essOperation
,
367 _In_ DWORD dwControlFlags
)
369 WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
370 return ERROR_CALL_NOT_IMPLEMENTED
;
375 mwsNSPInstallServiceClass(_In_ LPGUID lpProviderId
,
376 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo
)
378 WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
379 return ERROR_CALL_NOT_IMPLEMENTED
;
384 mwsNSPRemoveServiceClass(_In_ LPGUID lpProviderId
,
385 _In_ LPGUID lpServiceClassId
)
387 WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
388 return ERROR_CALL_NOT_IMPLEMENTED
;
393 mwsNSPGetServiceClassInfo(_In_ LPGUID lpProviderId
,
394 _In_ LPDWORD lpdwBufSize
,
395 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo
)
397 WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
398 return ERROR_CALL_NOT_IMPLEMENTED
;
402 hostnameA / hostnameW
403 * only used by HOSTBYNAME
404 * only one should be set
408 NSP_LookupServiceBeginW(PWSHANDLEINTERN data
,
415 if (data
->CallID
!= 0)
418 data
->CallID
= CallID
;
420 if ((CallID
== NSP_CALLID_HOSTBYNAME
) ||
421 (CallID
== NSP_CALLID_SERVICEBYNAME
))
423 hHeap
= GetProcessHeap();
425 if (data
->hostnameW
!= NULL
)
426 HeapFree(hHeap
, 0, data
->hostnameW
);
428 if (hostnameA
!= NULL
)
430 data
->hostnameW
= StrA2WHeapAlloc(hHeap
, hostnameA
);
434 data
->hostnameW
= StrCpyHeapAllocW(hHeap
, hostnameW
);
440 return ERROR_SUCCESS
;
444 NSP_GetHostNameHeapAllocW(_Out_ WCHAR
** hostname
)
447 HANDLE hHeap
= GetProcessHeap();
448 DWORD bufCharLen
= MAX_COMPUTERNAME_LENGTH
+ 1;
449 DWORD bufByteLen
= bufCharLen
* sizeof(WCHAR
);
451 name
= HeapAlloc(hHeap
, 0, bufByteLen
);
453 if (!GetComputerNameExW(ComputerNameDnsHostname
,
457 HeapFree(hHeap
, 0, name
);
458 WSASetLastError(WSAEFAULT
);
463 return ERROR_SUCCESS
;
467 NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data
,
468 _In_ DWORD dwControlFlags
,
469 _Out_ PWSHOSTINFOINTERN hostinfo
)
471 HANDLE hHeap
= GetProcessHeap();
472 DNS_STATUS dns_status
= { 0 };
473 /* include/WinDNS.h -- look up DNS_RECORD on MSDN */
476 INT result
= ERROR_SUCCESS
;
477 DWORD dwQueryFlags
= DNS_QUERY_STANDARD
;
478 PWCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = { 0 };
481 /* needed to be cleaned up if != NULL */
484 if (data
->hostnameW
== NULL
)
486 result
= ERROR_INVALID_PARAMETER
;
490 if ((data
->dwControlFlags
& LUP_DEEP
) == 0)
492 dwQueryFlags
|= DNS_QUERY_NO_RECURSION
;
495 /* DNS_TYPE_A: include/WinDNS.h */
496 /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
497 dns_status
= DnsQuery_W(data
->hostnameW
,
500 NULL
/* extra dns servers */,
503 if (dns_status
== ERROR_INVALID_NAME
)
505 WSASetLastError(WSAEFAULT
);
506 result
= ERROR_INVALID_PARAMETER
;
510 if ((dns_status
!= 0) || (dp
== NULL
))
512 result
= WSAHOST_NOT_FOUND
;
516 //ASSERT(dp->wType == DNS_TYPE_A);
517 //ASSERT(dp->wDataLength == sizeof(DNS_A_DATA));
519 while ((curr
->pNext
!= NULL
) || (curr
->wType
!= DNS_TYPE_A
))
521 if (curr
->wType
== DNS_TYPE_CNAME
)
523 Aliases
[AliasIndex
++] = curr
->Data
.Cname
.pNameHost
;
528 if (curr
->wType
!= DNS_TYPE_A
)
530 result
= WSASERVICE_NOT_FOUND
;
533 hostinfo
->hostnameW
= StrCpyHeapAllocW(hHeap
, curr
->pName
);
534 hostinfo
->addr4
= curr
->Data
.A
.IpAddress
;
537 hostinfo
->servaliasesA
= StrAryCpyHeapAllocWToA(hHeap
, (WCHAR
**)&Aliases
);
539 result
= ERROR_SUCCESS
;
543 DnsRecordListFree(dp
, DnsFreeRecordList
);
548 #define SKIPWS(ptr, act) \
549 {while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;}
551 #define SKIPANDMARKSTR(ptr, act) \
552 {while(*ptr && !isspace(*ptr)) ptr++; \
553 if(!*ptr) {act;} else { *ptr = 0; ptr++; }}
557 DecodeServEntFromString(IN PCHAR ServiceString
,
558 OUT PCHAR
*ServiceName
,
559 OUT PCHAR
*PortNumberStr
,
560 OUT PCHAR
*ProtocolStr
,
566 //WS_DbgPrint(MAX_TRACE, ("Parsing service ent [%s]\n", ServiceString));
568 SKIPWS(ServiceString
, return FALSE
);
569 *ServiceName
= ServiceString
;
570 SKIPANDMARKSTR(ServiceString
, return FALSE
);
571 SKIPWS(ServiceString
, return FALSE
);
572 *PortNumberStr
= ServiceString
;
573 SKIPANDMARKSTR(ServiceString
, ;);
575 while (*ServiceString
&& NAliases
< MaxAlias
- 1)
577 SKIPWS(ServiceString
, break);
580 SKIPWS(ServiceString
, ;);
581 if (strlen(ServiceString
))
583 //WS_DbgPrint(MAX_TRACE, ("Alias: %s\n", ServiceString));
584 *Aliases
++ = ServiceString
;
587 SKIPANDMARKSTR(ServiceString
, ;);
592 *ProtocolStr
= strchr(*PortNumberStr
, '/');
600 //WS_DbgPrint(MAX_TRACE, ("Parsing done: %s %s %s %d\n",
601 // *ServiceName, *ProtocolStr, *PortNumberStr,
609 OpenNetworkDatabase(_In_ LPCWSTR Name
)
620 ExpandedPath
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
*sizeof(WCHAR
));
622 return INVALID_HANDLE_VALUE
;
624 /* Open the database path key */
625 ErrorCode
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
626 L
"System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
630 if (ErrorCode
== NO_ERROR
)
632 /* Read the actual path */
633 ErrorCode
= RegQueryValueEx(DatabaseKey
,
640 DatabasePath
= HeapAlloc(GetProcessHeap(), 0, RegSize
);
643 HeapFree(GetProcessHeap(), 0, ExpandedPath
);
644 return INVALID_HANDLE_VALUE
;
647 /* Read the actual path */
648 ErrorCode
= RegQueryValueEx(DatabaseKey
,
652 (LPBYTE
)DatabasePath
,
656 RegCloseKey(DatabaseKey
);
658 /* Expand the name */
659 ExpandEnvironmentStrings(DatabasePath
, ExpandedPath
, MAX_PATH
);
661 HeapFree(GetProcessHeap(), 0, DatabasePath
);
665 /* Use defalt path */
666 GetSystemDirectory(ExpandedPath
, MAX_PATH
);
667 StringCchLength(ExpandedPath
, MAX_PATH
, &StringLength
);
668 if (ExpandedPath
[StringLength
- 1] != L
'\\')
670 /* It isn't, so add it ourselves */
671 StringCchCat(ExpandedPath
, MAX_PATH
, L
"\\");
673 StringCchCat(ExpandedPath
, MAX_PATH
, L
"DRIVERS\\ETC\\");
676 /* Make sure that the path is backslash-terminated */
677 StringCchLength(ExpandedPath
, MAX_PATH
, &StringLength
);
678 if (ExpandedPath
[StringLength
- 1] != L
'\\')
680 /* It isn't, so add it ourselves */
681 StringCchCat(ExpandedPath
, MAX_PATH
, L
"\\");
684 /* Add the database name */
685 StringCchCat(ExpandedPath
, MAX_PATH
, Name
);
687 /* Return a handle to the file */
688 ret
= CreateFile(ExpandedPath
,
693 FILE_ATTRIBUTE_NORMAL
,
696 HeapFree(GetProcessHeap(), 0, ExpandedPath
);
701 NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data
,
702 _In_ DWORD dwControlFlags
,
703 _Out_ PWSHOSTINFOINTERN hostinfo
)
707 CHAR ServiceDBData
[BUFSIZ
* sizeof(WCHAR
)] = {0};
708 PCHAR ThisLine
= 0, NextLine
= 0, ServiceName
= 0, PortNumberStr
= 0,
709 ProtocolStr
= 0, Comment
= 0, EndValid
;
710 PCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = {0};
716 PCHAR nameServiceA
= NULL
;
717 PCHAR nameProtoA
= NULL
;
718 INT res
= WSANO_RECOVERY
;
720 if (!data
->hostnameW
)
722 res
= WSANO_RECOVERY
;
726 hHeap
= GetProcessHeap();
727 nameA
= StrW2AHeapAlloc(hHeap
, data
->hostnameW
);
729 /* nameA has the form <service-name>/<protocol>
730 we split these now */
731 nameProtoA
= strchr(nameA
, '/');
732 if (nameProtoA
== NULL
)
734 res
= WSANO_RECOVERY
;
739 i
= (DWORD
)(nameProtoA
- nameA
- 1);
740 nameServiceA
= (PCHAR
)HeapAlloc(hHeap
, 0, i
+ 1);
741 StringCbCopyA(nameServiceA
, i
+ 1, nameA
);
742 nameServiceA
[i
] = '\0';
744 ServicesFile
= OpenNetworkDatabase(L
"services");
745 if (ServicesFile
== INVALID_HANDLE_VALUE
)
747 return WSANO_RECOVERY
;
750 /* Scan the services file ...
752 * We will be share the buffer on the lines. If the line does not fit in
753 * the buffer, then moving it to the beginning of the buffer and read
754 * the remnants of line from file.
758 ReadFile(ServicesFile
,
760 sizeof( ServiceDBData
) - 1,
764 ThisLine
= NextLine
= ServiceDBData
;
765 EndValid
= ServiceDBData
+ ReadSize
;
766 ServiceDBData
[sizeof(ServiceDBData
) - 1] = '\0';
770 for (; *NextLine
!= '\r' && *NextLine
!= '\n'; NextLine
++)
772 if (NextLine
== EndValid
)
774 int LineLen
= NextLine
- ThisLine
;
776 if (ThisLine
== ServiceDBData
)
778 //WS_DbgPrint(MIN_TRACE,("Line too long"));
779 return WSANO_RECOVERY
;
782 memmove(ServiceDBData
, ThisLine
, LineLen
);
784 ReadFile(ServicesFile
,
785 ServiceDBData
+ LineLen
,
786 sizeof( ServiceDBData
)-1 - LineLen
,
790 EndValid
= ServiceDBData
+ LineLen
+ ReadSize
;
791 NextLine
= ServiceDBData
+ LineLen
;
792 ThisLine
= ServiceDBData
;
794 if (!ReadSize
) break;
799 Comment
= strchr(ThisLine
, '#');
802 *Comment
= '\0'; /* Terminate at comment start */
804 if (DecodeServEntFromString(ThisLine
,
809 WS2_INTERNAL_MAX_ALIAS
) &&
810 (strlen(nameProtoA
) == 0 || strcmp(ProtocolStr
, nameProtoA
) == 0))
812 Found
= (strcmp(ServiceName
, nameServiceA
) == 0 || strcmp(PortNumberStr
, nameServiceA
) == 0);
814 while ((!Found
) && (*AliasPtr
!= NULL
))
816 Found
= (strcmp(*AliasPtr
, nameServiceA
) == 0);
826 /* This we'll do no matter what */
827 CloseHandle(ServicesFile
);
835 hostinfo
->servnameW
= StrA2WHeapAlloc(hHeap
, ServiceName
);
836 hostinfo
->servprotoW
= StrA2WHeapAlloc(hHeap
, ProtocolStr
);
837 hostinfo
->servaliasesA
= StrAryCpyHeapAllocA(hHeap
, (char**)&Aliases
);
838 hostinfo
->servport
= atoi(PortNumberStr
);
844 HeapFree(hHeap
, 0, nameA
);
846 if (nameServiceA
!= NULL
)
847 HeapFree(hHeap
, 0, nameServiceA
);
853 NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data
,
854 _In_ DWORD dwControlFlags
,
855 _Inout_ LPWSAQUERYSETW lpRes
,
856 _Inout_ LPDWORD lpResLen
)
859 WSHOSTINFOINTERN hostinfo
;
861 HANDLE hHeap
= GetProcessHeap();
862 WCHAR
* ServiceInstanceNameW
= NULL
;
864 CHAR
* ServiceInstanceNameA
= NULL
;
865 CHAR
* ServiceProtocolNameA
= NULL
;
867 RtlZeroMemory(&hostinfo
, sizeof(hostinfo
));
869 /* init and build result-buffer */
870 mswBufferInit(&buf
, (BYTE
*)lpRes
, *lpResLen
);
871 mswBufferIncUsed(&buf
, sizeof(*lpRes
));
873 /* QueryDataSet-Size without "blob-data"-size! */
874 lpRes
->dwSize
= sizeof(*lpRes
);
875 lpRes
->dwNameSpace
= NS_DNS
;
877 if ((data
->CallID
== NSP_CALLID_HOSTNAME
) ||
878 (data
->CallID
== NSP_CALLID_HOSTBYNAME
) ||
879 (data
->CallID
== NSP_CALLID_SERVICEBYNAME
))
881 if (data
->CallIDCounter
>= 1)
889 result
= WSANO_RECOVERY
;
892 data
->CallIDCounter
++;
894 if (data
->CallID
== NSP_CALLID_HOSTNAME
)
896 result
= NSP_GetHostNameHeapAllocW(&hostinfo
.hostnameW
);
898 if (result
!= ERROR_SUCCESS
)
903 else if (data
->CallID
== NSP_CALLID_HOSTBYNAME
)
905 result
= NSP_GetHostByNameHeapAllocW(data
,
908 if (result
!= ERROR_SUCCESS
)
913 ASSERT(data
->CallID
== NSP_CALLID_SERVICEBYNAME
);
914 result
= NSP_GetServiceByNameHeapAllocW(data
,
917 if (result
!= ERROR_SUCCESS
)
921 if (((LUP_RETURN_BLOB
& data
->dwControlFlags
) != 0) ||
922 ((LUP_RETURN_NAME
& data
->dwControlFlags
) != 0))
924 if (data
->CallID
== NSP_CALLID_HOSTNAME
|| data
->CallID
== NSP_CALLID_HOSTBYNAME
)
926 ServiceInstanceNameW
= hostinfo
.hostnameW
;
927 ServiceInstanceNameA
= StrW2AHeapAlloc(hHeap
, ServiceInstanceNameW
);
928 if (ServiceInstanceNameA
== NULL
)
935 if (data
->CallID
== NSP_CALLID_SERVICEBYNAME
)
937 ServiceInstanceNameW
= hostinfo
.servnameW
;
938 ServiceInstanceNameA
= StrW2AHeapAlloc(hHeap
, ServiceInstanceNameW
);
939 if (ServiceInstanceNameA
== NULL
)
945 ServiceProtocolNameA
= StrW2AHeapAlloc(hHeap
, hostinfo
.servprotoW
);
946 if (ServiceProtocolNameA
== NULL
)
955 if ((LUP_RETURN_ADDR
& data
->dwControlFlags
) != 0)
957 if (!mswBufferAppendAddr_AddrInfoW(&buf
, lpRes
, hostinfo
.addr4
))
959 *lpResLen
= buf
.bytesUsed
;
965 if ((LUP_RETURN_BLOB
& data
->dwControlFlags
) != 0)
967 if (data
->CallID
== NSP_CALLID_HOSTBYNAME
)
969 /* Write data for PBLOB (hostent) */
970 if (!mswBufferAppendBlob_Hostent(&buf
,
972 (LUP_RETURN_ALIASES
& data
->dwControlFlags
) != 0 ? hostinfo
.servaliasesA
: NULL
,
973 ServiceInstanceNameA
,
976 *lpResLen
= buf
.bytesUsed
;
981 else if (data
->CallID
== NSP_CALLID_SERVICEBYNAME
)
983 /* Write data for PBLOB (servent) */
984 if (!mswBufferAppendBlob_Servent(&buf
,
986 ServiceInstanceNameA
,/* ServiceName */
987 (LUP_RETURN_ALIASES
& data
->dwControlFlags
) != 0 ? hostinfo
.servaliasesA
: NULL
,
988 ServiceProtocolNameA
,
991 *lpResLen
= buf
.bytesUsed
;
998 result
= WSANO_RECOVERY
;
1003 if ((LUP_RETURN_NAME
& data
->dwControlFlags
) != 0)
1005 /* HostByName sets the ServiceInstanceName to a
1006 (UNICODE)copy of hostent.h_name */
1007 lpRes
->lpszServiceInstanceName
= (LPWSTR
)mswBufferEndPtr(&buf
);
1008 if (!mswBufferAppendStrW(&buf
, ServiceInstanceNameW
))
1010 lpRes
->lpszServiceInstanceName
= NULL
;
1011 *lpResLen
= buf
.bytesUsed
;
1017 *lpResLen
= buf
.bytesUsed
;
1019 result
= ERROR_SUCCESS
;
1022 if (ServiceInstanceNameA
!= NULL
)
1023 HeapFree(hHeap
, 0, ServiceInstanceNameA
);
1025 if (ServiceProtocolNameA
!= NULL
)
1026 HeapFree(hHeap
, 0, ServiceProtocolNameA
);
1028 if (hostinfo
.hostnameW
!= NULL
)
1029 HeapFree(hHeap
, 0, hostinfo
.hostnameW
);
1031 if (hostinfo
.servnameW
!= NULL
)
1032 HeapFree(hHeap
, 0, hostinfo
.servnameW
);
1034 if (hostinfo
.servprotoW
!= NULL
)
1035 HeapFree(hHeap
, 0, hostinfo
.servprotoW
);
1040 /* Implementations - Exports */
1046 NSPStartup(_In_ LPGUID lpProviderId
,
1047 _Out_ LPNSP_ROUTINE lpRout
)
1051 if ((lpRout
== NULL
) ||
1052 (lpRout
->cbSize
!= sizeof(NSP_ROUTINE
)))
1054 WSASetLastError(ERROR_INVALID_PARAMETER
);
1055 return ERROR_INVALID_PARAMETER
;
1060 /* set own Provider GUID - maybe we need
1061 here to set the original mswsock-GUID?! */
1066 - sets cbSize to 44! */
1067 lpRout
->dwMajorVersion
= 1;
1068 lpRout
->dwMinorVersion
= 1;
1069 lpRout
->cbSize
= sizeof(*lpRout
) - sizeof(lpRout
->NSPIoctl
);
1070 lpRout
->NSPCleanup
= &mwsNSPCleanUp
;
1071 lpRout
->NSPLookupServiceBegin
= &mwsNSPLookupServiceBegin
;
1072 lpRout
->NSPLookupServiceNext
= &mwsNSPLookupServiceNext
;
1073 lpRout
->NSPLookupServiceEnd
= &mwsNSPLookupServiceEnd
;
1074 lpRout
->NSPSetService
= &mwsNSPSetService
;
1075 lpRout
->NSPInstallServiceClass
= &mwsNSPInstallServiceClass
;
1076 lpRout
->NSPRemoveServiceClass
= &mwsNSPRemoveServiceClass
;
1077 lpRout
->NSPGetServiceClassInfo
= &mwsNSPGetServiceClassInfo
;
1078 lpRout
->NSPIoctl
= NULL
;// &mwsNSPIoCtl;