#pragma warning( disable : 4996 ) #include <windows.h> //#include <Winnetwk.h>//требует Mpr.lib //все три последующих заголовка включены в windows.h (по крайней мере в MSVS2005) //#include <winsock2.h>//требует Ws2_32.lib //#include <ws2tcpip.h>//требует Ws2_32.lib #include <stdio.h> #include <conio.h> char* ProcessWNGUErrors(int err) { switch(err) { case NO_ERROR: return "No Error"; case ERROR_BAD_DEVICE: return "ERROR_BAD_DEVICE"; case ERROR_CONNECTION_UNAVAIL: return "ERROR_CONNECTION_UNAVAIL"; case ERROR_EXTENDED_ERROR: return "ERROR_EXTENDED_ERROR, do WNetGetLastError to get details!"; case ERROR_MORE_DATA: return "ERROR_MORE_DATA"; case ERROR_NOT_SUPPORTED: return "ERROR_NOT_SUPPORTED"; case ERROR_NO_NET_OR_BAD_PATH: return "ERROR_NO_NET_OR_BAD_PATH"; case ERROR_NO_NETWORK: return "ERROR_NO_NETWORK"; case ERROR_NOT_CONNECTED: return "ERROR_NOT_CONNECTED"; } return "uncnown error"; } int main(int argc, char *argv[ ], char *envp[ ]) { int err; char Buffer[1000]; DWORD BufferSz = 1000; UNIVERSAL_NAME_INFO *puni = (UNIVERSAL_NAME_INFO*) &Buffer; REMOTE_NAME_INFO *prni = (REMOTE_NAME_INFO*) &Buffer; if(argc < 2) { printf("No argument!"); return 1; } char *dest = argv[1]; if(dest[1] != ':') { printf("Local paths only!"); return 1; } printf("Passed path: %s\n", dest); //WNetGetUniversalName Раскрывает данные смонтированного сетевого диска //UNIVERSAL_NAME_INFO_LEVEL даёт просто строку, переданную в мастере подключения диска //REMOTE_NAME_INFO_LEVEL выдаёт расширенную информацию о созданном подключении err = WNetGetUniversalName(dest, UNIVERSAL_NAME_INFO_LEVEL, (LPVOID) &Buffer, &BufferSz); printf("WNetGetUniversalName for UNIVERSAL_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err)); if(err == NO_ERROR) printf("returned params:\nUniversalName: %s\n", puni->lpUniversalName); printf("============================================\n"); err = WNetGetUniversalName(dest, REMOTE_NAME_INFO_LEVEL, &Buffer, &BufferSz); printf("WNetGetUniversalName for REMOTE_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err)); if(err == NO_ERROR) printf("returned params:\nConnectionName: %s\nRemainingPath: %s\nUniversalName: %s\n", prni->lpConnectionName, prni->lpRemainingPath, prni->lpUniversalName); printf("press any key to retrive host info...\n"); getch(); printf("============================================\n"); char HostName[260] = {0}; { //тут находим конец имени хоста в полном пути int ln=2; while(ln<260) { if(prni->lpUniversalName[ln] == '\\') break; ln++; } ln -= 2; memcpy(HostName, prni->lpUniversalName+2, ln); //и вырезаем его } if(!isalpha(HostName[0])) { printf("NO host name, IP is: %s\n", HostName); return 0; } printf("host name is: %s\n", HostName); //далее выковыриваем IP адрес из имени хоста // Declare and initialize variables DWORD dwError; WSADATA wsaData; int iResult; struct hostent *remoteHost; struct in_addr addr; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } printf("Calling gethostbyname with %s\n", HostName); remoteHost = gethostbyname(HostName); if (remoteHost == NULL) { dwError = WSAGetLastError(); if (dwError != 0) { if (dwError == WSAHOST_NOT_FOUND) { printf("Host not found\n"); return 1; } else if (dwError == WSANO_DATA) { printf("No data record found\n"); return 1; } else { printf("Function failed with error: %ld\n", dwError); return 1; } } } else { printf("Function returned:\n"); printf("\tOfficial name: %s\n", remoteHost->h_name); printf("\tAlternate names: %s\n", remoteHost->h_aliases); printf("\tAddress type: "); switch (remoteHost->h_addrtype) { case AF_INET: printf("AF_INET\n"); break; /*case AF_INET6: printf("AF_INET\n"); break;*/ case AF_NETBIOS: printf("AF_NETBIOS\n"); break; default: printf(" %d\n", remoteHost->h_addrtype); break; } printf("\tAddress length: %d\n", remoteHost->h_length); addr.s_addr = *(u_long *) remoteHost->h_addr_list[0]; printf("\tFirst IP Address: %s\n", inet_ntoa(addr)); } return 0; } |