www.pudn.com > whois.zip > WINWHOIS.C
#define WINDOWS #include#include #include #include #include #include #include #include "winwhois.h" #define NICHOST "rs.internic.net" HANDLE hInst; HANDLE saveinst; char szQueryhost[128] = NICHOST; char szHost [256]; char szServHost[128]; REQUEST FAR *HeadReq = NULL; HANDLE hHeadReq = NULL; HWND hDialog; // int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HWND hMainWindow; saveinst = hInstance; if (!hPrevInstance) if (!InitApplication (hInstance)) return FALSE; if (!InitInstance (hInstance, nCmdShow, &hMainWindow)) return FALSE; LoadString (hInstance, IDC_WHOISLISTSERVER, (LPSTR)szServHost, 128); SendMessage (hMainWindow, WM_COMMAND, IDC_STARTDIALOG, 0); while (GetMessage (&msg, 0, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return (msg.wParam); } BOOL InitApplication (HANDLE hInstCurrent) { WNDCLASS wc; WNDCLASS windc; memset(&windc, 0x00, sizeof(WNDCLASS)); memset(&wc, 0x00, sizeof(WNDCLASS)); windc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; windc.lpfnWndProc = QueryWndProc; windc.cbClsExtra = 0; windc.cbWndExtra = 0; windc.hInstance = hInstCurrent; windc.hIcon = LoadIcon (saveinst, "QMARK"); windc.hCursor = LoadCursor (NULL, IDC_ARROW); windc.hbrBackground = GetStockObject (WHITE_BRUSH); windc.lpszMenuName = NULL; windc.lpszClassName = "PurposelessWindow"; if (!RegisterClass (&windc)) { MessageBox (NULL, "Cannot start program", "Whois", MB_OK|MB_ICONHAND); return 0; } wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstCurrent; wc.hIcon = LoadIcon (saveinst, "QMARK"); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = GetStockObject (WHITE_BRUSH); // Create brush for erasing background wc.lpszMenuName = NULL; wc.lpszClassName = "UselessWindow"; return (RegisterClass (&wc)); } BOOL InitInstance (HANDLE hInstCurrent, int nCmdShow, LPHANDLE lphMainWindow ) { HWND hWnd; hInst = hInstCurrent; hWnd = CreateWindow ("UselessWindow", "whois for Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstCurrent, NULL); if (hWnd == NULL) return FALSE; *lphMainWindow = hWnd; return TRUE; } LONG FAR APIENTRY MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { FARPROC lpfnProcDialog; WORD suword; WSADATA WSAData; switch (message) { case WM_COMMAND: if (LOWORD(wParam) != IDC_STARTDIALOG) return (DefWindowProc (hWnd, message, wParam, lParam)); else { suword = MAKEWORD (1,1); WSAStartup (suword, &WSAData); lpfnProcDialog = MakeProcInstance ((FARPROC) MainDialog, hInst); DialogBox (hInst, "WinWhoIs", hWnd, lpfnProcDialog); FreeProcInstance (lpfnProcDialog); PostMessage (hWnd, WM_DESTROY, 0, 0); break; } case WM_DESTROY: WSACleanup (); PostQuitMessage (0); break; default: return (DefWindowProc (hWnd, message, wParam, lParam)); } return 0; } BOOL FAR PASCAL ChangeHost (HWND hDlg, WORD message, WPARAM wParam, LPARAM lParam) { char szHost [128]; switch (message) { case WM_INITDIALOG: strcpy (szHost, szQueryhost); SendDlgItemMessage (hDlg, IDC_HOSTINPUT, (UINT) WM_SETTEXT, (WPARAM) 0, (LPARAM) ((LPSTR) szHost)); SendDlgItemMessage (hDlg, IDC_HOSTINPUT, (UINT) EM_SETSEL, (WPARAM) 0, MAKELPARAM (0, -1)); SendMessage (GetDlgItem (hDlg, IDC_HOSTINPUT), EM_LIMITTEXT, 128, 0L); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_HOSTINPUT: if (HIWORD (lParam) == EN_CHANGE) { if (SendDlgItemMessage (hDlg, IDC_HOSTINPUT, EM_LINELENGTH, 0, 0L)) EnableWindow (GetDlgItem (hDlg, IDC_CHANGEHOST), TRUE); else EnableWindow (GetDlgItem (hDlg, IDC_CHANGEHOST), FALSE); return TRUE; } else return FALSE; case IDC_CHANGEHOST: SendDlgItemMessage (hDlg, IDC_HOSTINPUT, (UINT) WM_GETTEXT, (WPARAM) 128, (LPARAM) ((LPSTR) szHost)); SendDlgItemMessage (hDlg, IDC_HOSTINPUT, (UINT) EM_SETSEL, 0, MAKELPARAM (0,-1)); if (*szHost) { strcpy (szQueryhost, szHost); } else { MessageBox (NULL, "No hostname specified!", "WinWhoIs", MB_OK | MB_ICONHAND); } EndDialog (hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog (hDlg, TRUE); } } return FALSE; } BOOL FAR PASCAL About (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { EndDialog (hDlg, TRUE); return (TRUE); } break; } return FALSE; } void DoWhoIsQuery (HWND hDlg, LPSTR lpszName, LPSTR lpszQHost) { struct sockaddr_in; HANDLE hWind; REQUEST FAR *thisreq; hWind = CreateWindow ("PurposelessWindow", "Whois/Win query", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hDlg, NULL, hInst, NULL); if (hWind == NULL) { MessageBox (NULL, "Could not start query", "WinWhois", MB_OK|MB_ICONHAND); return; } thisreq = HeadReq; if (thisreq != NULL) { while (thisreq->NextReq != NULL) { thisreq = thisreq->NextReq; } thisreq->hNextReq = GlobalAlloc (GHND, sizeof (REQUEST)); thisreq->NextReq = (REQUEST FAR*)GlobalLock (thisreq->hNextReq); thisreq = thisreq->NextReq; } else { hHeadReq = GlobalAlloc (GHND, sizeof (REQUEST)); HeadReq = (REQUEST FAR*)GlobalLock (hHeadReq); thisreq = HeadReq; } thisreq->hWin = hWind; thisreq->hHost = GlobalAlloc (GHND, 256); thisreq->lpHost = GlobalLock (thisreq->hHost); lstrcpy (thisreq->lpHost, lpszName); thisreq->hQuery = GlobalAlloc (GHND, 128); thisreq->lpQuery = GlobalLock (thisreq->hQuery); lstrcpy (thisreq->lpQuery, lpszQHost); thisreq->NextReq = NULL; thisreq->hNextReq = NULL; PostMessage (hWind, START_QUERY, 0, 0); return; } BOOL FAR PASCAL MainDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { hDialog = hDlg; SendDlgItemMessage (hDlg, IDC_RESPONSES, EM_LIMITTEXT,0,0); SendDlgItemMessage (hDlg, IDC_RESPONSES, EM_FMTLINES, 1, 0L); EnableWindow (GetDlgItem (hDlg, IDC_MAKEQUERY), FALSE); return TRUE; } case WM_CLOSE: { EndDialog (hDlg, 0); break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_ABOUT: { FARPROC lpfnAboutDialog; lpfnAboutDialog = MakeProcInstance (About, hInst); DialogBox (hInst, "AboutBox", hDlg, lpfnAboutDialog); FreeProcInstance (lpfnAboutDialog); return TRUE; } case IDM_CHANGEHOST: { FARPROC lpfnChangeDialog; lpfnChangeDialog = MakeProcInstance (ChangeHost, hInst); DialogBox (hInst, "GetHostBox", hDlg, lpfnChangeDialog); FreeProcInstance (lpfnChangeDialog); return TRUE; } case IDM_CUT: case IDM_COPY: case IDM_CLEAR: /* if the selection is empty, make it all... */ { DWORD dwStartAndEnd; WORD wStartChar; WORD wEndChar; dwStartAndEnd = SendDlgItemMessage (hDlg, IDC_RESPONSES, EM_GETSEL, 0, 0L); wStartChar = LOWORD (dwStartAndEnd); wEndChar = HIWORD (dwStartAndEnd); if (wStartChar == wEndChar) { SendDlgItemMessage (hDlg, IDC_RESPONSES, EM_SETSEL, 0, MAKELPARAM (0, -1)); dwStartAndEnd = SendDlgItemMessage (hDlg, IDC_RESPONSES, EM_GETSEL, 0, 0L); wStartChar = LOWORD (dwStartAndEnd); wEndChar = HIWORD (dwStartAndEnd); if (wStartChar == wEndChar) break; } if (wParam == IDM_CUT) SendDlgItemMessage (hDlg, IDC_RESPONSES, WM_CUT, 0,0); else if (wParam == IDM_COPY) SendDlgItemMessage (hDlg, IDC_RESPONSES, WM_COPY, 0, 0); else SendDlgItemMessage (hDlg, IDC_RESPONSES, WM_CLEAR, 0, 0); SetFocus (GetDlgItem (hDlg, IDC_NAMEINPUT)); return TRUE; } case IDC_HELP: { MessageBox (NULL, "Enter the name you wish to query in the " "Name to Query field, and press return. " "For help about whois, query on the name " "\"help\".", "WinWhoIs", MB_ICONINFORMATION | MB_OK); SetFocus (GetDlgItem (hDlg, IDC_NAMEINPUT)); return TRUE; } case IDC_CLEAR: ClearText (hDlg, IDC_RESPONSES); SetFocus (GetDlgItem (hDlg, IDC_NAMEINPUT)); return TRUE; case IDC_NAMEINPUT: if (HIWORD (wParam) == EN_CHANGE) { if (SendDlgItemMessage (hDlg, IDC_NAMEINPUT, EM_LINELENGTH, 0, 0L)) EnableWindow (GetDlgItem (hDlg, IDC_MAKEQUERY), TRUE); else EnableWindow (GetDlgItem (hDlg, IDC_MAKEQUERY), FALSE); return TRUE; } else return FALSE; case IDC_MAKEQUERY: SendDlgItemMessage (hDlg, IDC_NAMEINPUT, (UINT) WM_GETTEXT, (WPARAM) 255, (LPARAM) ((LPSTR) szHost)); SendDlgItemMessage (hDlg, IDC_NAMEINPUT, (UINT) EM_SETSEL, 0, MAKELPARAM (0,-1)); if (*szHost) { char szStatus[144]; strcpy (szStatus, "Querying server '"); strcat (szStatus, szQueryhost); strcat (szStatus, "'."); strcat (szHost, "\r\n"); SendDlgItemMessage (hDlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM) (LPCSTR) szStatus); DoWhoIsQuery(hDlg,(LPSTR)szHost,(LPSTR)szQueryhost); return TRUE; } else { MessageBox (NULL, "No name to query specified!", "WinWhoIs", MB_OK | MB_ICONHAND); return TRUE; } case IDC_GETLIST: { char szStatus[144]; strcpy (szStatus, "Querying server '"); strcat (szStatus, szServHost); strcat (szStatus, "'."); strcat (szHost, "\r\n"); SendDlgItemMessage (hDlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM) (LPCSTR) szStatus); DoWhoIsQuery (hDlg, (LPSTR)"whois-servers\r\n", (LPSTR)szServHost); return TRUE; } case IDC_EXIT: while (hHeadReq != NULL) { HWND hWindow; hWindow = HeadReq->hWin; closesocket (HeadReq->s); CleanRequest (hWindow); DestroyWindow (hWindow); } EndDialog (hDlg, 0); return TRUE; } return FALSE; } return FALSE; } void CopyText (HWND hDlg, WORD wIDControl) { HANDLE hWholeString; HANDLE hCutString; LPSTR lpszWholeString; LPSTR lpszCutString; DWORD ccControl; WORD wStartChar; WORD wEndChar; DWORD dwStartAndEnd; dwStartAndEnd = SendDlgItemMessage (hDlg, wIDControl, EM_GETSEL, 0, 0L); wStartChar = LOWORD (dwStartAndEnd); wEndChar = HIWORD (dwStartAndEnd); if (wStartChar == wEndChar) { SendDlgItemMessage (hDlg, wIDControl, EM_SETSEL, 0, MAKELPARAM (0, -1)); dwStartAndEnd = SendDlgItemMessage (hDlg, wIDControl, EM_GETSEL, 0, 0L); wStartChar = LOWORD (dwStartAndEnd); wEndChar = HIWORD (dwStartAndEnd); if (wStartChar == wEndChar) return; } hWholeString = GlobalAlloc (GHND, ccControl = SendDlgItemMessage (hDlg, wIDControl, WM_GETTEXTLENGTH, 0,0) + 256); lpszWholeString = GlobalLock (hWholeString); SendDlgItemMessage (hDlg, wIDControl, WM_GETTEXT, (WPARAM) ccControl, (LPARAM) lpszWholeString); hCutString = GlobalAlloc (GHND, wEndChar - wStartChar + 256); lpszCutString = GlobalLock (hCutString); memcpy (lpszCutString, lpszWholeString + wStartChar * sizeof (char), (wEndChar - wStartChar) * sizeof (char)); GlobalUnlock (hCutString); OpenClipboard (hDlg); EmptyClipboard (); SetClipboardData (CF_TEXT, hCutString); CloseClipboard (); GlobalFree (hCutString); GlobalUnlock (hWholeString); GlobalFree (hWholeString); } void ClearText (HWND hDlg, WORD wIDControl) { DWORD dwStartAndEnd; WORD wStartChar; WORD wEndChar; dwStartAndEnd = SendDlgItemMessage (hDlg, wIDControl, EM_GETSEL, 0, 0L); wStartChar = LOWORD (dwStartAndEnd); wEndChar = HIWORD (dwStartAndEnd); if (wStartChar == wEndChar) SendDlgItemMessage (hDlg, wIDControl, EM_SETSEL, 0, MAKELPARAM (0, -1)); SendDlgItemMessage (hDlg, wIDControl, EM_REPLACESEL, 0, (LPARAM) (LPCSTR) ""); } LONG FAR PASCAL QueryWndProc (HWND hWind, UINT message, WPARAM wParam, LPARAM lParam) { int s, i, cc, iOutPos; struct sockaddr_in; DWORD addr; HANDLE hszLine, hszOutput; LPSTR lpszLine; LPSTR lpszOutput; REQUEST FAR *thisreq; switch (message) { case START_QUERY: { thisreq = FindRequest (hWind); thisreq->hbuffer = GlobalAlloc (GHND, MAXGETHOSTSTRUCT); thisreq->lpbuffer = (struct hostent FAR *)GlobalLock (thisreq->hbuffer); WSAAsyncGetHostByName (hWind, IDC_GOTADDR, thisreq->lpQuery, (LPSTR)thisreq->lpbuffer, MAXGETHOSTSTRUCT); return TRUE; } case IDC_GOTADDR: { unsigned long ii; ii = 1; thisreq = FindRequest (hWind); if (WSAGETASYNCERROR (lParam) != 0) { MessageBox (NULL, "Could not resolve host", "WinWhoIs", MB_OK | MB_ICONHAND); GRelease (&thisreq->hbuffer); return FALSE; } memcpy (&addr, thisreq->lpbuffer->h_addr_list[0], thisreq->lpbuffer->h_length); thisreq->s = socket (PF_INET, SOCK_STREAM, 0); if (thisreq->s < 0) { MessageBox (NULL, "Could not create socket for communication", "WinWhoIs", MB_OK | MB_ICONHAND); GRelease (&thisreq->hbuffer); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } ioctlsocket (thisreq->s, FIONBIO, (unsigned long FAR *)&ii); thisreq->sock_in.sin_family = PF_INET; thisreq->sock_in.sin_port = 0; thisreq->sock_in.sin_addr.s_addr = INADDR_ANY; if (bind (thisreq->s, (struct sockaddr FAR*) &(thisreq->sock_in), sizeof (thisreq->sock_in)) < 0) { MessageBox (NULL, "Could not bind socket.", "WinWhoIs", MB_OK | MB_ICONHAND); closesocket (thisreq->s); GRelease (&thisreq->hbuffer); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } GRelease (&thisreq->hbuffer); thisreq->sphandle = GlobalAlloc (GHND, MAXGETHOSTSTRUCT); thisreq->sp = (struct servent FAR *)GlobalLock (thisreq->sphandle); memcpy ((char FAR *)&(thisreq->sock_in.sin_addr), (char FAR *)&addr, 4); WSAAsyncGetServByName (hWind, IDC_GOTSERVER, "whois", "tcp", (LPSTR)thisreq->sp, MAXGETHOSTSTRUCT); return TRUE; } case IDC_GOTSERVER: { thisreq = FindRequest (hWind); if (WSAGETASYNCERROR (lParam) != 0) { MessageBox (NULL, "Found no service: whois / tcp", "WinWhoIs", MB_OK | MB_ICONHAND); closesocket (thisreq->s); GRelease (&thisreq->sphandle); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } if (!thisreq->sp) { MessageBox (NULL, "Can't lock service: whois / tcp", "WinWhoIs", MB_OK | MB_ICONHAND); closesocket (thisreq->s); GRelease (&thisreq->sphandle); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } thisreq->sock_in.sin_port = thisreq->sp -> s_port; if (connect (thisreq->s, (struct sockaddr FAR *) &(thisreq->sock_in), sizeof (thisreq->sock_in)) != 0) { int lerror; lerror = WSAGetLastError (); if (lerror == WSAEWOULDBLOCK) { WSAAsyncSelect (thisreq->s, hWind, IDC_GOTCONNECT, FD_CONNECT); GRelease (&thisreq->sphandle); return FALSE; } else { wsprintf (lpszLine,"Could not connect; error #%d", lerror); MessageBox (NULL, lpszLine, "WinWhoIs", MB_OK | MB_ICONHAND); closesocket (thisreq->s); GRelease (&thisreq->sphandle); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } } GRelease (&thisreq->sphandle); /* Fall Through */ } case IDC_GOTCONNECT: { thisreq = FindRequest (hWind); if (send (thisreq->s, (LPSTR)thisreq->lpHost, lstrlen ((LPSTR)thisreq->lpHost), 0) == SOCKET_ERROR) { int lerror; lerror = WSAGetLastError (); if (lerror == WSAEWOULDBLOCK) { WSAAsyncSelect (thisreq->s, hWind, IDC_GOTCONNECT, FD_WRITE); return FALSE; } else { MessageBox (NULL, "Could not send request", "WinWhoIs", MB_OK | MB_ICONHAND); closesocket (thisreq->s); PostMessage (hWind, IDC_RESETDISPLAY, 0, 0); return FALSE; } } WSAAsyncSelect (thisreq->s, hWind, IDC_GOTRESPONSE, FD_READ | FD_CLOSE); return TRUE; } case IDC_GOTRESPONSE: { hszLine = GlobalAlloc (GHND, 256); lpszLine = GlobalLock (hszLine); hszOutput = GlobalAlloc (GHND, 512); lpszOutput = GlobalLock (hszOutput); s = (int) wParam; if ((cc = recv (s, lpszLine, 256, 0)) > 0) { for (i = 0, iOutPos = 0; i < cc; ++i) if (lpszLine [i] == '\n') { lpszOutput [iOutPos++] = '\r'; lpszOutput [iOutPos++] = '\n'; } else lpszOutput [iOutPos++] = lpszLine [i]; lpszOutput [iOutPos] = '\0'; SendDlgItemMessage (hDialog, IDC_RESPONSES, EM_REPLACESEL, 0, (LPARAM) ((LPCSTR) lpszOutput)); GlobalUnlock (hszLine); GlobalFree (hszLine); GlobalUnlock (hszOutput); GlobalFree (hszOutput); return FALSE; /* If there's more, WSASelect() will get it... */ } else if (cc != 0) { int ii; if (ii = WSAGetLastError () == WSAEWOULDBLOCK) return FALSE; MessageBox (NULL, "Receiving error occurred.", "WinWhois", MB_OK | MB_ICONHAND); } /* Now we're done; clean up */ WSAAsyncSelect (s, hWind, 0, 0); if (closesocket (s)) MessageBox (NULL, "Socket did not close!", "WinWhois", MB_OK | MB_ICONHAND); GlobalUnlock (hszLine); GlobalFree (hszLine); GlobalUnlock (hszOutput); GlobalFree (hszOutput); SendDlgItemMessage (hDialog, IDC_STATUS, WM_SETTEXT, 0, (LPARAM) (LPCSTR) "Waiting for input..."); SetFocus (GetDlgItem (hDialog, IDC_NAMEINPUT)); /* Fall Through */ } case IDC_RESETDISPLAY: { CleanRequest (hWind); DestroyWindow (hWind); return TRUE; } default: return (DefWindowProc (hWind, message, wParam, lParam)); } /*switch*/ return FALSE; } REQUEST FAR *FindRequest (HWND hWind) { REQUEST FAR *CurrReq; int flag; flag = TRUE; CurrReq = HeadReq; while ((CurrReq != NULL) && (flag)) { if (CurrReq->hWin == hWind) flag = FALSE; else { CurrReq = CurrReq->NextReq; } } return CurrReq; } void GRelease (HANDLE FAR *h) { if (*h) { GlobalUnlock (*h); GlobalFree (*h); *h=NULL; } return; } void CleanRequest (HWND hWind) { REQUEST FAR *thisreq; REQUEST FAR *tempreq; HANDLE temph; thisreq = FindRequest (hWind); GRelease (&thisreq->hHost); GRelease (&thisreq->hQuery); GRelease (&thisreq->hbuffer); GRelease (&thisreq->sphandle); if (thisreq == HeadReq) { tempreq = thisreq->NextReq; temph = thisreq->hNextReq; GRelease (&hHeadReq); hHeadReq = temph; HeadReq = tempreq; return; } tempreq = HeadReq; while (tempreq->NextReq != thisreq) tempreq = tempreq->NextReq; temph = tempreq->hNextReq; tempreq->hNextReq = thisreq->hNextReq; tempreq->NextReq = thisreq->NextReq; GRelease (&temph); return; }