windows-nt/Source/XPSP1/NT/ds/nameres/rnr/setup/test/rnrtest.c
2020-09-26 16:20:57 +08:00

193 lines
5.3 KiB
C

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winsock2.h>
#include <wsipx.h>
#include <svcguid.h>
#include <stdio.h>
#include <stdlib.h>
#include <rpc.h>
#include <rpcdce.h>
GUID ServiceClassId = { /* 5b50962a-e5a5-11cf-a555-00c04fd8d4ac */
0x5b50962a,
0xe5a5,
0x11cf,
{0xa5, 0x55, 0x00, 0xc0, 0x4f, 0xd8, 0xd4, 0xac}
};
#define BUFFSIZE 3000
_cdecl
main(int argc, char **argv)
{
HANDLE hLib;
WCHAR Buffer[BUFFSIZE];
WCHAR Buffer1[BUFFSIZE];
PWSAQUERYSETW Query = (PWSAQUERYSETW)Buffer;
PWSAQUERYSETW Query1 = (PWSAQUERYSETW)Buffer1;
HANDLE hRnr;
DWORD dwNameSpace = NS_NTDS;
DWORD dwIp;
DWORD dwQuerySize = BUFFSIZE;
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
memset(Query, 0, sizeof(*Query));
memset(Query1, 0, sizeof(*Query1));
Query->lpszServiceInstanceName = 0;
Query->dwNumberOfCsAddrs = 0;
Query->lpcsaBuffer = 0;
Query->dwNameSpace = dwNameSpace;
Query->dwSize = sizeof(*Query);
Query->lpServiceClassId = &ServiceClassId;
//
// Find containers. This should fail.
//
if ( WSALookupServiceBegin( Query,
LUP_CONTAINERS,
&hRnr ) == SOCKET_ERROR )
{
printf( "LookupBegin containers failed %d\n", GetLastError() );
}
else
{
//
// Ready to actually look for one of these ...
//
Query->dwSize = BUFFSIZE;
while ( WSALookupServiceNext( hRnr,
0,
&dwQuerySize,
Query ) == NO_ERROR )
{
printf( "Next containers got %ws\n",
Query->lpszServiceInstanceName );
}
printf( "Next finished with %d\n", GetLastError() );
WSALookupServiceEnd( hRnr );
}
Query1->dwSize = sizeof(*Query1); // TEST LATER
Query1->lpszServiceInstanceName = 0; // TEST NAME AND WILD CARDS
Query1->lpServiceClassId = &ServiceClassId; // REQUIRED - TEST
Query1->lpVersion = 0; // TEST LATER
Query1->dwNameSpace = dwNameSpace; // TEST
Query1->lpNSProviderId = &ServiceClassId; //BOGUS
Query1->lpafpProtocols = 0; // TEST LATER
if( WSALookupServiceBegin( Query1,
LUP_RETURN_NAME | // TEST ALL COMBINATIONS
LUP_RETURN_ADDR | // OF LUP FLAGS
LUP_RETURN_TYPE,
&hRnr) == SOCKET_ERROR)
{
printf( "LookupBegin for local name failed %d\n", GetLastError() );
goto more;
}
while ( WSALookupServiceNext( hRnr,
0,
&dwQuerySize,
Query1) == NO_ERROR )
{
printf( "Next succeeded with %d addresses for Service %ws:",
Query1->dwNumberOfCsAddrs,
Query1->lpszServiceInstanceName );
//
// get the address out. This is the local machine address that
// can be used in a revere lookup
//
if( Query1->dwNumberOfCsAddrs )
{
struct sockaddr_in * psock;
PBYTE p;
DWORD dwX;
for( dwX = 0; dwX < Query1->dwNumberOfCsAddrs; dwX++ )
{
psock = (struct sockaddr_in *)
Query1->lpcsaBuffer[dwX].RemoteAddr.lpSockaddr;
dwIp = psock->sin_addr.S_un.S_addr;
p = (PBYTE)&dwIp;
printf( "\n socket type %d, protocol %d, length %d addr: %d.%d.%d.%d, port %d\n",
Query1->lpcsaBuffer[dwX].iSocketType,
Query1->lpcsaBuffer[dwX].iProtocol,
Query1->lpcsaBuffer[dwX].RemoteAddr.iSockaddrLength,
(DWORD)p[0], (DWORD)p[1], (DWORD)p[2], (DWORD)p[3],
(DWORD)ntohs(psock->sin_port));
}
break;
}
}
if( WSALookupServiceEnd( hRnr ) )
{
printf("ServiceEnd failed %d\n", GetLastError());
}
else
{
printf("ServiceEnd succeeded\n");
}
//
// Let's try a reverse lookup on this address!
//
more:
Query->lpServiceClassId = &ServiceClassId;
Query->dwNameSpace = dwNameSpace;
Query->lpafpProtocols = 0;
//
// Ready to actually look for one of these ...
Query->lpszServiceInstanceName = 0;
Query->dwNumberOfCsAddrs = 1;
Query->lpcsaBuffer = Query1->lpcsaBuffer;
if( WSALookupServiceBegin( Query,
LUP_RETURN_NAME |
LUP_RETURN_ADDR,
&hRnr ) == SOCKET_ERROR )
{
printf( "LookupBegin for reverse failed %d\n", GetLastError() );
}
//
// Ready to actually look for one of these ...
//
while ( WSALookupServiceNext( hRnr,
0,
&dwQuerySize,
Query ) == NO_ERROR )
{
printf( "Next got %ws\n", Query->lpszServiceInstanceName );
}
printf( "Next finished with %d\n", GetLastError() );
//
// done.
//
if( WSALookupServiceEnd( hRnr ) )
{
printf( "ServiceEnd failed %d\n", GetLastError() );
}
WSACleanup();
return(0);
}