| Platform SDK: Active Directory, ADSI, and Directory Services |
The following function is used by the example Winsock service above to unregister the RnR connection point for the service.
/*
** Simple Winsock Service
*/
#include <winsock2.h>
#include <stdio.h>
//{A9033BC1-ECA4-11cf-A054-00AA006C33ED}
static GUID SVCID_EXAMPLE_SERVICE =
{ 0xa9033bc1, 0xeca4, 0x11cf, { 0xa0, 0x54, 0x0, 0xaa, 0x0, 0x6c, 0x33, 0xed } };
static WCHAR ServiceInstanceName[] = L"Example Service Instance";
static WCHAR ServiceInstanceComment[] = L"ExampleService instance registered in the directory service through RnR";
INT
serverUnregister(SOCKADDR * sa)
{
DWORD ret;
WSAVERSION Version;
WSAQUERYSET QuerySet;
CSADDR_INFO CSAddrInfo[1];
SOCKADDR sa_local;
memset(&QuerySet,0,sizeof(QuerySet));
memset(&CSAddrInfo,0,sizeof(CSAddrInfo));
memset(&sa_local,0,sizeof(SOCKADDR));
sa_local.sa_family = AF_INET;
//Build the CSAddrInfo structure to contain address
//information. This is what clients will use to make a connection
//
//Note that the LocalAddr is zeroed out because
//dynamically assigned port numbers are used.
//
CSAddrInfo[0].LocalAddr.iSockaddrLength = sizeof( SOCKADDR );
CSAddrInfo[0].LocalAddr.lpSockaddr = &sa_local;
CSAddrInfo[0].RemoteAddr.iSockaddrLength = sizeof( SOCKADDR );
CSAddrInfo[0].RemoteAddr.lpSockaddr = sa;
CSAddrInfo[0].iSocketType = SOCK_STREAM;
CSAddrInfo[0].iProtocol = PF_INET;
QuerySet.dwSize = sizeof( WSAQUERYSET );
QuerySet.lpServiceClassId = &SVCID_EXAMPLE_SERVICE;
QuerySet.lpszServiceInstanceName = ServiceInstanceName;
QuerySet.lpszComment = ServiceInstanceComment;
QuerySet.lpVersion = &Version;
QuerySet.lpVersion->dwVersion = 2;
QuerySet.lpVersion->ecHow = COMP_NOTLESS;
QuerySet.dwNameSpace = NS_NTDS;
QuerySet.dwNumberOfCsAddrs = 1;
QuerySet.lpcsaBuffer = CSAddrInfo;
ret = WSASetService( &QuerySet,
RNRSERVICE_DEREGISTER,
SERVICE_MULTIPLE );
return( ret );
}