windows-nt/Source/XPSP1/NT/net/tapi/skywalker/rend/rndilslk.cpp
2020-09-26 16:20:57 +08:00

165 lines
3.4 KiB
C++

/*++
Copyright (c) 1997-2000 Microsoft Corporation
Module Name:
rndilslk.cpp
Abstract:
This module contains code to look up ILS in NTDS.
--*/
#include "stdafx.h"
#include <initguid.h>
///////////////////////////////////////////////////////////////////////////////
// //
// Global constants //
// //
///////////////////////////////////////////////////////////////////////////////
// {C9F17940-79A7-11d1-B008-00C04FC31FEE}
DEFINE_GUID(CLSID_ILSServicClass,
0xc9f17940, 0x79a7, 0x11d1, 0xb0, 0x8, 0x0, 0xc0, 0x4f, 0xc3, 0x1f, 0xee);
#define BUFFSIZE 3000
int LookupILSServiceBegin(
HANDLE * pHandle
)
/*++
Routine Description:
Begin ILS service enumeration.
Arguments:
pHandle - the handle of the enumerator.
Return Value:
Wisock error codes.
--*/
{
WSAVERSION Version;
AFPROTOCOLS lpAfpProtocols[1];
WSAQUERYSET Query;
if (IsBadWritePtr(pHandle, sizeof(HANDLE *)))
{
return ERROR_INVALID_PARAMETER;
}
ZeroMemory(&Query, sizeof(WSAQUERYSET));
Query.dwNumberOfProtocols = 1;
lpAfpProtocols[0].iAddressFamily = AF_INET;
lpAfpProtocols[0].iProtocol = PF_INET;
Query.lpafpProtocols = lpAfpProtocols;
Query.lpszServiceInstanceName = L"*";
Query.dwNameSpace = NS_NTDS;
Query.dwSize = sizeof(Query);
Query.lpServiceClassId = (GUID *)&CLSID_ILSServicClass;
if (WSALookupServiceBegin(
&Query,
LUP_RETURN_ALL,
pHandle ) == SOCKET_ERROR )
{
return WSAGetLastError();
}
return NOERROR;
}
int LookupILSServiceNext(
HANDLE Handle,
TCHAR * pBuf,
DWORD * pdwBufSize,
WORD * pwPort
)
/*++
Routine Description:
look up the next ILS server.
Arguments:
Handle - The handle of the enumeration.
pBuf - A pointer to a buffer of TCHARs that will store the DNS
name of the ILS server.
pdwBufSize - The size of the buffer.
pwPort - The port that the ILS server is using.
Return Value:
Wisock error codes.
--*/
{
TCHAR buffer[BUFFSIZE];
DWORD dwSize = BUFFSIZE;
LPWSAQUERYSET lpResult = (LPWSAQUERYSET)buffer;
LPCSADDR_INFO lpCSAddrInfo;
LPSOCKADDR lpSocketAddress;
if (WSALookupServiceNext(Handle, 0, &dwSize, lpResult) == SOCKET_ERROR)
{
return WSAGetLastError();
}
lpCSAddrInfo = lpResult->lpcsaBuffer;
if (IsBadReadPtr(lpCSAddrInfo, sizeof(CSADDR_INFO)))
{
return ERROR_BAD_FORMAT;
}
lpSocketAddress = lpCSAddrInfo->RemoteAddr.lpSockaddr;
if (IsBadReadPtr(lpSocketAddress, sizeof(SOCKADDR)))
{
return ERROR_BAD_FORMAT;
}
*pwPort = ((struct sockaddr_in*) lpSocketAddress->sa_data)->sin_port;
lstrcpyn(pBuf, lpResult->lpszServiceInstanceName, *pdwBufSize);
*pdwBufSize = lstrlen(pBuf);
return NOERROR;
}
int LookupILSServiceEnd(
HANDLE Handle
)
/*++
Routine Description:
Finish the ils service enumerator.
Arguments:
Handle - the handle of the enumerator.
Return Value:
Wisock error codes.
--*/
{
if (WSALookupServiceEnd(Handle) == SOCKET_ERROR)
{
return WSAGetLastError();
}
return NOERROR;
}