Source code of Windows XP (NT5)
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.

137 lines
3.7 KiB

  1. #include <nt.h>
  2. #include <ntrtl.h>
  3. #include <nturtl.h>
  4. #include <windows.h>
  5. #include <winsock2.h>
  6. #include <wsipx.h>
  7. #include <svcguid.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <rpc.h>
  11. #include <rpcdce.h>
  12. #include "..\..\dnslib\dnslib.h"
  13. #define BUFFSIZE 3000
  14. VOID
  15. PrintIpAddress (
  16. IN DWORD dwIpAddress )
  17. {
  18. printf( " %d.%d.%d.%d\n",
  19. ((BYTE *) &dwIpAddress)[0],
  20. ((BYTE *) &dwIpAddress)[1],
  21. ((BYTE *) &dwIpAddress)[2],
  22. ((BYTE *) &dwIpAddress)[3] );
  23. }
  24. _cdecl
  25. main(int argc, char **argv)
  26. {
  27. HANDLE hLib;
  28. WCHAR Buffer[BUFFSIZE];
  29. PWSAQUERYSETW Query = (PWSAQUERYSETW)Buffer;
  30. HANDLE hRnr;
  31. DWORD dwIp;
  32. DWORD dwQuerySize = BUFFSIZE;
  33. WSADATA wsaData;
  34. WCHAR UnicodeServiceName[1024];
  35. AFPROTOCOLS lpAfpProtocols[3];
  36. // GUID ServiceGuid = SVCID_HOSTNAME;
  37. GUID ServiceGuid = SVCID_INET_HOSTADDRBYNAME;
  38. // GUID ServiceGuid = SVCID_DNS(28);
  39. // GUID ServiceGuid = SVCID_DNS_TYPE_SRV;
  40. DWORD uLoop;
  41. DWORD iter;
  42. if ( argc != 2 )
  43. {
  44. printf( "\nUsage: lookup <Name>\n" );
  45. return( -1 );
  46. }
  47. Dns_NameCopy( UnicodeServiceName,
  48. NULL,
  49. argv[1],
  50. 0,
  51. DnsCharSetAnsi,
  52. DnsCharSetUnicode );
  53. WSAStartup(MAKEWORD(2, 0), &wsaData);
  54. memset(Query, 0, sizeof(*Query));
  55. Query->lpszServiceInstanceName = UnicodeServiceName;
  56. Query->dwSize = sizeof(*Query);
  57. Query->dwNameSpace = NS_ALL;
  58. Query->lpServiceClassId = &ServiceGuid;
  59. if( WSALookupServiceBeginW( Query,
  60. LUP_RETURN_ADDR |
  61. LUP_RETURN_ALIASES |
  62. // LUP_RETURN_BLOB |
  63. LUP_RETURN_NAME,
  64. &hRnr ) == SOCKET_ERROR )
  65. {
  66. printf( "LookupBegin failed %d\n", GetLastError() );
  67. }
  68. while ( WSALookupServiceNextW( hRnr,
  69. 0,
  70. &dwQuerySize,
  71. Query ) == NO_ERROR )
  72. {
  73. printf( "Next got: \n" );
  74. printf( " dwSize = %d\n",
  75. Query->dwSize );
  76. printf( " dwOutputFlags = %d\n",
  77. Query->dwOutputFlags );
  78. printf( " lpszServiceInstanceName = %S\n",
  79. Query->lpszServiceInstanceName );
  80. if ( Query->lpVersion )
  81. {
  82. printf( " lpVersion->dwVersion = %d\n",
  83. Query->lpVersion->dwVersion );
  84. printf( " lpVersion->ecHow = %d\n",
  85. Query->lpVersion->ecHow );
  86. }
  87. if ( Query->lpszComment )
  88. {
  89. printf( " lpszComment = %ws\n",
  90. Query->lpszComment );
  91. }
  92. printf( " dwNameSpace = %d\n",
  93. Query->dwNameSpace );
  94. if ( Query->lpszContext )
  95. {
  96. printf( " lpszContext = %S\n",
  97. Query->lpszContext );
  98. }
  99. printf( " dwNumberOfCsAddrs = %d\n",
  100. Query->dwNumberOfCsAddrs );
  101. for ( iter = 0; iter < Query->dwNumberOfCsAddrs; iter++ )
  102. {
  103. if ( Query->lpcsaBuffer[iter].RemoteAddr.lpSockaddr->sa_data )
  104. {
  105. printf( " Address : " );
  106. PrintIpAddress( * ((DWORD*) &Query->lpcsaBuffer[iter].RemoteAddr.lpSockaddr->sa_data[2]) );
  107. }
  108. }
  109. }
  110. printf( "Next finished with %d\n", GetLastError() );
  111. if( WSALookupServiceEnd( hRnr ) )
  112. {
  113. printf( "ServiceEnd failed %d\n", GetLastError() );
  114. }
  115. WSACleanup();
  116. return(0);
  117. }