Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

168 lines
4.9 KiB

#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}
};
GUID ServiceGuid = { 0x47da8500, 0x96a1, 0x11cd, 0x90, 0x1d,
0x20, 0x4c, 0x4f, 0x4f, 0x50, 0x20 };
#define BUFFSIZE 3000
_cdecl
main(int argc, char **argv)
{
HANDLE hLib;
WCHAR Buffer[BUFFSIZE];
PWSAQUERYSETW Query = (PWSAQUERYSETW)Buffer;
HANDLE hRnr;
DWORD dwIp;
DWORD dwQuerySize = BUFFSIZE;
WSADATA wsaData;
ANSI_STRING asServiceInstanceName;
UNICODE_STRING usServiceInstanceName;
WCHAR UnicodeStringBuf[1024];
ANSI_STRING asContext;
UNICODE_STRING usContext;
WCHAR UnicodeStringBuf2[1024];
AFPROTOCOLS lpAfpProtocols[3];
usServiceInstanceName.Length = 0;
usServiceInstanceName.MaximumLength = 1024;
usServiceInstanceName.Buffer = UnicodeStringBuf;
usContext.Length = 0;
usContext.MaximumLength = 1024;
usContext.Buffer = UnicodeStringBuf2;
if ( argc != 5 )
{
printf( "\nUsage: lookup <Name> <Context> Deep Echo\n" );
return( -1 );
}
RtlInitAnsiString( &asServiceInstanceName, argv[1] );
RtlAnsiStringToUnicodeString( &usServiceInstanceName,
&asServiceInstanceName,
FALSE );
RtlInitAnsiString( &asContext, argv[2] );
RtlAnsiStringToUnicodeString( &usContext,
&asContext,
FALSE );
WSAStartup(MAKEWORD(1, 1), &wsaData);
memset(Query, 0, sizeof(*Query));
Query->dwSize = sizeof(*Query);
if ( usServiceInstanceName.Buffer[0] != L'*' )
{
Query->lpszServiceInstanceName = usServiceInstanceName.Buffer;
}
if ( argv[4][0] == 'E' )
{
Query->lpServiceClassId = &ServiceGuid;
}
else
{
Query->lpServiceClassId = &ServiceClassId;
}
Query->lpVersion = 0;
Query->dwNameSpace = NS_NTDS;
Query->lpNSProviderId = 0;
Query->lpszContext = usContext.Buffer;
Query->dwNumberOfProtocols = 0;
lpAfpProtocols[0].iAddressFamily = AF_INET;
lpAfpProtocols[0].iProtocol = PF_INET;
lpAfpProtocols[1].iAddressFamily = AF_IPX;
lpAfpProtocols[1].iProtocol = PF_IPX;
lpAfpProtocols[2].iAddressFamily = AF_UNSPEC;
lpAfpProtocols[2].iProtocol = PF_UNSPEC;
Query->lpafpProtocols = lpAfpProtocols;
if( WSALookupServiceBegin( Query,
( argv[3][0] == 'D' ? LUP_DEEP : 0 ) |
LUP_RETURN_NAME |
LUP_RETURN_TYPE |
LUP_RETURN_VERSION |
LUP_RETURN_COMMENT |
LUP_RETURN_ADDR |
LUP_RETURN_BLOB,
// LUP_RETURN_ALIASES |
// LUP_RETURN_QUERY_STRING |
// LUP_RETURN_ALL,
&hRnr ) == SOCKET_ERROR )
{
printf( "LookupBegin failed %d\n", GetLastError() );
}
while ( WSALookupServiceNext( hRnr,
0,
&dwQuerySize,
Query ) == NO_ERROR )
{
printf( "Next got: \n" );
printf( " dwSize = %d\n",
Query->dwSize );
printf( " dwOutputFlags = %d\n",
Query->dwOutputFlags );
printf( " lpszServiceInstanceName = %ws\n",
Query->lpszServiceInstanceName );
if ( Query->lpVersion )
{
printf( " lpVersion->dwVersion = %d\n",
Query->lpVersion->dwVersion );
printf( " lpVersion->ecHow = %d\n",
Query->lpVersion->ecHow );
}
if ( Query->lpszComment )
{
printf( " lpszComment = %ws\n",
Query->lpszComment );
}
printf( " dwNameSpace = %d\n",
Query->dwNameSpace );
if ( Query->lpszContext )
{
printf( " lpszContext = %ws\n",
Query->lpszContext );
}
printf( " dwNumberOfCsAddrs = %d\n",
Query->dwNumberOfCsAddrs );
}
printf( "Next finished with %d\n", GetLastError() );
if( WSALookupServiceEnd( hRnr ) )
{
printf( "ServiceEnd failed %d\n", GetLastError() );
}
WSACleanup();
return(0);
}