#include #include #include #include #include #include #include #include #include #include #include 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); }