/*++ BUILD Version: 0000 // Increment this if a change has global effects Copyright (c) 1996 Microsoft Corporation Module Name: sockeye.c Abstract: Contains UI support for winsock browser util. Author: Dan Knudson (DanKn) 29-Jul-1996 Revision History: --*/ #include "sockeye.h" #include #include #include #include #include #include #include #include #include "resource.h" #include "vars.h" #include "nspapi.h" int giCurrNumStartups = 0; HWND hwndEdit2, ghwndModal; char gszEnterAs[32]; PASYNC_REQUEST_INFO gpAsyncReqInfoList = NULL; PMYSOCKET gpSelectedSocket; MYSOCKET gNullSocket; LRESULT glCurrentSelection; WSAPROTOCOL_INFOA gWSAProtocolInfoA; WSAPROTOCOL_INFOW gWSAProtocolInfoW; HFONT ghFixedFont; WSAEVENT ghSelectedEvent; INT giSelectedEventIndex; WSAPROTOCOL_INFOW gDupSockProtoInfo; char gszSocket[] = "socket"; char gszSockEye[] = "SockEye"; char gszUnknown[] = "unknown"; char gszProtocol[] = "Protocol"; char gszHostName[] = "HostName"; char gszSendFlags[] = "SendFlags"; char gszRecvFlags[] = "RecvFlags"; char gszXxxSUCCESS[] = "%s SUCCESS"; char gszSocketType[] = "SocketType"; char gszPortNumber[] = "PortNumber"; char gszServiceName[] = "ServiceName"; char gszIoctlCommand[] = "IoctlCommand"; char gszProtocolName[] = "ProtocolName"; char gszUnknownError[] = "unknown error"; char gszAddressFamily[] = "AddressFamily"; char gszWSASocketFlags[] = "WSASocketFlags"; char gszProtocolNumber[] = "ProtocolNumber"; DWORD gdwDefPortNum; DWORD gdwDefProtocol; DWORD gdwDefProtoNum; DWORD gdwDefIoctlCmd; DWORD gdwDefSendFlags; DWORD gdwDefRecvFlags; DWORD gdwDefAddrFamily; DWORD gdwDefSocketType; DWORD gdwDefWSASocketFlags; char gszDefHostName[MAX_STRING_PARAM_SIZE]; char gszDefProtoName[MAX_STRING_PARAM_SIZE]; char gszDefServName[MAX_STRING_PARAM_SIZE]; char * PASCAL GetTimeStamp( void ); void ShowStructByField( PSTRUCT_FIELD_HEADER pHeader, BOOL bSubStructure ); VOID PASCAL ShowGUID( char *pszProlog, GUID *pGuid ); void FAR PASCAL FuncDriver( FUNC_INDEX funcIndex ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; HWND hwnd; DWORD i; HACCEL hAccel; ghInst = hInstance; ZeroMemory (&gNullSocket, sizeof (MYSOCKET)); ZeroMemory (&gWSAProtocolInfoA, sizeof (WSAPROTOCOL_INFOA)); ZeroMemory (&gWSAProtocolInfoW, sizeof (WSAPROTOCOL_INFOW)); { DWORD d = 0x76543210; wsprintf( gszEnterAs, "Ex: enter x%x as %02x%02x%02x%02x", d, (DWORD) *((LPBYTE) &d), (DWORD) *(((LPBYTE) &d) + 1), (DWORD) *(((LPBYTE) &d) + 2), (DWORD) *(((LPBYTE) &d) + 3) ); } hwnd = CreateDialog( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG1), (HWND)NULL, (DLGPROC) MainWndProc ); hwndEdit2 = CreateWindow ("edit", "", 0, 0, 0, 0, 0, NULL, NULL, ghInst, NULL); if (!hwndEdit2) { MessageBox (NULL, "err creating edit ctl", "", MB_OK); } hAccel = LoadAccelerators( ghInst, (LPCSTR)MAKEINTRESOURCE(IDR_ACCELERATOR1) ); while (GetMessage (&msg, NULL, 0, 0)) { if (hAccel==NULL || !TranslateAccelerator (hwnd, hAccel, &msg)) { TranslateMessage (&msg); DispatchMessage (&msg); } } DestroyWindow (hwndEdit2); return 0; } LPVOID PASCAL MyAlloc( SIZE_T dwSize ) { LPVOID p; if (!(p = LocalAlloc (LPTR, dwSize))) { ShowStr ("LocalAlloc (LPTR, x%x) failed, error=%d", GetLastError()); } return p; } void PASCAL MyFree( LPVOID p ) { if (p) { LocalFree (p); } } void GetCurrentSelections( void ) { LRESULT lSel = SendMessage (ghwndList1, LB_GETCURSEL, 0, 0); LRESULT lSelCount = SendMessage (ghwndList3, LB_GETSELCOUNT, 0, 0); if ((lSel = SendMessage (ghwndList1, LB_GETCURSEL, 0, 0)) != LB_ERR) { glCurrentSelection = lSel; gpSelectedSocket = (PMYSOCKET) SendMessage( ghwndList1, LB_GETITEMDATA, (WPARAM) lSel, 0 ); } else { gpSelectedSocket = &gNullSocket; } if (lSelCount == 0 || lSelCount == LB_ERR) { ghSelectedEvent = NULL; } else { SendMessage( ghwndList3, LB_GETSELITEMS, 1, (LPARAM) &giSelectedEventIndex ); ghSelectedEvent = (WSAEVENT) SendMessage( ghwndList3, LB_GETITEMDATA, giSelectedEventIndex, 0 ); } } BOOL LetUserMungeParams( PFUNC_PARAM_HEADER pParamsHeader ) { if (!bShowParams) { return TRUE; } return (DialogBoxParam( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG2), ghwndModal, (DLGPROC) ParamsDlgProc, (LPARAM) pParamsHeader ) ? TRUE : FALSE); } INT_PTR CALLBACK MainWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { static HICON hIcon; static HMENU hMenu; static int icyButton, icyBorder; static HFONT hFont, hFont2; static int iMaxEditTextLength; static HANDLE hTimerEvent; #define TIMER_ID 55 #define TIMER_TIMEOUT 2000 int i; static LONG cxList1, cxList2, cxWnd, xCapture, cxVScroll, lCaptureFlags = 0; static int cyWnd; typedef struct _XXX { DWORD dwMenuID; DWORD dwFlags; } XXX, *PXXX; static XXX aXxx[] = { { IDM_LOGSTRUCTDWORD ,DS_BYTEDUMP }, { IDM_LOGSTRUCTALLFIELD ,DS_NONZEROFIELDS|DS_ZEROFIELDS }, { IDM_LOGSTRUCTNONZEROFIELD ,DS_NONZEROFIELDS }, { IDM_LOGSTRUCTNONE ,0 } }; switch (msg) { case WM_INITDIALOG: { RECT rect; char buf[64]; DWORD dwInitialized; wsprintf( buf, "WinSock API Browser (ProcessID=x%x)", GetCurrentProcessId() ); SetWindowText (hwnd, buf); ghwndMain = ghwndModal = hwnd; ghwndList1 = GetDlgItem (hwnd, IDC_LIST1); ghwndList2 = GetDlgItem (hwnd, IDC_LIST2); ghwndList3 = GetDlgItem (hwnd, IDC_LIST3); ghwndEdit = GetDlgItem (hwnd, IDC_EDIT1); hMenu = GetMenu (hwnd); hIcon = LoadIcon (ghInst, MAKEINTRESOURCE(IDI_ICON1)); icyBorder = GetSystemMetrics (SM_CYFRAME); cxVScroll = 2*GetSystemMetrics (SM_CXVSCROLL); GetWindowRect (GetDlgItem (hwnd, IDC_BUTTON1), &rect); icyButton = (rect.bottom - rect.top) + icyBorder + 3; for (i = 0; aFuncNames[i]; i++) { SendMessage( ghwndList2, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) aFuncNames[i] ); } // SendMessage (ghwndList2, LB_SETCURSEL, (WPARAM) lInitialize, 0); // // Read in defaults from ini file // { typedef struct _DEF_VALUE { char far *lpszEntry; char far *lpszDefValue; LPVOID lp; } DEF_VALUE; DEF_VALUE aDefVals[] = { { "BufSize", "100", &dwBigBufSize }, { "UserButton1", "500", aUserButtonFuncs }, { "UserButton2", "500", aUserButtonFuncs + 1 }, { "UserButton3", "500", aUserButtonFuncs + 2 }, { "UserButton4", "500", aUserButtonFuncs + 3 }, { "UserButton5", "500", aUserButtonFuncs + 4 }, { "UserButton6", "500", aUserButtonFuncs + 5 }, { "Initialized", "0", &dwInitialized }, { gszAddressFamily, "2", &gdwDefAddrFamily }, { gszSocketType, "2", &gdwDefSocketType }, { gszProtocol, "0", &gdwDefProtocol }, { gszProtocolNumber, "0", &gdwDefProtoNum }, { gszPortNumber, "0", &gdwDefPortNum }, { gszIoctlCommand, "0", &gdwDefIoctlCmd }, { gszSendFlags, "0", &gdwDefSendFlags }, { gszRecvFlags, "0", &gdwDefRecvFlags }, { gszWSASocketFlags, "0", &gdwDefWSASocketFlags }, { NULL, NULL, NULL }, { gszHostName, "HostName", gszDefHostName }, { gszProtocolName, "ProtoName", gszDefProtoName }, { gszServiceName, "ServiceName", gszDefServName }, { NULL, NULL, NULL }, { "UserButton1Text", "", &aUserButtonsText[0] }, { "UserButton2Text", "", &aUserButtonsText[1] }, { "UserButton3Text", "", &aUserButtonsText[2] }, { "UserButton4Text", "", &aUserButtonsText[3] }, { "UserButton5Text", "", &aUserButtonsText[4] }, { "UserButton6Text", "", &aUserButtonsText[5] }, { NULL, NULL, NULL } }; int i, j; for (i = 0; aDefVals[i].lpszEntry; i++) { GetProfileString( gszSockEye, aDefVals[i].lpszEntry, aDefVals[i].lpszDefValue, buf, 15 ); sscanf (buf, "%lx", aDefVals[i].lp); } i++; for (; aDefVals[i].lpszEntry; i++) { GetProfileString( gszSockEye, aDefVals[i].lpszEntry, aDefVals[i].lpszDefValue, (LPSTR) aDefVals[i].lp, MAX_STRING_PARAM_SIZE - 1 ); } i++; for (j = i; aDefVals[i].lpszEntry; i++) { GetProfileString( gszSockEye, aDefVals[i].lpszEntry, aDefVals[i].lpszDefValue, (LPSTR) aDefVals[i].lp, MAX_USER_BUTTON_TEXT_SIZE - 1 ); SetDlgItemText( hwnd, IDC_BUTTON7 + (i - j), (LPCSTR)aDefVals[i].lp ); } if (dwInitialized == 0) { // // If here assume this is first time user had started // app, so post a msg that will automatically bring up // the hlp dlg // PostMessage (hwnd, WM_COMMAND, IDM_USAGE, 0); } } pBigBuf = MyAlloc (dwBigBufSize); { //HFONT hFontMenu = SendMessage (hMenu, WM_GETFONT, 0, 0); hFont = CreateFont( 13, 5, 0, 0, 400, 0, 0, 0, 0, 1, 2, 1, 34, "MS Sans Serif" ); ghFixedFont = hFont2 = CreateFont( 13, 8, 0, 0, 400, 0, 0, 0, 0, 1, 2, 1, 49, "Courier" ); for (i = 0; i < 12; i++) { SendDlgItemMessage( hwnd, IDC_BUTTON1 + i, WM_SETFONT, (WPARAM) hFont, 0 ); } SendDlgItemMessage (hwnd, IDM_PARAMS, WM_SETFONT,(WPARAM) hFont,0); SendMessage (ghwndList1, WM_SETFONT, (WPARAM) hFont, 0); SendMessage (ghwndList2, WM_SETFONT, (WPARAM) hFont, 0); SendMessage (ghwndList3, WM_SETFONT, (WPARAM) hFont, 0); SendMessage (ghwndEdit, WM_SETFONT, (WPARAM) hFont2, 0); } GetProfileString( gszSockEye, "ControlRatios", "20, 20, 100", buf, 63 ); sscanf (buf, "%ld,%ld,%ld", &cxList2, &cxList1, &cxWnd); GetProfileString( gszSockEye, "Position", "max", buf, 63 ); if (strcmp (buf, "max") == 0) { ShowWindow (hwnd, SW_SHOWMAXIMIZED); } else { int left = 100, top = 100, right = 600, bottom = 400; sscanf (buf, "%d,%d,%d,%d", &left, &top, &right, &bottom); // // Check to see if wnd pos is wacky, if so reset to reasonable vals // if (left < 0 || left >= (GetSystemMetrics (SM_CXSCREEN) - 32) || top < 0 || top >= (GetSystemMetrics (SM_CYSCREEN) - 32)) { left = top = 100; right = 600; bottom = 400; } SetWindowPos( hwnd, HWND_TOP, left, top, right - left, bottom - top, SWP_SHOWWINDOW ); GetClientRect (hwnd, &rect); SendMessage( hwnd, WM_SIZE, 0, MAKELONG((rect.right-rect.left),(rect.bottom-rect.top)) ); ShowWindow (hwnd, SW_SHOW); } iMaxEditTextLength = ((GetVersion() & 0x80000000) ? 29998 : // we're on win95, and edit controls are 16-bit 0x20000 // were on NT, and have real 32-bit edit controls ); hTimerEvent = CreateEvent (NULL, FALSE, FALSE, NULL); SetTimer (hwnd, TIMER_ID, TIMER_TIMEOUT, NULL); break; } case WM_COMMAND: { FUNC_INDEX funcIndex; BOOL bShowParamsSave = bShowParams; switch (LOWORD((DWORD)wParam)) { case IDC_EDIT1: #ifdef WIN32 if (HIWORD(wParam) == EN_CHANGE) #else if (HIWORD(lParam) == EN_CHANGE) #endif { // // Watch to see if the edit control is full, & if so // purge the top half of the text to make room for more // int length = GetWindowTextLength (ghwndEdit); // if (length > iMaxEditTextLength) if (length > 29998) { #ifdef WIN32 SendMessage( ghwndEdit, EM_SETSEL, (WPARAM) 0, (LPARAM) 10000 ); #else SendMessage( ghwndEdit, EM_SETSEL, (WPARAM) 1, (LPARAM) MAKELONG (0, 10000) ); #endif SendMessage( ghwndEdit, EM_REPLACESEL, 0, (LPARAM) (char far *) "" ); #ifdef WIN32 SendMessage( ghwndEdit, EM_SETSEL, (WPARAM)0xfffffffd, (LPARAM)0xfffffffe ); #else SendMessage( ghwndEdit, EM_SETSEL, (WPARAM)1, (LPARAM) MAKELONG (0xfffd, 0xfffe) ); #endif } } break; case IDC_BUTTON1: FuncDriver (ws_WSAStartup); break; case IDC_BUTTON2: FuncDriver (ws_WSACleanup); break; case IDC_BUTTON3: FuncDriver (ws_socket); break; case IDC_BUTTON4: FuncDriver (ws_WSASocketA); break; case IDC_BUTTON5: GetCurrentSelections(); FuncDriver (ws_closesocket); break; case IDC_BUTTON6: case IDM_CLEAR: SetWindowText (ghwndEdit, ""); break; case IDM_PARAMS: bShowParams = (bShowParams ? FALSE : TRUE); if (bShowParams) { CheckMenuItem( hMenu, IDM_PARAMS, MF_BYCOMMAND | MF_CHECKED ); CheckDlgButton (hwnd, IDM_PARAMS, 1); } else { CheckMenuItem( hMenu, IDM_PARAMS, MF_BYCOMMAND | MF_UNCHECKED ); CheckDlgButton (hwnd, IDM_PARAMS, 0); } break; case IDC_BUTTON7: case IDC_BUTTON8: case IDC_BUTTON9: case IDC_BUTTON10: case IDC_BUTTON11: case IDC_BUTTON12: { DWORD i = (DWORD) (LOWORD((DWORD)wParam)) - IDC_BUTTON7; if (aUserButtonFuncs[i] >= MiscBegin) { // // Hot button func id is bogus, so bring // up hot button init dlg // DialogBoxParam( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG3), (HWND) hwnd, (DLGPROC) UserButtonsDlgProc, (LPARAM) &i ); } else { // // Invoke the user button's corresponding func // GetCurrentSelections (); FuncDriver ((FUNC_INDEX) aUserButtonFuncs[i]); } break; } case IDC_PREVCTRL: { HWND hwndPrev = GetNextWindow (GetFocus (), GW_HWNDPREV); if (!hwndPrev) { hwndPrev = ghwndList2; } SetFocus (hwndPrev); break; } case IDC_NEXTCTRL: { HWND hwndNext = GetNextWindow (GetFocus (), GW_HWNDNEXT); if (!hwndNext) { hwndNext = GetDlgItem (hwnd, IDM_PARAMS); } SetFocus (hwndNext); break; } case IDC_ENTER: { if (GetFocus() != ghwndEdit) { GetCurrentSelections (); FuncDriver( (FUNC_INDEX)SendMessage( ghwndList2, LB_GETCURSEL, 0, 0 )); } else { // Send the edit ctrl a cr/lf } break; } case IDC_LIST1: #ifdef WIN32 switch (HIWORD(wParam)) #else switch (HIWORD(lParam)) #endif { case LBN_DBLCLK: { /* LONG lSel = SendMessage (ghwndList1, LB_GETCURSEL, 0, 0); PMYWIDGET pWidget; pWidget = (PMYWIDGET) SendMessage( ghwndList1, LB_GETITEMDATA, (WPARAM) lSel, 0 ); bShowParams = FALSE; // UpdateResults (TRUE); switch (pWidget->dwType) { } // UpdateResults (FALSE); bShowParams = bShowParamsSave; */ break; } } // switch break; case IDC_LIST2: #ifdef WIN32 if (HIWORD(wParam) == LBN_DBLCLK) #else if (HIWORD(lParam) == LBN_DBLCLK) #endif { GetCurrentSelections (); FuncDriver( (FUNC_INDEX)SendMessage( ghwndList2, LB_GETCURSEL, 0, 0 )); } break; case IDM_EXIT: { PostMessage (hwnd, WM_CLOSE, 0, 0); break; } case IDM_DEFAULTVALUES: { char szHostName[MAX_STRING_PARAM_SIZE], szProtoName[MAX_STRING_PARAM_SIZE], szServName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "Buffer size", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { gszAddressFamily, PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { gszSocketType, PT_ORDINAL, (ULONG_PTR) gdwDefSocketType, aSocketTypes }, { gszProtocol, PT_ORDINAL, (ULONG_PTR) gdwDefProtocol, aProtocols }, { gszProtocolNumber, PT_DWORD, (ULONG_PTR) gdwDefProtoNum, NULL }, { gszPortNumber, PT_DWORD, (ULONG_PTR) gdwDefPortNum, NULL }, { gszIoctlCommand, PT_ORDINAL, (ULONG_PTR) gdwDefIoctlCmd, aWSAIoctlCmds }, { gszHostName, PT_STRING, (ULONG_PTR) szHostName, szHostName }, { gszProtocolName, PT_STRING, (ULONG_PTR) szProtoName, szProtoName }, { gszServiceName, PT_STRING, (ULONG_PTR) szServName, szServName }, { gszSendFlags, PT_FLAGS, (ULONG_PTR) aWSASendFlags, aWSASendFlags }, { gszRecvFlags, PT_FLAGS, (ULONG_PTR) aWSARecvFlags, aWSARecvFlags }, { gszWSASocketFlags, PT_FLAGS, (ULONG_PTR) aWSAFlags, aWSAFlags } }; FUNC_PARAM_HEADER paramsHeader = { 13, DefValues, params, NULL }; BOOL bShowParamsSave = bShowParams; bShowParams = TRUE; lstrcpyA (szHostName, gszDefHostName); lstrcpyA (szProtoName, gszDefProtoName); lstrcpyA (szServName, gszDefServName); if (LetUserMungeParams (¶msHeader)) { if (params[0].dwValue != dwBigBufSize) { LPVOID pTmpBigBuf = MyAlloc (params[0].dwValue); if (pTmpBigBuf) { MyFree (pBigBuf); pBigBuf = pTmpBigBuf; dwBigBufSize = (DWORD) params[0].dwValue; } } gdwDefAddrFamily = (DWORD) params[1].dwValue; gdwDefSocketType = (DWORD) params[2].dwValue; gdwDefProtocol = (DWORD) params[3].dwValue; gdwDefProtoNum = (DWORD) params[4].dwValue; gdwDefPortNum = (DWORD) params[5].dwValue; gdwDefIoctlCmd = (DWORD) params[6].dwValue; if (params[7].dwValue == (ULONG_PTR) szHostName) { lstrcpyA (gszDefHostName, szHostName); } if (params[8].dwValue == (ULONG_PTR) szProtoName) { lstrcpyA (gszDefProtoName, szProtoName); } if (params[9].dwValue == (ULONG_PTR) szServName) { lstrcpyA (gszDefServName, szServName); } gdwDefSendFlags = (DWORD) params[10].dwValue; gdwDefRecvFlags = (DWORD) params[11].dwValue; gdwDefWSASocketFlags = (DWORD) params[12].dwValue; } bShowParams = bShowParamsSave; break; } case IDM_USERBUTTONS: DialogBoxParam( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG3), (HWND) hwnd, (DLGPROC) UserButtonsDlgProc, (LPARAM) NULL ); break; case IDM_DUMPPARAMS: bDumpParams = (bDumpParams ? FALSE : TRUE); CheckMenuItem( hMenu, IDM_DUMPPARAMS, MF_BYCOMMAND | (bDumpParams ? MF_CHECKED : MF_UNCHECKED) ); break; case IDM_LOGSTRUCTDWORD: case IDM_LOGSTRUCTALLFIELD: case IDM_LOGSTRUCTNONZEROFIELD: case IDM_LOGSTRUCTNONE: for (i = 0; aXxx[i].dwFlags != dwDumpStructsFlags; i++); CheckMenuItem( hMenu, aXxx[i].dwMenuID, MF_BYCOMMAND | MF_UNCHECKED ); for (i = 0; aXxx[i].dwMenuID != LOWORD((DWORD)wParam); i++); CheckMenuItem( hMenu, aXxx[i].dwMenuID, MF_BYCOMMAND | MF_CHECKED ); dwDumpStructsFlags = aXxx[i].dwFlags; break; case IDM_TIMESTAMP: bTimeStamp = (bTimeStamp ? FALSE : TRUE); CheckMenuItem( hMenu, IDM_TIMESTAMP, MF_BYCOMMAND | (bTimeStamp ? MF_CHECKED : MF_UNCHECKED) ); break; case IDM_LOGFILE: { if (hLogFile) { fclose (hLogFile); hLogFile = (FILE *) NULL; CheckMenuItem( hMenu, IDM_LOGFILE, MF_BYCOMMAND | MF_UNCHECKED ); } else { OPENFILENAME ofn; char szDirName[256] = ".\\"; char szFile[256] = "sockeye.log\0"; char szFileTitle[256] = ""; static char *szFilter = "Log files (*.log)\0*.log\0All files (*.*)\0*.*\0\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = (LPSTR) NULL; ofn.nMaxCustFilter = 0L; ofn.nFilterIndex = 1; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = sizeof(szFileTitle); ofn.lpstrInitialDir = szDirName; ofn.lpstrTitle = (LPSTR) NULL; ofn.Flags = 0L; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = "LOG"; if (!GetOpenFileName(&ofn)) { return 0L; } if ((hLogFile = fopen (szFile, "at")) == (FILE *) NULL) { MessageBox( hwnd, "Error creating log file", gszSockEye, MB_OK ); } else { struct tm *newtime; time_t aclock; time (&aclock); newtime = localtime (&aclock); fprintf( hLogFile, "\n---Log opened: %s\n", asctime (newtime) ); CheckMenuItem( hMenu, IDM_LOGFILE, MF_BYCOMMAND | MF_CHECKED ); } } break; } case IDM_USAGE: { static char szUsage[] = "ABSTRACT:\r\n" \ " SockEye (the WinSock API Browser) allows a user " \ "to interactively call into the Windows Sockets " \ "API, modify parameters, and inspect all returned " \ "information.\r\n" \ "\r\n" \ "GETTING STARTED:\r\n" \ "1. Press the 'Startup' button to initialize WinSock\r\n" \ "2. Double-click on items in the left-most window " \ "to invoke the corresponding API. (Check the Params " \ "checkbox in the upper left corner to change " \ "parameters.)\r\n" \ "* Press the 'Cleanup' button to shutdown WinSock\r\n" \ "\r\n" \ "MORE INFO:\r\n" \ "* Choose 'Options/Default values...' to modify " \ "default parameter values\r\n" \ "* Choose 'Options/Record log file' to save all " \ "output to a file.\r\n" \ "* All parameter values in hexadecimal unless " \ "specified (strings displayed by contents, not " \ "pointer value).\r\n" \ "* Choose 'Options/User buttons...' or press " \ "one of the buttons on right side of toolbar to " \ "create a personal hot-link between a button and a " \ "particular function."; DialogBoxParam( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG6), (HWND)hwnd, (DLGPROC) AboutDlgProc, (LPARAM) szUsage ); break; } case IDM_NOHANDLECHK: gbDisableHandleChecking = (gbDisableHandleChecking ? 0 : 1); CheckMenuItem( hMenu, IDM_NOHANDLECHK, MF_BYCOMMAND | (gbDisableHandleChecking ? MF_CHECKED : MF_UNCHECKED) ); break; case IDM_ABOUT: { DialogBoxParam( ghInst, (LPCSTR)MAKEINTRESOURCE(IDD_DIALOG4), (HWND)hwnd, (DLGPROC) AboutDlgProc, 0 ); break; } } // switch break; } case WM_ASYNCREQUESTCOMPLETED: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = DequeueAsyncRequestInfo ((HANDLE) wParam))) { if (WSAGETASYNCERROR(lParam) == 0) { ShowStr( "Request x%x (%s) completed successfully", pAsyncReqInfo->hRequest, aFuncNames[pAsyncReqInfo->FuncIndex] ); switch (pAsyncReqInfo->FuncIndex) { case ws_WSAAsyncGetHostByAddr: case ws_WSAAsyncGetHostByName: ShowHostEnt ((struct hostent *) (pAsyncReqInfo + 1)); break; case ws_WSAAsyncGetProtoByName: case ws_WSAAsyncGetProtoByNumber: ShowProtoEnt ((struct protoent *) (pAsyncReqInfo + 1)); break; case ws_WSAAsyncGetServByName: case ws_WSAAsyncGetServByPort: ShowServEnt ((struct servent *) (pAsyncReqInfo + 1)); break; } } else { char FAR *pszError; for( i = 0; WSAGETASYNCERROR(lParam) != aWSAErrors[i].dwVal && aWSAErrors[i].lpszVal; i++ ); pszError = (aWSAErrors[i].lpszVal ? aWSAErrors[i].lpszVal : gszUnknownError); ShowStr( "Request x%x (%s) completed unsuccessfully: %s (%d)", pAsyncReqInfo->hRequest, aFuncNames[pAsyncReqInfo->FuncIndex], pszError, (DWORD) WSAGETASYNCERROR(lParam) ); } MyFree (pAsyncReqInfo); } else { } break; } case WM_NETWORKEVENT: // case WM_NETWORKEVENT: format info ShowStr ("WM_NETWORKEVENT: wParam=x%x, lParam=x%x", wParam ,lParam); break; #ifdef WIN32 case WM_CTLCOLORBTN: SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); #else case WM_CTLCOLOR: { if (HIWORD(lParam) == CTLCOLOR_BTN) { SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); } break; } #endif case WM_MOUSEMOVE: { LONG x = (LONG)((short)LOWORD(lParam)); int y = (int)((short)HIWORD(lParam)); if ((y > icyButton && (x < (cxList2 + icyBorder) || x > (cxList2 + icyBorder + cxList1))) || lCaptureFlags) { SetCursor (LoadCursor (NULL, MAKEINTRESOURCE(IDC_SIZEWE))); } if (lCaptureFlags == 1) { int cxList2New; x = (x > (cxList1 + cxList2 - cxVScroll) ? (cxList1 + cxList2 - cxVScroll) : x); x = (x < cxVScroll ? cxVScroll : x); cxList2New = (int) (cxList2 + x - xCapture); SetWindowPos( ghwndList2, GetNextWindow (ghwndList2, GW_HWNDPREV), 0, icyButton, cxList2New, cyWnd, SWP_SHOWWINDOW ); SetWindowPos( ghwndList3, GetNextWindow (ghwndList3, GW_HWNDPREV), cxList2New + icyBorder, icyButton + (cyWnd - icyBorder) / 2 + icyBorder, (int) (cxList1 - (x - xCapture)), (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); SetWindowPos( ghwndList1, GetNextWindow (ghwndList1, GW_HWNDPREV), cxList2New + icyBorder, icyButton, (int) (cxList1 - (x - xCapture)), (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); } else if (lCaptureFlags == 2) { int cxList1New; x = (x < (cxList2 + cxVScroll) ? (cxList2 + cxVScroll) : x); x = (x > (cxWnd - cxVScroll) ? (cxWnd - cxVScroll) : x); cxList1New = (int) (cxList1 + x - xCapture); SetWindowPos( ghwndList1, GetNextWindow (ghwndList1, GW_HWNDPREV), (int) cxList2 + icyBorder, icyButton, cxList1New, (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); SetWindowPos( ghwndList3, GetNextWindow (ghwndList3, GW_HWNDPREV), (int) cxList2 + icyBorder, icyButton + (cyWnd - icyBorder) / 2 + icyBorder, cxList1New, (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); SetWindowPos( ghwndEdit, GetNextWindow (ghwndEdit, GW_HWNDPREV), (int) (cxList1New + cxList2) + 2*icyBorder, icyButton, (int)cxWnd - (cxList1New + (int)cxList2 + 2*icyBorder), cyWnd, SWP_SHOWWINDOW ); } break; } case WM_LBUTTONDOWN: { if ((int)((short)HIWORD(lParam)) > icyButton) { xCapture = (LONG)LOWORD(lParam); if (xCapture > (cxList2 + icyBorder) && xCapture < (cxList2 + icyBorder + cxList1)) { break; } SetCapture (hwnd); lCaptureFlags = ((xCapture < cxList1 + cxList2) ? 1 : 2); } break; } case WM_LBUTTONUP: { if (lCaptureFlags) { POINT p; LONG x; RECT rect = { 0, icyButton, 2000, 2000 }; GetCursorPos (&p); MapWindowPoints (HWND_DESKTOP, hwnd, &p, 1); x = (LONG) p.x; ReleaseCapture(); if (lCaptureFlags == 1) { x = (x < cxVScroll ? cxVScroll : x); x = (x > (cxList1 + cxList2 - cxVScroll) ? (cxList1 + cxList2 - cxVScroll) : x); cxList2 = cxList2 + (x - xCapture); cxList1 = cxList1 - (x - xCapture); rect.right = (int) (cxList1 + cxList2) + icyBorder; } else { x = (x < (cxList2 + cxVScroll) ? (cxList2 + cxVScroll) : x); x = (x > (cxWnd - cxVScroll) ? (cxWnd - cxVScroll) : x); cxList1 = cxList1 + (x - xCapture); rect.left = (int)cxList2 + icyBorder; } lCaptureFlags = 0; InvalidateRect (hwnd, &rect, TRUE); } break; } case WM_SIZE: { if (wParam != SIZE_MINIMIZED) { LONG width = (LONG)LOWORD(lParam); // // Adjust globals based on new size // cxWnd = (cxWnd ? cxWnd : 1); // avoid div by 0 cxList1 = (cxList1 * width) / cxWnd; cxList2 = (cxList2 * width) / cxWnd; cxWnd = width; cyWnd = ((int)HIWORD(lParam)) - icyButton; // // Now reposition the child windows // SetWindowPos( ghwndList2, GetNextWindow (ghwndList2, GW_HWNDPREV), 0, icyButton, (int) cxList2, cyWnd, SWP_SHOWWINDOW ); SetWindowPos( ghwndList1, GetNextWindow (ghwndList1, GW_HWNDPREV), (int) cxList2 + icyBorder, icyButton, (int) cxList1, (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); SetWindowPos( ghwndList3, GetNextWindow (ghwndList3, GW_HWNDPREV), (int) cxList2 + icyBorder, icyButton + (cyWnd - icyBorder) / 2 + icyBorder, (int) cxList1, (cyWnd - icyBorder) / 2, SWP_SHOWWINDOW ); SetWindowPos( ghwndEdit, GetNextWindow (ghwndEdit, GW_HWNDPREV), (int) (cxList1 + cxList2) + 2*icyBorder, icyButton, (int)width - ((int)(cxList1 + cxList2) + 2*icyBorder), cyWnd, SWP_SHOWWINDOW ); InvalidateRect (hwnd, NULL, TRUE); } break; } case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); if (IsIconic (hwnd)) { DrawIcon (ps.hdc, 0, 0, hIcon); } else { FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH)); #ifdef WIN32 MoveToEx (ps.hdc, 0, 0, NULL); #else MoveTo (ps.hdc, 0, 0); #endif LineTo (ps.hdc, 5000, 0); #ifdef WIN32 MoveToEx (ps.hdc, 0, icyButton - 4, NULL); #else MoveTo (ps.hdc, 0, icyButton - 4); #endif LineTo (ps.hdc, 5000, icyButton - 4); } EndPaint (hwnd, &ps); break; } case WM_TIMER: // // Enter alterable wait state to cause any queued APCs to fire // (might be able to use SleepEx() instead) // WaitForSingleObjectEx (hTimerEvent, 0, TRUE); break; case WM_CLOSE: { BOOL bAutoShutdown = FALSE; RECT rect; // // // KillTimer (hwnd, TIMER_ID); CloseHandle (hTimerEvent); // // Give user chance to cancel and auto-shutdown any init instances // if (giCurrNumStartups > 0) { int iResult; if ((iResult = MessageBox( hwnd, "Cleanup existing Startup instances? (recommended)", "SockEye closing", MB_YESNOCANCEL )) == IDYES) { bShowParams = FALSE; while (giCurrNumStartups > 0) { FuncDriver (ws_WSACleanup); } } else if (iResult == IDCANCEL) { break; } } // // Save defaults in ini file // { char buf[32]; typedef struct _DEF_VALUE2 { char far *lpszEntry; ULONG_PTR dwValue; } DEF_VALUE2; DEF_VALUE2 aDefVals[] = { { "BufSize", dwBigBufSize }, { "UserButton1", aUserButtonFuncs[0] }, { "UserButton2", aUserButtonFuncs[1] }, { "UserButton3", aUserButtonFuncs[2] }, { "UserButton4", aUserButtonFuncs[3] }, { "UserButton5", aUserButtonFuncs[4] }, { "UserButton6", aUserButtonFuncs[5] }, { "Initialized", 1 }, { gszAddressFamily, gdwDefAddrFamily }, { gszSocketType, gdwDefSocketType }, { gszProtocol, gdwDefProtocol }, { gszProtocolNumber, gdwDefProtoNum }, { gszPortNumber, gdwDefPortNum }, { gszIoctlCommand, gdwDefIoctlCmd }, { gszSendFlags, gdwDefSendFlags }, { gszRecvFlags, gdwDefRecvFlags }, { gszWSASocketFlags, gdwDefWSASocketFlags }, { NULL, 0 }, { gszHostName, (ULONG_PTR) gszDefHostName }, { gszProtocolName, (ULONG_PTR) gszDefProtoName }, { gszServiceName, (ULONG_PTR) gszDefServName }, { "UserButton1Text", (ULONG_PTR) &aUserButtonsText[0] }, { "UserButton2Text", (ULONG_PTR) &aUserButtonsText[1] }, { "UserButton3Text", (ULONG_PTR) &aUserButtonsText[2] }, { "UserButton4Text", (ULONG_PTR) &aUserButtonsText[3] }, { "UserButton5Text", (ULONG_PTR) &aUserButtonsText[4] }, { "UserButton6Text", (ULONG_PTR) &aUserButtonsText[5] }, { NULL, 0 } }; int i; for (i = 0; aDefVals[i].lpszEntry; i++) { sprintf (buf, "%lx", aDefVals[i].dwValue); WriteProfileString( gszSockEye, aDefVals[i].lpszEntry, buf ); } i++; for (; aDefVals[i].lpszEntry; i++) { WriteProfileString( gszSockEye, aDefVals[i].lpszEntry, (LPCSTR) aDefVals[i].dwValue ); } // // Save the window dimensions (if iconic then don't bother) // if (!IsIconic (hwnd)) { if (IsZoomed (hwnd)) { strcpy (buf, "max"); } else { GetWindowRect (hwnd, &rect); sprintf( buf, "%d,%d,%d,%d", rect.left, rect.top, rect.right, rect.bottom ); } WriteProfileString( gszSockEye, "Position", (LPCSTR) buf ); sprintf (buf, "%ld,%ld,%ld", cxList2, cxList1, cxWnd); WriteProfileString( gszSockEye, "ControlRatios", (LPCSTR) buf ); } } if (hLogFile) { fclose (hLogFile); } DestroyIcon (hIcon); MyFree (pBigBuf); DeleteObject (hFont); DeleteObject (hFont2); PostQuitMessage (0); break; } } //switch return FALSE; } INT_PTR CALLBACK AboutDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch (msg) { case WM_INITDIALOG: if (lParam) { SetDlgItemText (hwnd, IDC_EDIT1, (LPCSTR) lParam); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog (hwnd, 0); break; } break; #ifdef WIN32 case WM_CTLCOLORSTATIC: SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); #else case WM_CTLCOLOR: { if (HIWORD(lParam) == CTLCOLOR_STATIC) { SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); } break; } #endif case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH)); EndPaint (hwnd, &ps); break; } } return FALSE; } void FAR ShowStr( LPCSTR format, ... ) { char buf[256]; va_list ap; va_start(ap, format); vsprintf (buf, format, ap); if (hLogFile) { fprintf (hLogFile, "%s\n", buf); } strcat (buf, "\r\n"); // // Insert text at end // #ifdef WIN32 SendMessage (ghwndEdit, EM_SETSEL, (WPARAM)0xfffffffd, (LPARAM)0xfffffffe); #else SendMessage( ghwndEdit, EM_SETSEL, (WPARAM)0, (LPARAM) MAKELONG(0xfffd,0xfffe) ); #endif SendMessage (ghwndEdit, EM_REPLACESEL, 0, (LPARAM) buf); #ifdef WIN32 // // Scroll to end of text // SendMessage (ghwndEdit, EM_SCROLLCARET, 0, 0); #endif va_end(ap); } INT_PTR CALLBACK ParamsDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { DWORD i; typedef struct _DLG_INST_DATA { PFUNC_PARAM_HEADER pParamsHeader; LRESULT lLastSel; char szComboText[MAX_STRING_PARAM_SIZE]; } DLG_INST_DATA, *PDLG_INST_DATA; PDLG_INST_DATA pDlgInstData = (PDLG_INST_DATA) GetWindowLongPtr (hwnd, DWLP_USER); static int icxList2, icyList2, icyEdit1; switch (msg) { case WM_INITDIALOG: { // // Alloc a dlg instance data struct, init it, & save a ptr to it // pDlgInstData = (PDLG_INST_DATA) MyAlloc (sizeof(DLG_INST_DATA)); if (pDlgInstData == NULL) { EndDialog(hwnd, 0); return (FALSE); } pDlgInstData->pParamsHeader = (PFUNC_PARAM_HEADER) lParam; pDlgInstData->lLastSel = -1; SetWindowLongPtr (hwnd, DWLP_USER, (LPARAM) pDlgInstData); // // Stick all the param names in the listbox, & for each PT_DWORD // param save it's default value // for (i = 0; i < pDlgInstData->pParamsHeader->dwNumParams; i++) { SendDlgItemMessage( hwnd, IDC_LIST1, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) pDlgInstData->pParamsHeader->aParams[i].szName ); if (pDlgInstData->pParamsHeader->aParams[i].dwType == PT_DWORD) { pDlgInstData->pParamsHeader->aParams[i].u.dwDefValue = (ULONG_PTR) pDlgInstData->pParamsHeader->aParams[i].dwValue; } } // // Set the dlg title as appropriate // // help if (pDlgInstData->pParamsHeader->FuncIndex == DefValues) // help { // help EnableWindow (GetDlgItem (hwnd, IDC_TB_HELP), FALSE); // help } SetWindowText( hwnd, aFuncNames[pDlgInstData->pParamsHeader->FuncIndex] ); // // Limit the max text length for the combobox's edit field // (NOTE: A combobox ctrl actually has two child windows: a // edit ctrl & a listbox. We need to get the hwnd of the // child edit ctrl & send it the LIMITTEXT msg.) // { HWND hwndChild = GetWindow (GetDlgItem (hwnd, IDC_COMBO1), GW_CHILD); while (hwndChild) { char buf[8]; GetClassName (hwndChild, buf, 7); if (_stricmp (buf, "edit") == 0) { break; } hwndChild = GetWindow (hwndChild, GW_HWNDNEXT); } SendMessage( hwndChild, EM_LIMITTEXT, (WPARAM) (gbWideStringParams ? (MAX_STRING_PARAM_SIZE/2 - 1) : MAX_STRING_PARAM_SIZE - 1), 0 ); } { RECT rect; GetWindowRect (GetDlgItem (hwnd, IDC_LIST2), &rect); SetWindowPos( GetDlgItem (hwnd, IDC_LIST2), NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER ); icxList2 = rect.right - rect.left; icyList2 = rect.bottom - rect.top; GetWindowRect (GetDlgItem (hwnd, 58), &rect); icyEdit1 = icyList2 - (rect.bottom - rect.top); } SendDlgItemMessage( hwnd, IDC_EDIT1, WM_SETFONT, (WPARAM) ghFixedFont, 0 ); break; } case WM_COMMAND: { LRESULT lLastSel = pDlgInstData->lLastSel; char far *lpszComboText = pDlgInstData->szComboText; PFUNC_PARAM_HEADER pParamsHeader = pDlgInstData->pParamsHeader; switch (LOWORD(wParam)) { case IDC_EDIT1: { if (HIWORD(wParam) == EN_CHANGE) { // // Don't allow the user to enter characters other than // 0-9, a-f, or A-F in the edit control (do this by // hiliting other letters and cutting them). // HWND hwndEdit = GetDlgItem (hwnd, IDC_EDIT1); DWORD dwLength, j; BYTE *p; dwLength = (DWORD) GetWindowTextLength (hwndEdit); if (dwLength && (p = MyAlloc (dwLength + 1))) { GetWindowText (hwndEdit, p, dwLength + 1); for (i = j = 0; i < dwLength ; i++, j++) { if (aHex[p[i]] == 255) { SendMessage( hwndEdit, EM_SETSEL, (WPARAM) j, (LPARAM) j + 1 // 0xfffffffe ); SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) ""); SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0); j--; } } MyFree (p); } } break; } case IDOK: // if gbWideStringParams convert ascii -> unicode if (lLastSel != -1) { // // Save val of currently selected param // char buf[MAX_STRING_PARAM_SIZE]; i = GetDlgItemText (hwnd, IDC_COMBO1, buf, MAX_STRING_PARAM_SIZE-1); switch (pParamsHeader->aParams[lLastSel].dwType) { case PT_STRING: { LRESULT lComboSel; lComboSel = SendDlgItemMessage( hwnd, IDC_COMBO1, CB_GETCURSEL, 0, 0 ); if (lComboSel == 0) // "NULL pointer" { pParamsHeader->aParams[lLastSel].dwValue = 0; } else if (lComboSel == 2) // "Invalid string pointer" { pParamsHeader->aParams[lLastSel].dwValue = (ULONG_PTR) -1; } else // "Valid string pointer" { strncpy( pParamsHeader->aParams[lLastSel].u.buf, buf, MAX_STRING_PARAM_SIZE - 1 ); pParamsHeader->aParams[lLastSel].u.buf[MAX_STRING_PARAM_SIZE-1] = 0; pParamsHeader->aParams[lLastSel].dwValue = (ULONG_PTR) pParamsHeader->aParams[lLastSel].u.buf; } break; } case PT_POINTER: { // // If there is any text in the "Buffer byte editor" // window then retrieve it, convert it to hexadecimal, // and copy it to the buffer // DWORD dwLength; BYTE *p, *p2, *pBuf = pParamsHeader->aParams[lLastSel].u.ptr; HWND hwndEdit = GetDlgItem (hwnd,IDC_EDIT1); dwLength = (DWORD) GetWindowTextLength (hwndEdit); if (dwLength && (p = MyAlloc (dwLength + 1))) { GetWindowText (hwndEdit, p, dwLength + 1); SetWindowText (hwndEdit, ""); p2 = p; p[dwLength] = (BYTE) '0'; dwLength = (dwLength + 1) & 0xfffffffe; for (i = 0; i < dwLength; i++, i++) { BYTE b; b = aHex[*p] << 4; p++; b |= aHex[*p]; p++; *pBuf = b; pBuf++; } MyFree (p2); } // fall thru to code below } case PT_DWORD: case PT_FLAGS: case PT_ORDINAL: case PT_WSAPROTOCOLINFO: case PT_QOS: case PT_PTRNOEDIT: { if (!sscanf( buf, "%08lx", &pParamsHeader->aParams[lLastSel].dwValue )) { // // Default to 0 // pParamsHeader->aParams[lLastSel].dwValue = 0; } break; } } // switch } // // Convert any unicode string params as appropriate // if (gbWideStringParams) { DWORD dwNumParams = pParamsHeader->dwNumParams, i; PFUNC_PARAM pParam = pParamsHeader->aParams; for (i = 0; i < dwNumParams; i++) { if (pParam->dwType == PT_STRING && pParam->dwValue != 0 && pParam->dwValue != 0xffffffff) { int len = lstrlenA ((char *) pParam->dwValue) + 1; WCHAR buf[MAX_STRING_PARAM_SIZE/2]; MultiByteToWideChar( GetACP(), MB_PRECOMPOSED, (LPCSTR) pParam->dwValue, (len > MAX_STRING_PARAM_SIZE/2 ? MAX_STRING_PARAM_SIZE/2 - 1 : -1), buf, MAX_STRING_PARAM_SIZE/2 ); buf[MAX_STRING_PARAM_SIZE/2 - 1] = 0; lstrcpyW ((WCHAR *) pParam->dwValue, buf); } pParam++; } } MyFree (pDlgInstData); EndDialog (hwnd, TRUE); break; case IDCANCEL: MyFree (pDlgInstData); EndDialog (hwnd, FALSE); break; case IDC_LIST1: #ifdef WIN32 if (HIWORD(wParam) == LBN_SELCHANGE) #else if (HIWORD(lParam) == LBN_SELCHANGE) #endif { char buf[MAX_STRING_PARAM_SIZE] = ""; LPCSTR lpstr = buf; LRESULT lSel = SendDlgItemMessage (hwnd, IDC_LIST1, LB_GETCURSEL, 0, 0); if (lLastSel != -1) { // // Save the old param value // i = GetDlgItemText( hwnd, IDC_COMBO1, buf, MAX_STRING_PARAM_SIZE - 1 ); switch (pParamsHeader->aParams[lLastSel].dwType) { case PT_STRING: { LRESULT lComboSel; lComboSel = SendDlgItemMessage( hwnd, IDC_COMBO1, CB_GETCURSEL, 0, 0 ); if (lComboSel == 0) // "NULL pointer" { pParamsHeader->aParams[lLastSel].dwValue = (DWORD)0; } else if (lComboSel == 2) // "Invalid string pointer" { pParamsHeader->aParams[lLastSel].dwValue = (DWORD) 0xffffffff; } else // "Valid string pointer" or no sel { strncpy( pParamsHeader->aParams[lLastSel].u.buf, buf, MAX_STRING_PARAM_SIZE - 1 ); pParamsHeader->aParams[lLastSel].u.buf[MAX_STRING_PARAM_SIZE - 1] = 0; pParamsHeader->aParams[lLastSel].dwValue = (ULONG_PTR) pParamsHeader->aParams[lLastSel].u.buf; } break; } case PT_POINTER: { // // If there is any text in the "Buffer byte editor" // window then retrieve it, convert it to hexadecimal, // and copy it to the buffer // DWORD dwLength; BYTE *p, *p2, *pBuf = pParamsHeader->aParams[lLastSel].u.ptr; HWND hwndEdit = GetDlgItem (hwnd,IDC_EDIT1); dwLength = (DWORD) GetWindowTextLength (hwndEdit); if (dwLength && (p = MyAlloc (dwLength + 1))) { GetWindowText (hwndEdit, p, dwLength + 1); SetWindowText (hwndEdit, ""); p2 = p; p[dwLength] = (BYTE) '0'; dwLength = (dwLength + 1) & 0xfffffffe; for (i = 0; i < dwLength; i+= 2) { BYTE b; b = aHex[*p] << 4; p++; b |= aHex[*p]; p++; *pBuf = b; pBuf++; } MyFree (p2); } // fall thru to code below } case PT_DWORD: case PT_FLAGS: case PT_ORDINAL: case PT_WSAPROTOCOLINFO: case PT_QOS: case PT_PTRNOEDIT: { if (!sscanf( buf, "%08lx", &pParamsHeader->aParams[lLastSel].dwValue )) { // // Default to 0 // pParamsHeader->aParams[lLastSel].dwValue = 0; } break; } } // switch } SendDlgItemMessage (hwnd, IDC_LIST2, LB_RESETCONTENT, 0, 0); SendDlgItemMessage (hwnd, IDC_COMBO1, CB_RESETCONTENT, 0, 0); { int icxL2, icyL2, icxE1, icyE1; char FAR *pszS1, *pszS2; static char szBitFlags[] = "Bit flags:"; static char szOrdinalValues[] = "Ordinal values:"; static char szBufByteEdit[] = "Buffer byte editor (use 0-9, a-f, A-F)"; switch (pParamsHeader->aParams[lSel].dwType) { case PT_DWORD: case PT_STRING: case PT_WSAPROTOCOLINFO: case PT_QOS: case PT_PTRNOEDIT: icxL2 = icyL2 = icxE1 = icxE1 = 0; pszS1 = pszS2 = NULL; break; case PT_FLAGS: icxL2 = icxList2; icyL2 = icyList2; icxE1 = icyE1 = 0; pszS1 = szBitFlags; pszS2 = NULL; break; case PT_POINTER: icxL2 = icyL2 = 0; icxE1 = icxList2; icyE1 = icyEdit1;; pszS1 = szBufByteEdit; pszS2 = gszEnterAs; break; case PT_ORDINAL: icxL2 = icxList2; icyL2 = icyList2; icxE1 = icyE1 = 0; pszS1 = szOrdinalValues; pszS2 = NULL; break; } SetWindowPos( GetDlgItem (hwnd, IDC_LIST2), NULL, 0, 0, icxL2, icyL2, SWP_NOMOVE | SWP_NOZORDER ); SetWindowPos( GetDlgItem (hwnd, IDC_EDIT1), NULL, 0, 0, icxE1, icyE1, SWP_NOMOVE | SWP_NOZORDER ); SetDlgItemText (hwnd, 57, pszS1); SetDlgItemText (hwnd, 58, pszS2); } switch (pParamsHeader->aParams[lSel].dwType) { case PT_STRING: { char * aszOptions[] = { "NULL pointer", "Valid string pointer", "Invalid string pointer" }; for (i = 0; i < 3; i++) { SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) aszOptions[i] ); } if (pParamsHeader->aParams[lSel].dwValue == 0) { i = 0; buf[0] = 0; } else if (pParamsHeader->aParams[lSel].dwValue != 0xffffffff) { i = 1; lpstr = (LPCSTR) pParamsHeader->aParams[lSel].dwValue; } else { i = 2; buf[0] = 0; } SendDlgItemMessage( hwnd, IDC_COMBO1, CB_SETCURSEL, (WPARAM) i, 0 ); break; } case PT_POINTER: case PT_WSAPROTOCOLINFO: case PT_QOS: case PT_PTRNOEDIT: { SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "00000000" ); sprintf( buf, "%08lx (valid pointer)", pParamsHeader->aParams[lSel].u.dwDefValue ); SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) buf ); SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "ffffffff" ); sprintf( buf, "%08lx", pParamsHeader->aParams[lSel].dwValue ); break; } case PT_DWORD: { SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "0000000" ); if (pParamsHeader->aParams[lSel].u.dwDefValue) { // // Add the default val string to the combo // sprintf( buf, "%08lx", pParamsHeader->aParams[lSel].u.dwDefValue ); SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) buf ); } SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "ffffffff" ); sprintf( buf, "%08lx", pParamsHeader->aParams[lSel].dwValue ); break; } case PT_FLAGS: { // // Stick the bit flag strings in the list box // PLOOKUP pLookup = (PLOOKUP) pParamsHeader->aParams[lSel].u.pLookup; for (i = 0; pLookup[i].dwVal != 0xffffffff; i++) { SendDlgItemMessage( hwnd, IDC_LIST2, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) pLookup[i].lpszVal ); if (pParamsHeader->aParams[lSel].dwValue & pLookup[i].dwVal) { SendDlgItemMessage( hwnd, IDC_LIST2, LB_SETSEL, (WPARAM) TRUE, (LPARAM) MAKELPARAM((WORD)i,0) ); } } SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "select none" ); SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) "select all" ); sprintf( buf, "%08lx", pParamsHeader->aParams[lSel].dwValue ); break; } case PT_ORDINAL: { // // Stick the bit flag strings in the list box // HWND hwndList2 = GetDlgItem (hwnd, IDC_LIST2); PLOOKUP pLookup = (PLOOKUP) pParamsHeader->aParams[lSel].u.pLookup; for (i = 0; pLookup[i].dwVal != 0xffffffff; i++) { SendMessage( hwndList2, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) pLookup[i].lpszVal ); if (pParamsHeader->aParams[lSel].dwValue == pLookup[i].dwVal) { SendMessage( hwndList2, LB_SETSEL, (WPARAM) TRUE, (LPARAM) MAKELPARAM((WORD)i,0) ); } } SendDlgItemMessage( hwnd, IDC_COMBO1, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) (char far *) "select none" ); wsprintf( buf, "%08lx", pParamsHeader->aParams[lSel].dwValue ); break; } } //switch SetDlgItemText (hwnd, IDC_COMBO1, lpstr); pDlgInstData->lLastSel = lSel; } break; case IDC_LIST2: #ifdef WIN32 if (HIWORD(wParam) == LBN_SELCHANGE) #else if (HIWORD(lParam) == LBN_SELCHANGE) #endif { PLOOKUP pLookup = (PLOOKUP) pParamsHeader->aParams[lLastSel].u.pLookup; char buf[16]; DWORD dwValue = 0; int far *ai; LONG i; LRESULT lSelCount = SendDlgItemMessage (hwnd, IDC_LIST2, LB_GETSELCOUNT, 0, 0); if (lSelCount) { ai = (int far *) MyAlloc ((size_t)lSelCount * sizeof(int)); SendDlgItemMessage( hwnd, IDC_LIST2, LB_GETSELITEMS, (WPARAM) lSelCount, (LPARAM) ai ); if (pParamsHeader->aParams[lLastSel].dwType == PT_FLAGS) { for (i = 0; i < lSelCount; i++) { dwValue |= pLookup[ai[i]].dwVal; } } else // if (.dwType == PT_ORDINAL) { if (lSelCount == 1) { dwValue = pLookup[ai[0]].dwVal; } else if (lSelCount == 2) { // // Figure out which item we need to de-select, // since we're doing ords & only want 1 item // selected at a time // GetDlgItemText (hwnd, IDC_COMBO1, buf, 16); if (sscanf (buf, "%lx", &dwValue)) { if (pLookup[ai[0]].dwVal == dwValue) { SendDlgItemMessage( hwnd, IDC_LIST2, LB_SETSEL, 0, (LPARAM) ai[0] ); dwValue = pLookup[ai[1]].dwVal; } else { SendDlgItemMessage( hwnd, IDC_LIST2, LB_SETSEL, 0, (LPARAM) ai[1] ); dwValue = pLookup[ai[0]].dwVal; } } else { // de-select items??? dwValue = 0; } } } MyFree (ai); } sprintf (buf, "%08lx", dwValue); SetDlgItemText (hwnd, IDC_COMBO1, buf); } break; case IDC_COMBO1: #ifdef WIN32 switch (HIWORD(wParam)) #else switch (HIWORD(lParam)) #endif { case CBN_SELCHANGE: { LRESULT lSel = SendDlgItemMessage (hwnd, IDC_COMBO1, CB_GETCURSEL, 0, 0); switch (pParamsHeader->aParams[lLastSel].dwType) { case PT_POINTER: case PT_PTRNOEDIT: { if (lSel == 1) { // // Strip off the "(valid pointer)" in the edit ctrl // wsprintf( lpszComboText, "%08lx", pParamsHeader->aParams[lLastSel].u.ptr ); PostMessage (hwnd, WM_USER+55, 0, 0); } break; } case PT_FLAGS: { BOOL bSelect = (lSel ? TRUE : FALSE); SendDlgItemMessage( hwnd, IDC_LIST2, LB_SETSEL, (WPARAM) bSelect, (LPARAM) -1 ); if (bSelect) { PLOOKUP pLookup = (PLOOKUP) pParamsHeader->aParams[lLastSel].u.pLookup; DWORD dwValue = 0; int far *ai; LONG i; LRESULT lSelCount = SendDlgItemMessage (hwnd, IDC_LIST2, LB_GETSELCOUNT, 0, 0); if (lSelCount) { ai = (int far *) MyAlloc ((size_t)lSelCount * sizeof(int)); SendDlgItemMessage( hwnd, IDC_LIST2, LB_GETSELITEMS, (WPARAM) lSelCount, (LPARAM) ai ); for (i = 0; i < lSelCount; i++) { dwValue |= pLookup[ai[i]].dwVal; } MyFree (ai); } sprintf (lpszComboText, "%08lx", dwValue); } else { strcpy (lpszComboText, "00000000"); } PostMessage (hwnd, WM_USER+55, 0, 0); break; } case PT_STRING: if (lSel == 1) { strncpy( lpszComboText, pParamsHeader->aParams[lLastSel].u.buf, MAX_STRING_PARAM_SIZE ); lpszComboText[MAX_STRING_PARAM_SIZE-1] = 0; } else { lpszComboText[0] = 0; } PostMessage (hwnd, WM_USER+55, 0, 0); break; case PT_DWORD: break; case PT_ORDINAL: // // The only option here is "select none" // strcpy (lpszComboText, "00000000"); PostMessage (hwnd, WM_USER+55, 0, 0); break; case PT_WSAPROTOCOLINFO: { if (lSel == 1) { LPWSAPROTOCOL_INFOA pInfo = (gbWideStringParams ? (LPWSAPROTOCOL_INFOA) &gWSAProtocolInfoW : &gWSAProtocolInfoA); char szProtocol[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "dwServiceFlags1", PT_FLAGS, (ULONG_PTR) pInfo->dwServiceFlags1, aServiceFlags }, { "dwServiceFlags2", PT_DWORD, (ULONG_PTR) pInfo->dwServiceFlags2, NULL }, { "dwServiceFlags3", PT_DWORD, (ULONG_PTR) pInfo->dwServiceFlags3, NULL }, { "dwServiceFlags4", PT_DWORD, (ULONG_PTR) pInfo->dwServiceFlags4, NULL }, { "dwProviderFlags1", PT_FLAGS, (ULONG_PTR) pInfo->dwProviderFlags, aProviderFlags }, { "ProviderID.Data1", PT_DWORD, (ULONG_PTR) pInfo->ProviderId.Data1, NULL }, { "ProviderID.Data2", PT_DWORD, (ULONG_PTR) pInfo->ProviderId.Data2, NULL }, { "ProviderID.Data3", PT_DWORD, (ULONG_PTR) pInfo->ProviderId.Data3, NULL }, { "ProviderID.Data4[0-3]",PT_DWORD, *((LPDWORD) pInfo->ProviderId.Data4), NULL }, { "ProviderID.Data4[4-7]",PT_DWORD, *((LPDWORD) &pInfo->ProviderId.Data4[4]), NULL }, { "dwCatalogEntryId", PT_DWORD, (ULONG_PTR) pInfo->dwCatalogEntryId, NULL }, { "ProtoChain.Len", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainLen, NULL }, { "ProtoChain.Entry0", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[0], NULL }, { "ProtoChain.Entry1", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[1], NULL }, { "ProtoChain.Entry2", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[2], NULL }, { "ProtoChain.Entry3", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[3], NULL }, { "ProtoChain.Entry4", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[4], NULL }, { "ProtoChain.Entry5", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[5], NULL }, { "ProtoChain.Entry6", PT_DWORD, (ULONG_PTR) pInfo->ProtocolChain.ChainEntries[6], NULL }, { "iVersion", PT_DWORD, (ULONG_PTR) pInfo->iVersion, NULL }, { "iAddressFamily", PT_ORDINAL, (ULONG_PTR) pInfo->iAddressFamily, aAddressFamilies }, { "iMaxSockAddr", PT_DWORD, (ULONG_PTR) pInfo->iMaxSockAddr, NULL }, { "iMinSockAddr", PT_DWORD, (ULONG_PTR) pInfo->iMinSockAddr, NULL }, { "iSocketType", PT_FLAGS, (ULONG_PTR) pInfo->iSocketType, aSocketTypes }, { "iProtocol", PT_DWORD, (ULONG_PTR) pInfo->iProtocol, NULL }, // ought be flags? { "iProtocolMaxOffset", PT_DWORD, (ULONG_PTR) pInfo->iProtocolMaxOffset, NULL }, { "iNetworkByteOrder", PT_ORDINAL, (ULONG_PTR) pInfo->iNetworkByteOrder, aNetworkByteOrders }, { "iSecurityScheme", PT_DWORD, (ULONG_PTR) pInfo->iSecurityScheme, NULL }, { "dwMessageSize", PT_DWORD, (ULONG_PTR) pInfo->dwMessageSize, NULL }, { "dwProviderReserved", PT_DWORD, (ULONG_PTR) pInfo->dwProviderReserved, NULL }, { "szProtocol", PT_STRING, (ULONG_PTR) szProtocol, szProtocol } }; FUNC_PARAM_HEADER paramsHeader = { 31, WSAProtoInfo, params, NULL }; // // Set "ghwndModal" so this Params dlg will // be modal to the existing Params dlg // ghwndModal = hwnd; if (gbWideStringParams) { // // Convert from unicode to ascii show text not // clipped after 1st char (it's an ascii window) // WideCharToMultiByte( GetACP(), 0, (LPWSTR) pInfo->szProtocol, lstrlenW ((LPWSTR) pInfo->szProtocol) + 1, szProtocol, MAX_STRING_PARAM_SIZE, NULL, NULL ); } else { lstrcpyA (szProtocol, pInfo->szProtocol); } if (LetUserMungeParams (¶msHeader)) { // // Save the new params // pInfo->dwServiceFlags1 = (DWORD) params[0].dwValue; pInfo->dwServiceFlags2 = (DWORD) params[1].dwValue; pInfo->dwServiceFlags3 = (DWORD) params[2].dwValue; pInfo->dwServiceFlags4 = (DWORD) params[3].dwValue; pInfo->dwProviderFlags = (DWORD) params[4].dwValue; pInfo->ProviderId.Data1 = (DWORD) params[5].dwValue; pInfo->ProviderId.Data2 = (unsigned short) LOWORD(params[6].dwValue); pInfo->ProviderId.Data3 = (unsigned short) LOWORD(params[7].dwValue); *((LPDWORD) pInfo->ProviderId.Data4) = (DWORD) params[8].dwValue; *((LPDWORD) &pInfo->ProviderId.Data4[4]) = (DWORD) params[9].dwValue; pInfo->dwCatalogEntryId = (DWORD) params[10].dwValue; pInfo->ProtocolChain.ChainLen = (DWORD) params[11].dwValue; pInfo->ProtocolChain.ChainEntries[0] = (DWORD) params[12].dwValue; pInfo->ProtocolChain.ChainEntries[1] = (DWORD) params[13].dwValue; pInfo->ProtocolChain.ChainEntries[2] = (DWORD) params[14].dwValue; pInfo->ProtocolChain.ChainEntries[3] = (DWORD) params[15].dwValue; pInfo->ProtocolChain.ChainEntries[4] = (DWORD) params[16].dwValue; pInfo->ProtocolChain.ChainEntries[5] = (DWORD) params[17].dwValue; pInfo->ProtocolChain.ChainEntries[6] = (DWORD) params[18].dwValue; pInfo->iVersion = (int) params[19].dwValue; pInfo->iAddressFamily = (int) params[20].dwValue; pInfo->iMaxSockAddr = (int) params[21].dwValue; pInfo->iMinSockAddr = (int) params[22].dwValue; pInfo->iSocketType = (int) params[23].dwValue; pInfo->iProtocol = (int) params[24].dwValue; pInfo->iProtocolMaxOffset = (int) params[25].dwValue; pInfo->iNetworkByteOrder = (int) params[26].dwValue; pInfo->iSecurityScheme = (int) params[27].dwValue; pInfo->dwMessageSize = (DWORD) params[28].dwValue; pInfo->dwProviderReserved = (DWORD) params[29].dwValue; if (params[30].dwValue == (ULONG_PTR) szProtocol) { if (gbWideStringParams) { lstrcpyW( (WCHAR *) pInfo->szProtocol, (WCHAR *) szProtocol ); } else { lstrcpyA (pInfo->szProtocol, szProtocol); } } } // // Now reset ghwndModal to what it was initially // ghwndModal = ghwndMain; // // Strip off the "(valid pointer)" in the edit ctrl // wsprintf (lpszComboText, "%08lx", pInfo); PostMessage (hwnd, WM_USER+55, 0, 0); pParamsHeader->aParams[lLastSel].dwValue = (ULONG_PTR) pInfo; } break; } case PT_QOS: { if (lSel == 1) { LPQOS pQOS = (LPQOS) pParamsHeader->aParams[lLastSel].u.ptr; FUNC_PARAM params[] = { { "Send.TokenRate", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.TokenRate, NULL }, { "Send.TokenBucketSize", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.TokenBucketSize, NULL }, { "Send.PeakBandwidth", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.PeakBandwidth, NULL }, { "Send.Latency", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.Latency, NULL }, { "Send.DelayVariation", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.DelayVariation, NULL }, { "Send.ServiceType", PT_ORDINAL, (ULONG_PTR) pQOS->SendingFlowspec.ServiceType, aQOSServiceTypes }, { "Send.MaxSduSize", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.MaxSduSize, NULL }, { "Send.MinimumPolicedSize", PT_DWORD, (ULONG_PTR) pQOS->SendingFlowspec.MinimumPolicedSize, NULL }, { "Recv.TokenRate", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.TokenRate, NULL }, { "Recv.TokenBucketSize", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.TokenBucketSize, NULL }, { "Recv.PeakBandwidth", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.PeakBandwidth, NULL }, { "Recv.Latency", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.Latency, NULL }, { "Recv.DelayVariation", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.DelayVariation, NULL }, { "Recv.ServiceType", PT_ORDINAL, (ULONG_PTR) pQOS->ReceivingFlowspec.ServiceType, aQOSServiceTypes }, { "Recv.MaxSduSize", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.MaxSduSize, NULL }, { "Recv.MinimumPolicedSize", PT_DWORD, (ULONG_PTR) pQOS->ReceivingFlowspec.MinimumPolicedSize, NULL }, { "ProviderSpecific.len", PT_DWORD, (ULONG_PTR) pQOS->ProviderSpecific.len, NULL }, { "ProviderSpecific.buf", PT_POINTER, (ULONG_PTR) pQOS->ProviderSpecific.buf, pQOS+1 } }; FUNC_PARAM_HEADER paramsHeader = { 18, ws_QOS, params, NULL }; // // Set "ghwndModal" so this Params dlg will // be modal to the existing Params dlg // ghwndModal = hwnd; if (LetUserMungeParams (¶msHeader)) { // // Save the params // for (i = 0; i < 17; i++) { *(((LPDWORD) pQOS) + i) = (DWORD) params[i].dwValue; } } // // Now reset ghwndModal to what it was initially // ghwndModal = ghwndMain; // // Strip off the "(valid pointer)" in the edit ctrl // wsprintf (lpszComboText, "%08lx", pQOS); PostMessage (hwnd, WM_USER+55, 0, 0); pParamsHeader->aParams[lLastSel].dwValue = (ULONG_PTR) pQOS; } break; } } // switch break; } case CBN_EDITCHANGE: { // // If user entered text in the edit field then copy the // text to our buffer // if (pParamsHeader->aParams[lLastSel].dwType == PT_STRING) { char buf[MAX_STRING_PARAM_SIZE]; GetDlgItemText( hwnd, IDC_COMBO1, buf, MAX_STRING_PARAM_SIZE ); strncpy( pParamsHeader->aParams[lLastSel].u.buf, buf, MAX_STRING_PARAM_SIZE ); pParamsHeader->aParams[lLastSel].u.buf [MAX_STRING_PARAM_SIZE-1] = 0; } break; } } // switch } // switch break; } case WM_USER+55: SetDlgItemText (hwnd, IDC_COMBO1, pDlgInstData->szComboText); break; #ifdef WIN32 case WM_CTLCOLORSTATIC: SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); #else case WM_CTLCOLOR: { if (HIWORD(lParam) == CTLCOLOR_STATIC) { SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); } break; } #endif case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH)); EndPaint (hwnd, &ps); break; } } // switch return FALSE; } INT_PTR CALLBACK UserButtonsDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { static int iButtonIndex; switch (msg) { case WM_INITDIALOG: { int i; char buf[32]; if (lParam) { // // The dlg was invoked because someone pressed a user button // that was uninitialized, so only allow chgs on this button // iButtonIndex = *((int *) lParam); _itoa (iButtonIndex + 1, buf, 10); SendDlgItemMessage( hwnd, IDC_LIST1, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) buf ); } else { // // The dlg was invoked because the user chose a menuitem, // so allow chgs on all buttons // iButtonIndex = MAX_USER_BUTTONS; for (i = 1; i <= MAX_USER_BUTTONS; i++) { _itoa (i, buf, 10); SendDlgItemMessage( hwnd, IDC_LIST1, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) buf ); } } SendDlgItemMessage( hwnd, IDC_LIST1, LB_SETCURSEL, (WPARAM) 0, 0 ); for (i = 0; aFuncNames[i]; i++) { SendDlgItemMessage( hwnd, IDC_LIST2, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) aFuncNames[i] ); } SendDlgItemMessage( hwnd, IDC_LIST2, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) "" ); if (!lParam) { #ifdef WIN32 wParam = (WPARAM) MAKELONG (0, LBN_SELCHANGE); #else lParam = (LPARAM) MAKELONG (0, LBN_SELCHANGE); #endif goto IDC_LIST1_selchange; } break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { LRESULT lFuncSel; lFuncSel = SendDlgItemMessage(hwnd, IDC_LIST2, LB_GETCURSEL, 0, 0); if (lFuncSel == LB_ERR) { MessageBox (hwnd, "Select a function", "", MB_OK); break; } if (iButtonIndex == MAX_USER_BUTTONS) { iButtonIndex = (int) SendDlgItemMessage( hwnd, IDC_LIST1, LB_GETCURSEL, 0, 0 ); } aUserButtonFuncs[iButtonIndex] = (DWORD) lFuncSel; if (lFuncSel == MiscBegin) { // // User selected "" option so nullify string // aUserButtonsText[iButtonIndex][0] = 0; } else { GetDlgItemText( hwnd, IDC_EDIT1, (LPSTR) &aUserButtonsText[iButtonIndex], MAX_USER_BUTTON_TEXT_SIZE - 1 ); aUserButtonsText[iButtonIndex][MAX_USER_BUTTON_TEXT_SIZE - 1] = 0; } SetDlgItemText( ghwndMain, IDC_BUTTON7 + iButtonIndex, (LPSTR) &aUserButtonsText[iButtonIndex] ); // Fall thru to IDCANCEL code } case IDCANCEL: EndDialog (hwnd, FALSE); break; case IDC_LIST1: IDC_LIST1_selchange: #ifdef WIN32 if (HIWORD(wParam) == LBN_SELCHANGE) #else if (HIWORD(lParam) == LBN_SELCHANGE) #endif { LRESULT lButtonSel = SendDlgItemMessage(hwnd, IDC_LIST1, LB_GETCURSEL, 0, 0); SendDlgItemMessage( hwnd, IDC_LIST2, LB_SETCURSEL, (WPARAM) aUserButtonFuncs[lButtonSel], 0 ); SetDlgItemText( hwnd, IDC_EDIT1, aUserButtonsText[lButtonSel] ); } break; } // switch break; #ifdef WIN32 case WM_CTLCOLORSTATIC: SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); #else case WM_CTLCOLOR: { if (HIWORD(lParam) == CTLCOLOR_STATIC) { SetBkColor ((HDC) wParam, RGB (192,192,192)); return (INT_PTR) GetStockObject (LTGRAY_BRUSH); } break; } #endif case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH)); EndPaint (hwnd, &ps); break; } } // switch return FALSE; } int CALLBACK ConditionProc( LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS lpSQOS, LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData, GROUP FAR *g, DWORD dwCallbackData ) { ShowStr ("ConditionProc: enter"); return 0; } void CALLBACK CompletionProc( DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED pOverlapped, DWORD dwFlags ) { ShowStr ("CompletionProc: enter"); ShowStr (" dwError=%ld", dwError); ShowStr (" cbTransferred=%ld", cbTransferred); ShowStr (" pOverlapped=x%x", pOverlapped); ShowStr (" dwFlags=%d (x%x)", dwFlags, dwFlags); MyFree (pOverlapped); } DWORD PASCAL ShowError( FUNC_INDEX funcIndex, int iResult ) { DWORD i, dwError = (iResult == 0 ? (DWORD) WSAGetLastError() : iResult); for( i = 0; (dwError != aWSAErrors[i].dwVal && aWSAErrors[i].lpszVal); i++ ); ShowStr( "%s error: %s (%d)", aFuncNames[funcIndex], (aWSAErrors[i].lpszVal ? aWSAErrors[i].lpszVal : gszUnknownError), dwError ); return dwError; } void PASCAL ShowUnknownError( FUNC_INDEX funcIndex, int iResult ) { ShowStr( "%s returned unrecognized error (%d)", aFuncNames[funcIndex], iResult ); } void FAR PASCAL FuncDriver( FUNC_INDEX funcIndex ) { int i, j, k; // // Determine if we're doing a ascii or a unicode op // gbWideStringParams = ((aFuncNames[funcIndex])[strlen (aFuncNames[funcIndex]) - 1] == 'W' ? TRUE : FALSE); // // Zero the global buf so the user doesn't see extraneous stuff // ZeroMemory (pBigBuf, dwBigBufSize); // // The big switch statement... // switch (funcIndex) { case ws_accept: { int iLength; struct sockaddr sa; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpAddress", PT_PTRNOEDIT, (ULONG_PTR) &sa, &sa }, { "lpiAddrLength", PT_PTRNOEDIT, (ULONG_PTR) &iLength, &iLength }, }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { SOCKET s; if ((s = accept( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (int FAR *) params[2].dwValue )) != INVALID_SOCKET) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" returned socket=x%x", s); if (params[1].dwValue) { ShowStr (" lpAddress=x%x", params[1].dwValue); ShowStr( " ->sa_family=%d, %s", sa.sa_family, GetStringFromOrdinalValue( (DWORD) sa.sa_family, aAddressFamilies ) ); ShowStr (" ->sa_data="); ShowBytes (14, sa.sa_data, 1); } } else { ShowError (funcIndex, 0); } } break; } case ws_bind: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpName", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) (pBigBuf + 2), pBigBuf + 2 }, { "namelen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { *((u_short *) pBigBuf) = LOWORD(params[2].dwValue); if ((i = bind( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (int) params[4].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_closesocket: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = closesocket ((SOCKET) params[0].dwValue)) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); if ((SOCKET) params[0].dwValue != gpSelectedSocket->Sock) { // // The user overrode the selected widget, so make sure // we don't delete the wrong string from the list box // int iNumItems; PMYSOCKET ps; iNumItems = (int) SendMessage( ghwndList1, LB_GETCOUNT, 0, 0 ); for (i = 0; i < iNumItems; i++) { ps = (PMYSOCKET) SendMessage( ghwndList1, LB_GETITEMDATA, i, 0 ); if ((SOCKET) params[0].dwValue == ps->Sock) { glCurrentSelection = (LONG) i; gpSelectedSocket = ps; break; } } if (i == iNumItems) { ShowStr( "Strange, couldn't find socket=x%x in list", params[0].dwValue ); break; } } SendMessage( ghwndList1, LB_DELETESTRING, glCurrentSelection, 0 ); MyFree (gpSelectedSocket); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_connect: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpName", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) (pBigBuf + 2), pBigBuf + 2 }, { "namelen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { *((u_short *) pBigBuf) = LOWORD(params[2].dwValue); if ((i = connect( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (int) params[4].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_gethostbyaddr: { char szAddress[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "addr", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "type", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; lstrcpy (szAddress, "xxx"); if (LetUserMungeParams (¶msHeader)) { struct hostent *phe; // note: WinSock owns the returned ptr, don't free/munge it if ((phe = gethostbyaddr( (char FAR *) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue ))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowHostEnt (phe); } else { ShowError (funcIndex, 0); } } break; } case ws_gethostbyname: { char szHostName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "name", PT_STRING, (ULONG_PTR) szHostName, szHostName } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; lstrcpyA (szHostName, gszDefHostName); if (LetUserMungeParams (¶msHeader)) { struct hostent *phe; // note: WinSock owns the returned ptr, don't free/munge it if ((phe = gethostbyname ((char FAR *) params[0].dwValue))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowHostEnt (phe); } else { ShowError (funcIndex, 0); } } break; } case ws_gethostname: { char szName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "name", PT_POINTER, (ULONG_PTR) szName, szName }, { "namelen",PT_DWORD, (ULONG_PTR) MAX_STRING_PARAM_SIZE, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = gethostname( (char FAR *) params[0].dwValue, (int) params[1].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" name=%s", (char FAR *) params[0].dwValue); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_getpeername: case ws_getsockname: { int iNameLen = dwBigBufSize; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpName", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpiNameLength", PT_PTRNOEDIT, (ULONG_PTR) &iNameLen, &iNameLen }, }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_getpeername) { i = getpeername( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (int *) params[2].dwValue ); } else { i = getsockname( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (int *) params[2].dwValue ); } if (i == 0) { DWORD dwAddressFamily = (DWORD) *((u_short *) params[1].dwValue); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" *lpNameLength=x%x", *((int *) params[2].dwValue)); ShowStr (" lpName=x%x", params[1].dwValue); ShowStr( " ->AddressFamiliy=%d, %s", dwAddressFamily, GetStringFromOrdinalValue( dwAddressFamily, aAddressFamilies ) ); ShowStr (" ->Data="); ShowBytes( *((int *) params[2].dwValue) - sizeof (u_short), (LPBYTE) params[1].dwValue + 2, 1 ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_getprotobyname: { char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "name", PT_STRING, (ULONG_PTR) szProtoName, szProtoName }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { struct protoent *ppe; // note: WinSock owns the returned ptr, don't free/munge it if ((ppe = getprotobyname ((char FAR *) params[0].dwValue))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowProtoEnt (ppe); } else { ShowError (funcIndex, 0); } } break; } case ws_getprotobynumber: { FUNC_PARAM params[] = { { "number", PT_DWORD, (ULONG_PTR) gdwDefPortNum, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { struct protoent *ppe; // note: WinSock owns the returned ptr, don't free/munge it if ((ppe = getprotobynumber ((int) params[0].dwValue))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowProtoEnt (ppe); } else { ShowError (funcIndex, 0); } } break; } case ws_getservbyname: { char szServName[MAX_STRING_PARAM_SIZE]; char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "serviceName", PT_STRING, (ULONG_PTR) szServName, szServName }, { "protoName", PT_STRING, (ULONG_PTR) 0, szProtoName }, }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; lstrcpyA (szServName, gszDefServName); lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { struct servent *pse; // note: WinSock owns the returned ptr, don't free/munge it if ((pse = getservbyname( (char FAR *) params[0].dwValue, (char FAR *) params[1].dwValue ))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowServEnt (pse); } else { ShowError (funcIndex, 0); } } break; } case ws_getservbyport: { char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "port", PT_DWORD, (ULONG_PTR) gdwDefPortNum, NULL }, { "protoName", PT_STRING, (ULONG_PTR) 0, szProtoName }, }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { struct servent *pse; // note: WinSock owns the returned ptr, don't free/munge it if ((pse = getservbyport( (int) params[0].dwValue, (char FAR *) params[1].dwValue ))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowServEnt (pse); } else { ShowError (funcIndex, 0); } } break; } case ws_getsockopt: { int iOptionBufLength = dwBigBufSize; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "iLevel", PT_ORDINAL, (ULONG_PTR) 0, aSockOptLevels }, { "iOptionName", PT_ORDINAL, (ULONG_PTR) 0, aSockOpts }, { "lpOptionBuf", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpiOptionBufLength", PT_POINTER, (ULONG_PTR) &iOptionBufLength, &iOptionBufLength }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = getsockopt( (SOCKET) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue, (char FAR *) params[3].dwValue, (int FAR *) params[4].dwValue )) == 0) { // getockopt: format returned OptionBuf data ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " Level/OptionName=%d/%d, %s/%s", params[1].dwValue, params[2].dwValue, GetStringFromOrdinalValue( (DWORD) params[1].dwValue, aSockOptLevels ), GetStringFromOrdinalValue( (DWORD) params[2].dwValue, aSockOpts ) ); ShowStr( " *lpiOptionBufLength=x%x", *((int *) params[4].dwValue) ); ShowStr (" *lpOptionBuf="); ShowBytes( (DWORD) *((int *) params[4].dwValue), (LPVOID) params[3].dwValue, 1 ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_htonl: { FUNC_PARAM params[] = { { "hostLong", PT_DWORD, (ULONG_PTR) 0x12345678, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" hostLong=x%x", params[0].dwValue); ShowStr (" networkLong=x%x", htonl ((u_long) params[0].dwValue)); } break; } case ws_htons: { FUNC_PARAM params[] = { { "hostShort", PT_DWORD, (ULONG_PTR) 0x1234, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" hostShort=x%x", (DWORD) LOWORD(params[0].dwValue)); ShowStr( " networkShort=x%x", (DWORD) htons ((u_short) LOWORD(params[0].dwValue)) ); } break; } case ws_inet_addr: { char szInetAddr[MAX_STRING_PARAM_SIZE] = "1.2.3.4"; FUNC_PARAM params[] = { { "szInternetAddress", PT_STRING, (ULONG_PTR) szInetAddr, szInetAddr }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { unsigned long l = inet_addr ((char FAR *) params[0].dwValue); if (l != INADDR_NONE) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" ulInternetAddress=x%x", l); } else { ShowStr ("inet_addr error: INADDR_NONE"); } } break; } case ws_inet_ntoa: { FUNC_PARAM params[] = { { "ulInternetAddress", PT_DWORD, (ULONG_PTR) 0x04030201, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { char FAR *pszInetAddr; struct in_addr ia; CopyMemory (&ia, ¶ms[0].dwValue, sizeof (DWORD)); if ((pszInetAddr = inet_ntoa (ia))) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" pszInternetAddress=x%x", pszInetAddr); ShowStr (" szInternetAddress=%s", pszInetAddr); } else { ShowStr ("inet_ntoa error: returned NULL"); } } break; } case ws_ioctlsocket: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lCommand", PT_ORDINAL, (ULONG_PTR) 0, aIoctlCmds }, { "lpData", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = ioctlsocket( (SOCKET) params[0].dwValue, (long) params[1].dwValue, (u_long FAR *) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " lCommand=%d, %s", params[1].dwValue, GetStringFromOrdinalValue( (DWORD) params[1].dwValue, aIoctlCmds ) ); ShowStr (" *lpData="); ShowBytes (16, (LPVOID) params[2].dwValue, 1); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_listen: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "iBacklog", PT_DWORD, (ULONG_PTR) 0, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = listen( (SOCKET) params[0].dwValue, (int) params[1].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_ntohl: { FUNC_PARAM params[] = { { "networkLong", PT_DWORD, (ULONG_PTR) 0x12345678, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" networkLong=x%x", params[0].dwValue); ShowStr (" hostLong=x%x", ntohl ((u_long) params[0].dwValue)); } break; } case ws_ntohs: { FUNC_PARAM params[] = { { "networkShort", PT_DWORD, (ULONG_PTR) 0x1234, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" networkShort=x%x",(DWORD) LOWORD(params[0].dwValue)); ShowStr( " hostShort=x%x", (DWORD) ntohs ((u_short) LOWORD(params[0].dwValue)) ); } break; } case ws_recv: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuf", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "iBufLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "iRecvFlags", PT_FLAGS, (ULONG_PTR) gdwDefRecvFlags, aRecvFlags }, }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = recv( (SOCKET) params[0].dwValue, (char FAR *) params[1].dwValue, (int) params[2].dwValue, (int) params[3].dwValue )) != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" NumByteReceived=x%x", i); ShowStr (" *pBuf="); ShowBytes (i, (LPVOID) params[1].dwValue, 1); } else { ShowError (funcIndex, 0); } } break; } case ws_recvfrom: { int iSrcAddrLen; struct sockaddr FAR *pSrcAddr = MyAlloc (dwBigBufSize); FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuf", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "iBufLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "iRecvFlags", PT_FLAGS, (ULONG_PTR) gdwDefRecvFlags, aRecvFlags }, { "lpSourceAddr", PT_PTRNOEDIT, (ULONG_PTR) pSrcAddr, pSrcAddr }, { "lpiSourceAddrLength",PT_POINTER, (ULONG_PTR) &iSrcAddrLen, &iSrcAddrLen }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; if (!pSrcAddr) { break; } if (LetUserMungeParams (¶msHeader)) { if ((i = recvfrom( (SOCKET) params[0].dwValue, (char FAR *) params[1].dwValue, (int) params[2].dwValue, (int) params[3].dwValue, (struct sockaddr FAR *) params[4].dwValue, (int FAR *) params[5].dwValue )) != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" NumByteReceived=x%x", i); ShowStr (" *pBuf="); ShowBytes (i, (LPVOID) params[1].dwValue, 1); ShowStr( " *lpiSourceAddrLength=%d", (DWORD) *((int *) params[5].dwValue) ); ShowStr (" *lpSourceAddr="); ShowBytes( *((int *) params[5].dwValue), (LPVOID) params[4].dwValue, 1 ); } else { ShowError (funcIndex, 0); } } MyFree (pSrcAddr); break; } case ws_select: // case ws_select: break; case ws_send: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuf", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "iBufLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "iSendFlags", PT_FLAGS, (ULONG_PTR) gdwDefSendFlags, aSendFlags }, }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = send( (SOCKET) params[0].dwValue, (char FAR *) params[1].dwValue, (int) params[2].dwValue, (int) params[3].dwValue )) != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" NumBytesSent=x%x", i); } else { ShowError (funcIndex, 0); } } break; } case ws_sendto: { int iTargetAddrLen; struct sockaddr FAR *pTargetAddr = MyAlloc (dwBigBufSize); FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuf", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "iBufLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "iSendFlags", PT_FLAGS, (ULONG_PTR) gdwDefSendFlags, aSendFlags }, { "lpTargetAddr", PT_POINTER, (ULONG_PTR) pTargetAddr, pTargetAddr }, { "iTargetAddrLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = sendto( (SOCKET) params[0].dwValue, (char FAR *) params[1].dwValue, (int) params[2].dwValue, (int) params[3].dwValue, (struct sockaddr FAR *) params[4].dwValue, (int) params[5].dwValue )) != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" NumBytesSent=x%x", i); } else { ShowError (funcIndex, 0); } } break; } case ws_setsockopt: { int iOptionBufLength = dwBigBufSize; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "iLevel", PT_ORDINAL, (ULONG_PTR) 0, aSockOptLevels }, { "iOptionName", PT_ORDINAL, (ULONG_PTR) 0, aSockOpts }, { "lpOptionBuf", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "iOptionBufLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = setsockopt( (SOCKET) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue, (char FAR *) params[3].dwValue, (int) params[4].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_shutdown: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "iHow", PT_ORDINAL, (ULONG_PTR) 0, aShutdownOps }, }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = shutdown( (SOCKET) params[0].dwValue, (int) params[1].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_socket: { FUNC_PARAM params[] = { { "address family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { "socket type", PT_ORDINAL, (ULONG_PTR) gdwDefSocketType, aSocketTypes }, { "protocol", PT_DWORD, (ULONG_PTR) gdwDefProtocol, aProtocols }, }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { PMYSOCKET pSocket; if (!(pSocket = MyAlloc (sizeof (MYSOCKET)))) { break; } if ((pSocket->Sock = socket( (int) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue )) != INVALID_SOCKET) { char buf[128]; LRESULT index; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); pSocket->dwAddressFamily = (DWORD) params[0].dwValue; pSocket->dwSocketType = (DWORD) params[1].dwValue; wsprintf( buf, "Socket=x%x (%s %s)", pSocket->Sock, GetStringFromOrdinalValue( pSocket->dwAddressFamily, aAddressFamilies ), GetStringFromOrdinalValue( pSocket->dwSocketType, aSocketTypes ) ); index = SendMessage( ghwndList1, LB_ADDSTRING, 0, (LPARAM) buf ); SendMessage( ghwndList1, LB_SETITEMDATA, index, (LPARAM) pSocket ); } else { ShowError (funcIndex, 0); MyFree (pSocket); } } break; } case ws_WSAAccept: { int iAddrLen = dwBigBufSize; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpAddr", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpiAddrLen", PT_DWORD, (ULONG_PTR) &iAddrLen, &iAddrLen }, { "lpfnCondition", PT_DWORD, (ULONG_PTR) ConditionProc, ConditionProc }, { "dwCallbackData", PT_DWORD, (ULONG_PTR) 0, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { SOCKET s; if ((s = WSAAccept( (SOCKET) params[0].dwValue, (struct sockaddr FAR *) params[1].dwValue, (LPINT) params[2].dwValue, (LPCONDITIONPROC) params[3].dwValue, params[4].dwValue )) != INVALID_SOCKET) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" returned socket=x%x", s); if (params[1].dwValue && params[2].dwValue && *((LPINT) params[2].dwValue)) { struct sockaddr FAR *pSockAddr = (struct sockaddr FAR *) params[1].dwValue; ShowStr( " lpAddr->AddressFamily=%d, %s", (DWORD) pSockAddr->sa_family, GetStringFromOrdinalValue( (DWORD) pSockAddr->sa_family, aAddressFamilies ) ); ShowStr ( "lpAddr->sa_data="); ShowBytes( *((LPINT) params[2].dwValue) - sizeof (u_short), pSockAddr->sa_data, 1 ); } } else { ShowError (funcIndex, 0); } } break; } case ws_WSAAddressToStringA: case ws_WSAAddressToStringW: { DWORD dwAddrStrLen = dwBigBufSize; LPSTR pszAddrStr = MyAlloc (dwBigBufSize); LPWSAPROTOCOL_INFOA pProtoInfo = (funcIndex == ws_WSAAddressToStringA ? &gWSAProtocolInfoA : (LPWSAPROTOCOL_INFOA) &gWSAProtocolInfoW); FUNC_PARAM params[] = { { "lpsaAddress", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) (pBigBuf + 2), pBigBuf + 2}, { "dwAddressLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpProtocolInfo", PT_WSAPROTOCOLINFO, (ULONG_PTR) pProtoInfo, pProtoInfo }, { "lpszAddressString", PT_POINTER, (ULONG_PTR) pszAddrStr, pszAddrStr }, { "lpdwAddressStringLength",PT_POINTER, (ULONG_PTR) &dwAddrStrLen, &dwAddrStrLen } }; FUNC_PARAM_HEADER paramsHeader = { 7, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { LPSOCKADDR pSockAddr = (LPSOCKADDR) params[0].dwValue; if (!IsBadWritePtr (pSockAddr, sizeof (WORD))) { pSockAddr->sa_family = (short) params[1].dwValue; } if (funcIndex == ws_WSAAddressToStringA) { i = WSAAddressToStringA( (LPSOCKADDR) params[0].dwValue, (DWORD) params[3].dwValue, (LPWSAPROTOCOL_INFOA) params[4].dwValue, (LPSTR) params[5].dwValue, (LPDWORD) params[6].dwValue ); } else { i = WSAAddressToStringW( (LPSOCKADDR) params[0].dwValue, (DWORD) params[3].dwValue, (LPWSAPROTOCOL_INFOW) params[4].dwValue, (LPWSTR) params[5].dwValue, (LPDWORD) params[6].dwValue ); } if (i == 0) { DWORD dwLength = *((LPDWORD) params[6].dwValue); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" *lpdwAddressStringLength=x%x", dwLength); ShowStr (" *lpszAddressString="); ShowBytes( (funcIndex == ws_WSAAddressToStringA ? dwLength : dwLength * sizeof(WCHAR)), (LPVOID) params[5].dwValue, 1 ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAAsyncGetHostByAddr: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { char szHostAddr[MAX_STRING_PARAM_SIZE] = "1.2.3.4"; FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "addr", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "type", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 7, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetHostByAddr( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (char FAR *) params[2].dwValue, (int) params[3].dwValue, (int) params[4].dwValue, (char FAR *) params[5].dwValue, (int) params[6].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncGetHostByName: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { char szHostName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "name", PT_STRING, (ULONG_PTR) szHostName, szHostName }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; lstrcpyA (szHostName, gszDefHostName); if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetHostByName( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (char FAR *) params[2].dwValue, (char FAR *) params[3].dwValue, (int) params[4].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncGetProtoByName: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "name", PT_STRING, (ULONG_PTR) szProtoName, szProtoName }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetProtoByName( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (char FAR *) params[2].dwValue, (char FAR *) params[3].dwValue, (int) params[4].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncGetProtoByNumber: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "number", PT_DWORD, (ULONG_PTR) gdwDefProtoNum, NULL }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetProtoByNumber( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (int) params[2].dwValue, (char FAR *) params[3].dwValue, (int) params[4].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncGetServByName: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { char szServName[MAX_STRING_PARAM_SIZE]; char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "name", PT_STRING, (ULONG_PTR) szServName, szServName }, { "proto", PT_STRING, (ULONG_PTR) 0, szProtoName }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; lstrcpyA (szServName, gszDefServName); lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetServByName( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (char FAR *) params[2].dwValue, (char FAR *) params[3].dwValue, (char FAR *) params[4].dwValue, (int) params[5].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncGetServByPort: { PASYNC_REQUEST_INFO pAsyncReqInfo; if ((pAsyncReqInfo = MyAlloc( sizeof (ASYNC_REQUEST_INFO) + dwBigBufSize ))) { char szProtoName[MAX_STRING_PARAM_SIZE]; FUNC_PARAM params[] = { { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, NULL }, { "wMsg", PT_DWORD, (ULONG_PTR) WM_ASYNCREQUESTCOMPLETED, NULL }, { "port", PT_DWORD, (ULONG_PTR) gdwDefPortNum, NULL }, { "proto", PT_STRING, (ULONG_PTR) 0, szProtoName }, { "buf", PT_PTRNOEDIT, (ULONG_PTR) (pAsyncReqInfo+1), pAsyncReqInfo + 1 }, { "buflen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; lstrcpyA (szProtoName, gszDefProtoName); if (LetUserMungeParams (¶msHeader)) { if ((pAsyncReqInfo->hRequest = WSAAsyncGetServByPort( (HWND) params[0].dwValue, (unsigned int) params[1].dwValue, (int) params[2].dwValue, (char FAR *) params[3].dwValue, (char FAR *) params[4].dwValue, (int) params[5].dwValue ))) { ShowStr( "%s returned hRequest=x%x", aFuncNames[funcIndex], pAsyncReqInfo->hRequest ); pAsyncReqInfo->pszFuncName = aFuncNames[funcIndex]; pAsyncReqInfo->FuncIndex = funcIndex; QueueAsyncRequestInfo (pAsyncReqInfo); break; } else { ShowError (funcIndex, 0); } } MyFree (pAsyncReqInfo); } break; } case ws_WSAAsyncSelect: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hwnd", PT_DWORD, (ULONG_PTR) ghwndMain, ghwndMain }, { "msg", PT_DWORD, (ULONG_PTR) WM_NETWORKEVENT, NULL }, { "lEvent", PT_FLAGS, (ULONG_PTR) 0, aNetworkEvents } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAAsyncSelect( (SOCKET) params[0].dwValue, (HWND) params[1].dwValue, (unsigned int) params[2].dwValue, (long) params[3].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSACancelAsyncRequest: { FUNC_PARAM params[] = { { "hRequest", PT_DWORD, (ULONG_PTR) (gpAsyncReqInfoList ? gpAsyncReqInfoList->hRequest : NULL), NULL } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSACancelAsyncRequest ((HANDLE) params[0].dwValue)) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } // case ws_WSACancelBlockingCall: not implemented in ws 2 // // break; case ws_WSACleanup: { FUNC_PARAM_HEADER paramsHeader = { 0, funcIndex, NULL, NULL }; if (LetUserMungeParams (¶msHeader)) { if (WSACleanup() == 0) { char szButtonText[32]; wsprintf (szButtonText, "Startup (%d)", --giCurrNumStartups); SetDlgItemText (ghwndMain, IDC_BUTTON1, szButtonText); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); if (giCurrNumStartups == 0) { int iNumItems; iNumItems = (int) SendMessage( ghwndList1, LB_GETCOUNT, 0, 0 ); for (i = 0; i < iNumItems; i++) { PMYSOCKET pSocket; pSocket = (PMYSOCKET) SendMessage( ghwndList1, LB_GETITEMDATA, 0, 0 ); SendMessage (ghwndList1, LB_DELETESTRING, 0, 0); closesocket (pSocket->Sock); MyFree (pSocket); } } } else { ShowError (funcIndex, 0); } } break; } case ws_WSACloseEvent: { FUNC_PARAM params[] = { { "hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (WSACloseEvent ((WSAEVENT) params[0].dwValue) == TRUE) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); if ((WSAEVENT) params[0].dwValue != ghSelectedEvent) { // // The user overrode the selected widget, so make sure // we don't delete the wrong string from the list box // int iNumItems; WSAEVENT hEvent; iNumItems = (int) SendMessage( ghwndList3, LB_GETCOUNT, 0, 0 ); for (i = 0; i < iNumItems; i++) { hEvent = (WSAEVENT) SendMessage( ghwndList3, LB_GETITEMDATA, i, 0 ); if ((WSAEVENT) params[0].dwValue == hEvent) { giSelectedEventIndex = (int) i; break; } } if (i == iNumItems) { ShowStr( "Strange, couldn't find that hEvent=x%x in list", params[0].dwValue ); break; } } SendMessage( ghwndList3, LB_DELETESTRING, (WPARAM) giSelectedEventIndex, 0 ); } else { ShowError (funcIndex, 0); } } break; } case ws_WSAConnect: { LPBYTE pBuf = MyAlloc (5 * dwBigBufSize + 2 * sizeof (QOS)); LPSOCKADDR pSA = (LPSOCKADDR) pBuf; LPBYTE pCallerBuf = pBuf + dwBigBufSize, pCalleeBuf = pBuf + 2 * dwBigBufSize; LPQOS pSQOS = (LPQOS) (pBuf + 3 * dwBigBufSize), pGQOS = (LPQOS) (pBuf + 4 * dwBigBufSize + sizeof (QOS)); WSABUF callerData, calleeData; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "name", PT_PTRNOEDIT, (ULONG_PTR) pSA, pSA }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) &pSA->sa_data, &pSA->sa_data }, { "namelen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpCallerData", PT_PTRNOEDIT, (ULONG_PTR) &callerData, &callerData }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) pCallerBuf, pCallerBuf }, { "lpCalleeData", PT_PTRNOEDIT, (ULONG_PTR) &calleeData, &calleeData }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) pCalleeBuf, pCalleeBuf }, { "lpSQOS", PT_QOS, (ULONG_PTR) pSQOS, pSQOS }, { "lpGQOS", PT_QOS, (ULONG_PTR) pGQOS, pGQOS }, }; FUNC_PARAM_HEADER paramsHeader = { 13, funcIndex, params, NULL }; if (!pBuf) { break; } ZeroMemory (pSQOS, sizeof (QOS)); pSQOS->ProviderSpecific.len = dwBigBufSize; ZeroMemory (pGQOS, sizeof (QOS)); pGQOS->ProviderSpecific.len = dwBigBufSize; if (LetUserMungeParams (¶msHeader)) { pSA->sa_family = (u_short) LOWORD(params[2].dwValue); callerData.len = (DWORD) params[6].dwValue; calleeData.len = (DWORD) params[9].dwValue; if ((i = WSAConnect( (SOCKET) params[0].dwValue, (LPSOCKADDR) params[1].dwValue, (int) params[4].dwValue, (LPWSABUF) params[5].dwValue, (LPWSABUF) params[8].dwValue, (LPQOS) params[11].dwValue, (LPQOS) params[12].dwValue )) == 0) { LPWSABUF pCalleeData = (LPWSABUF) params[8].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpCalleeData->len=x%x", pCalleeData->len); if (pCalleeData->len) { ShowStr (" lpCalleeData->buf=x%x", pCalleeData->buf); ShowBytes (pCalleeData->len, pCalleeData->buf, 2); } } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } MyFree (pBuf); break; } case ws_WSACreateEvent: { FUNC_PARAM_HEADER paramsHeader = { 0, funcIndex, NULL, NULL }; if (LetUserMungeParams (¶msHeader)) { WSAEVENT wsaEvent; if ((wsaEvent = WSACreateEvent ()) != WSA_INVALID_EVENT) { char buf[20]; LRESULT index; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" wsaEvent=x%x", wsaEvent); wsprintf (buf, "hEvent=x%x", wsaEvent); index = SendMessage( ghwndList3, LB_ADDSTRING, 0, (LPARAM) buf ); SendMessage( ghwndList3, LB_SETITEMDATA, (WPARAM) index, (LPARAM) wsaEvent ); } else { ShowError (funcIndex, 0); } } break; } case ws_WSADuplicateSocketA: case ws_WSADuplicateSocketW: { LPWSAPROTOCOL_INFOA pProtoInfo = (gbWideStringParams ? &gWSAProtocolInfoA : (LPWSAPROTOCOL_INFOA) &gWSAProtocolInfoW); FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hTargetProcess", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpProtocolInfo", PT_PTRNOEDIT, (ULONG_PTR) pProtoInfo, pProtoInfo} }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (gbWideStringParams) { i = WSADuplicateSocketW( (SOCKET) params[0].dwValue, (DWORD) params[1].dwValue, (LPWSAPROTOCOL_INFOW) params[2].dwValue ); } else { i = WSADuplicateSocketA( (SOCKET) params[0].dwValue, (DWORD) params[1].dwValue, (LPWSAPROTOCOL_INFOA) params[2].dwValue ); } if (i == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpProtocolInfo=x%x", params[2].dwValue); ShowProtoInfo( (LPWSAPROTOCOL_INFOA) params[2].dwValue, 0xffffffff, !gbWideStringParams ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAEnumNameSpaceProvidersA: case ws_WSAEnumNameSpaceProvidersW: { DWORD dwSize = dwBigBufSize; FUNC_PARAM params[] = { { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwSize, &dwSize }, { "lpNSPBuffer", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf } }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSAEnumNameSpaceProvidersA) { i = WSAEnumNameSpaceProvidersA( (LPDWORD) params[0].dwValue, (LPWSANAMESPACE_INFOA) params[1].dwValue ); } else { i = WSAEnumNameSpaceProvidersW( (LPDWORD) params[0].dwValue, (LPWSANAMESPACE_INFOW) params[1].dwValue ); } if (i != SOCKET_ERROR) { LPWSANAMESPACE_INFOA pInfo = (LPWSANAMESPACE_INFOA) params[1].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[0].dwValue) ); for (j = 0; j < i; j++, pInfo++) { char szNSInfoN[16]; wsprintf (szNSInfoN, " nsInfo[%d].", j); ShowStr ("%sNSProviderId=", szNSInfoN); ShowStr( " %x %x %x %02x%02x%02x%02x%02x%02x%02x%02x", pInfo->NSProviderId.Data1, pInfo->NSProviderId.Data2, pInfo->NSProviderId.Data3, (DWORD) pInfo->NSProviderId.Data4[0], (DWORD) pInfo->NSProviderId.Data4[1], (DWORD) pInfo->NSProviderId.Data4[2], (DWORD) pInfo->NSProviderId.Data4[3], (DWORD) pInfo->NSProviderId.Data4[4], (DWORD) pInfo->NSProviderId.Data4[5], (DWORD) pInfo->NSProviderId.Data4[6], (DWORD) pInfo->NSProviderId.Data4[7] ); ShowStr( "%sdwNameSpace=%d, %s", szNSInfoN, pInfo->dwNameSpace, GetStringFromOrdinalValue( pInfo->dwNameSpace, aNameSpaces ) ); ShowStr( "%sfActive=%s", szNSInfoN, (pInfo->fActive ? "TRUE" : "FALSE") ); ShowStr ("%sdwVersion=x%x", szNSInfoN, pInfo->dwVersion); ShowStr( (funcIndex == ws_WSAEnumNameSpaceProvidersA ? "%slpszIdentifier=%s" : "%slpszIdentifier=%ws"), szNSInfoN, pInfo->lpszIdentifier ); } } else { ShowError (funcIndex, 0); if (WSAGetLastError() == WSAEFAULT) { ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[0].dwValue) ); } } } break; } case ws_WSAEnumNetworkEvents: { WSANETWORKEVENTS netEvents; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpNetworkEvents", PT_PTRNOEDIT, (ULONG_PTR) &netEvents, &netEvents } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAEnumNetworkEvents( (SOCKET) params[0].dwValue, (WSAEVENT) params[1].dwValue, (LPWSANETWORKEVENTS) params[2].dwValue )) == 0) { LPWSANETWORKEVENTS pNetEvents = (LPWSANETWORKEVENTS) params[2].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpNetworkEvents=x%x", pNetEvents); ShowStr( " ->lNetworkEvents=x%x", pNetEvents->lNetworkEvents ); ShowStr( " ->iErrorCode[READ]=x%x", pNetEvents->iErrorCode[FD_READ_BIT] ); ShowStr( " ->iErrorCode[WRITE]=x%x", pNetEvents->iErrorCode[FD_WRITE_BIT] ); ShowStr( " ->iErrorCode[OOB]=x%x", pNetEvents->iErrorCode[FD_OOB_BIT] ); ShowStr( " ->iErrorCode[ACCEPT]=x%x", pNetEvents->iErrorCode[FD_ACCEPT_BIT] ); ShowStr( " ->iErrorCode[CONNECT]=x%x", pNetEvents->iErrorCode[FD_CONNECT_BIT] ); ShowStr( " ->iErrorCode[CLOSE]=x%x", pNetEvents->iErrorCode[FD_CLOSE_BIT] ); ShowStr( " ->iErrorCode[QOS]=x%x", pNetEvents->iErrorCode[FD_QOS_BIT] ); ShowStr( " ->iErrorCode[GROUP_QOS]=x%x", pNetEvents->iErrorCode[FD_GROUP_QOS_BIT] ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAEnumProtocolsA: case ws_WSAEnumProtocolsW: { int aProtocols[32]; DWORD dwSize = dwBigBufSize; FUNC_PARAM params[] = { { "lpiProtocols", PT_POINTER, (ULONG_PTR) NULL, aProtocols }, { "lpProtocolBuffer", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwSize, &dwSize } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSAEnumProtocolsA) { i = WSAEnumProtocolsA( (LPINT) params[0].dwValue, (LPWSAPROTOCOL_INFOA) params[1].dwValue, (LPDWORD) params[2].dwValue ); } else { i = WSAEnumProtocolsW( (LPINT) params[0].dwValue, (LPWSAPROTOCOL_INFOW) params[1].dwValue, (LPDWORD) params[2].dwValue ); } if (i != SOCKET_ERROR) { LPWSAPROTOCOL_INFOA pInfo = (LPWSAPROTOCOL_INFOA) params[1].dwValue; UpdateResults (TRUE); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr ("%s SUCCESS (result=%d)", aFuncNames[funcIndex], i); ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); for (j = 0; j < i; j++) { if (funcIndex == ws_WSAEnumProtocolsA) { ShowProtoInfo (pInfo, j, TRUE); pInfo++; } else { ShowProtoInfo (pInfo, j, FALSE); pInfo = (LPWSAPROTOCOL_INFOA) (((LPBYTE) pInfo) + sizeof (WSAPROTOCOL_INFOW)); } } UpdateResults (FALSE); } else { if (ShowError (funcIndex, 0) == WSAENOBUFS) { dwSize = *((LPDWORD) params[2].dwValue); ShowStr (" *lpdwBufferLength=%d (x%lx)", dwSize, dwSize); } } } break; } case ws_WSAEventSelect: { WSAPROTOCOL_INFOW info; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lNetworkEvents", PT_FLAGS, (ULONG_PTR) 0, aNetworkEvents } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAEventSelect( (SOCKET) params[0].dwValue, (WSAEVENT) params[1].dwValue, (long) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAGetLastError: { FUNC_PARAM_HEADER paramsHeader = { 0, funcIndex, NULL, NULL }; if (LetUserMungeParams (¶msHeader)) { WSAEVENT wsaEvent; i = (DWORD) WSAGetLastError (); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " LastError=%d, %s", i, GetStringFromOrdinalValue (i, aWSAErrors) ); } break; } case ws_WSAGetOverlappedResult: { DWORD cbTransfer = 0, dwFlags = 0; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpOverlapped", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpcbTransfer", PT_PTRNOEDIT, (ULONG_PTR) &cbTransfer, &cbTransfer }, { "fWait", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpdwFlags", PT_PTRNOEDIT, (ULONG_PTR) &dwFlags, &dwFlags } }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (WSAGetOverlappedResult( (SOCKET) params[0].dwValue, (LPWSAOVERLAPPED) params[1].dwValue, (LPDWORD) params[2].dwValue, (BOOL) params[3].dwValue, (LPDWORD) params[4].dwValue ) == TRUE) { PMYOVERLAPPED pOverlapped = (PMYOVERLAPPED) params[1].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " Overlapped %s completed", aFuncNames[pOverlapped->FuncIndex] ); ShowStr( " *lpcbTransfer=x%x", *((LPDWORD) params[2].dwValue) ); ShowFlags( *((LPDWORD) params[4].dwValue), " *lpdwFlags=", aWSASendAndRecvFlags ); switch (pOverlapped->FuncIndex) { case ws_WSAIoctl: if (*((LPDWORD) params[2].dwValue)) { ShowStr (" lpvOUTBuffer=x%x", (pOverlapped + 1)); ShowBytes( *((LPDWORD) params[2].dwValue), (pOverlapped + 1), 2 ); } break; case ws_WSARecv: case ws_WSARecvFrom: { LPWSABUF pWSABuf = (LPWSABUF) (pOverlapped + 1); for (i = 0; i < (int) pOverlapped->dwFuncSpecific1; i++) { ShowStr (" wsaBuf[0].buf=x%x", pWSABuf->buf); ShowBytes (pWSABuf->len, pWSABuf->buf, 2); pWSABuf++; } break; } } MyFree (pOverlapped); } else { ShowError (funcIndex, 0); } } // MyFree (pOverlapped); as appropriate break; } case ws_WSAGetQOSByName: { LPQOS pQOS = (LPQOS) pBigBuf; LPWSABUF pQOSName = (LPWSABUF) MyAlloc (dwBigBufSize + sizeof (WSABUF)); FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpQOSName", PT_PTRNOEDIT, (ULONG_PTR) pQOSName, pQOSName }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) (pQOSName+1), (pQOSName+1) }, { "lpQOS", PT_PTRNOEDIT, (ULONG_PTR) pQOS, pQOS } }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (!pQOSName) { break; } if (LetUserMungeParams (¶msHeader)) { pQOSName->len = (u_long) params[2].dwValue; pQOSName->buf = (char FAR *) params[3].dwValue; if (WSAGetQOSByName( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue, (LPQOS) params[4].dwValue ) == TRUE) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpQOS=x%x", pQOS); ShowStr( " ->SendingFlowspec.TokenRate=x%x", pQOS->SendingFlowspec.TokenRate ); ShowStr( " ->SendingFlowspec.TokenBucketSize=x%x", pQOS->SendingFlowspec.TokenBucketSize ); ShowStr( " ->SendingFlowspec.PeakBandwidth=x%x", pQOS->SendingFlowspec.PeakBandwidth ); ShowStr( " ->SendingFlowspec.Latency=x%x", pQOS->SendingFlowspec.Latency ); ShowStr( " ->SendingFlowspec.DelayVariation=x%x", pQOS->SendingFlowspec.DelayVariation ); ShowStr( " ->SendingFlowspec.ServiceType=%s (x%x)", GetStringFromOrdinalValue( (DWORD) pQOS->SendingFlowspec.ServiceType, aQOSServiceTypes ), (DWORD) pQOS->SendingFlowspec.ServiceType ); ShowStr( " ->SendingFlowspec.MaxSduSize=x%x", pQOS->SendingFlowspec.MaxSduSize ); ShowStr( " ->SendingFlowspec.MinimumPolicedSize=x%x", pQOS->SendingFlowspec.MinimumPolicedSize ); ShowStr( " ->ReceivingFlowspec.TokenRate=x%x", pQOS->ReceivingFlowspec.TokenRate ); ShowStr( " ->ReceivingFlowspec.TokenBucketSize=x%x", pQOS->ReceivingFlowspec.TokenBucketSize ); ShowStr( " ->ReceivingFlowspec.PeakBandwidth=x%x", pQOS->ReceivingFlowspec.PeakBandwidth ); ShowStr( " ->ReceivingFlowspec.Latency=x%x", pQOS->ReceivingFlowspec.Latency ); ShowStr( " ->ReceivingFlowspec.DelayVariation=x%x", pQOS->ReceivingFlowspec.DelayVariation ); ShowStr( " ->ReceivingFlowspec.ServiceType=%s (x%x)", GetStringFromOrdinalValue( (DWORD) pQOS->ReceivingFlowspec.ServiceType, aQOSServiceTypes ), (DWORD) pQOS->SendingFlowspec.ServiceType ); ShowStr( " ->ReceivingFlowspec.MaxSduSize=x%x", pQOS->ReceivingFlowspec.MaxSduSize ); ShowStr( " ->ReceivingFlowspec.MinimumPolicedSize=x%x", pQOS->ReceivingFlowspec.MinimumPolicedSize ); ShowStr( " ->ProviderSpecific.len=x%x", pQOS->ProviderSpecific.len ); if (pQOS->ProviderSpecific.len) { ShowStr( " ->ProviderSpecific.buf=x%x", pQOS->ProviderSpecific.buf ); ShowBytes( pQOS->ProviderSpecific.len, pQOS->ProviderSpecific.buf, 3 ); } } else { ShowError (funcIndex, 0); } } MyFree (pQOSName); break; } case ws_WSAGetServiceClassInfoA: case ws_WSAGetServiceClassInfoW: { DWORD dwSize = dwBigBufSize; GUID ProviderId, ServiceClassId; FUNC_PARAM params[] = { { "lpProviderId", PT_POINTER, (ULONG_PTR) &ProviderId, &ProviderId }, { "lpServiceClassId", PT_POINTER, (ULONG_PTR) &ServiceClassId, &ServiceClassId }, { "lpdwBufSize", PT_POINTER, (ULONG_PTR) &dwSize, &dwSize }, { "lpServiceClassInfo", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSAGetServiceClassInfoA) { i = WSAGetServiceClassInfoA( (LPGUID) params[0].dwValue, (LPGUID) params[1].dwValue, (LPDWORD) params[2].dwValue, (LPWSASERVICECLASSINFOA) params[3].dwValue ); } else { i = WSAGetServiceClassInfoW( (LPGUID) params[0].dwValue, (LPGUID) params[1].dwValue, (LPDWORD) params[2].dwValue, (LPWSASERVICECLASSINFOW) params[3].dwValue ); } if (i == 0) { LPWSANSCLASSINFOA pClassInfo; LPWSASERVICECLASSINFOA pInfo = (LPWSASERVICECLASSINFOA) params[3].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpServiceClassInfo=x%x", pInfo); ShowStr( " ->lpServiceClassId=%x %x %x %02x%02x%02x%02x%02x%02x%02x%02x", pInfo->lpServiceClassId->Data1, pInfo->lpServiceClassId->Data2, pInfo->lpServiceClassId->Data3, (DWORD) pInfo->lpServiceClassId->Data4[0], (DWORD) pInfo->lpServiceClassId->Data4[1], (DWORD) pInfo->lpServiceClassId->Data4[2], (DWORD) pInfo->lpServiceClassId->Data4[3], (DWORD) pInfo->lpServiceClassId->Data4[4], (DWORD) pInfo->lpServiceClassId->Data4[5], (DWORD) pInfo->lpServiceClassId->Data4[6], (DWORD) pInfo->lpServiceClassId->Data4[7] ); ShowStr( (funcIndex == ws_WSAGetServiceClassInfoA ? " ->lpszServiceClassName=%s" : " ->lpszServiceClassName=%ws"), pInfo->lpszServiceClassName ); ShowStr (" ->dwCount=%d", pInfo->dwCount); pClassInfo = pInfo->lpClassInfos; for (i = 0; i < (int) pInfo->dwCount; i++, pClassInfo++) { char szClassInfoN[32]; wsprintf (szClassInfoN, " ->ClassInfos[%d].", i); ShowStr( (funcIndex == ws_WSAGetServiceClassInfoA ? "%s.lpszName=%s" : "%s.lpszName=%ws"), szClassInfoN, pClassInfo->lpszName ); ShowStr( "%sdwNameSpace=%d, %s", szClassInfoN, pClassInfo->dwNameSpace, GetStringFromOrdinalValue( pClassInfo->dwNameSpace, aNameSpaces ) ); ShowStr( "%sdwValueType=%d", szClassInfoN, pClassInfo->dwValueType ); // supposed to be flags? ShowStr( "%sdwValueSize=%d", szClassInfoN, pClassInfo->dwValueSize ); ShowStr( "%slpValue=x%x", szClassInfoN, pClassInfo->lpValue ); ShowBytes( pClassInfo->dwValueSize, pClassInfo->lpValue, 3 ); } } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAGetServiceClassNameByClassIdA: case ws_WSAGetServiceClassNameByClassIdW: { DWORD dwLength = dwBigBufSize; GUID guid[2]; FUNC_PARAM params[] = { { "lpServiceClassId", PT_POINTER, (ULONG_PTR) guid, guid }, { "lpServiceClassName", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwLength, &dwLength } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSAGetServiceClassNameByClassIdA) { i = WSAGetServiceClassNameByClassIdA( (LPGUID) params[0].dwValue, (LPSTR) params[1].dwValue, (LPDWORD) params[2].dwValue ); } else { i = WSAGetServiceClassNameByClassIdW( (LPGUID) params[0].dwValue, (LPWSTR) params[1].dwValue, (LPDWORD) params[2].dwValue ); } if (i == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); if (funcIndex == ws_WSAGetServiceClassNameByClassIdA) { ShowStr (" *lpServiceClassName=%s", params[1].dwValue); } else { ShowStr (" *lpServiceClassName=%ws", params[1].dwValue); } } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAHtonl: { u_long ulNetLong; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hostLong", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpNetLong", PT_PTRNOEDIT, (ULONG_PTR) &ulNetLong, &ulNetLong } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAHtonl( (SOCKET) params[0].dwValue, (u_long) params[1].dwValue, (u_long *) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" hostLong=x%x", params[1].dwValue); ShowStr (" *lpNetLong=x%x", *((u_long *) params[2].dwValue)); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAHtons: { u_short usNetShort; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "hostShort", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpNetShort", PT_PTRNOEDIT, (ULONG_PTR) &usNetShort, &usNetShort } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAHtons( (SOCKET) params[0].dwValue, (u_short) params[1].dwValue, (u_short *) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" hostShort=x%x", (DWORD) LOWORD(params[1].dwValue)); ShowStr( " *lpNetShort=x%x", (DWORD) *((u_short *) params[2].dwValue) ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAInstallServiceClassA: case ws_WSAInstallServiceClassW: // case ws_WSAInstallServiceClassA:/W break; case ws_WSAIoctl: { DWORD cbBytesRet = 0; PMYOVERLAPPED pOverlapped = MyAlloc (sizeof (MYOVERLAPPED) + dwBigBufSize); FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "dwIoControlCode", PT_ORDINAL, (ULONG_PTR) 0, aWSAIoctlCmds }, { "lpvInBuffer", PT_POINTER, (ULONG_PTR) (pOverlapped+1), (pOverlapped+1) }, { "cbInBuffer", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpvOutBuffer", PT_PTRNOEDIT, (ULONG_PTR) (pOverlapped+1), (pOverlapped+1) }, { "cbOutBuffer", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpcbBytesReturned", PT_PTRNOEDIT, (ULONG_PTR) &cbBytesRet, &cbBytesRet }, { "lpOverlapped", PT_PTRNOEDIT, (ULONG_PTR) 0, pOverlapped }, { " ->hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpfnCompletionProc", PT_PTRNOEDIT, (ULONG_PTR) 0, CompletionProc } }; FUNC_PARAM_HEADER paramsHeader = { 10, funcIndex, params, NULL }; if (!pOverlapped) { break; } if (LetUserMungeParams (¶msHeader)) { pOverlapped->WSAOverlapped.hEvent = (WSAEVENT) params[8].dwValue; pOverlapped->FuncIndex = funcIndex; pOverlapped->dwFuncSpecific1 = (DWORD) params[5].dwValue; if ((i = WSAIoctl( (SOCKET) params[0].dwValue, (DWORD) params[1].dwValue, (LPVOID) params[2].dwValue, (DWORD) params[3].dwValue, (LPVOID) params[4].dwValue, (DWORD) params[5].dwValue, (LPDWORD) params[6].dwValue, (LPWSAOVERLAPPED) params[7].dwValue, (LPWSAOVERLAPPED_COMPLETION_ROUTINE) params[9].dwValue )) == 0) { cbBytesRet = *((LPDWORD) params[6].dwValue); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" bytesReturned=x%x", cbBytesRet); ShowStr (" *lpvOutBuffer="); ShowBytes (cbBytesRet, pOverlapped+1, 2); } else if (i == SOCKET_ERROR) { if (ShowError (funcIndex, 0) == WSA_IO_PENDING) { ShowStr (" lpOverlapped=x%x", params[7].dwValue); break; } } else { ShowUnknownError (funcIndex, i); } if (i == 0 && params[9].dwValue) { // Let CompletionProc free overlapped struct } else { MyFree (pOverlapped); } } break; } // case ws_WSAIsBlocking: not implemented in ws 2 // // break; case ws_WSAJoinLeaf: { LPBYTE pBuf = MyAlloc (5 * dwBigBufSize + 2 * sizeof (QOS)); LPSOCKADDR pSA = (LPSOCKADDR) pBuf; LPBYTE pCallerBuf = pBuf + dwBigBufSize, pCalleeBuf = pBuf + 2 * dwBigBufSize; LPQOS pSQOS = (LPQOS) (pBuf + 3 * dwBigBufSize), pGQOS = (LPQOS) (pBuf + 4 * dwBigBufSize + sizeof (QOS)); WSABUF callerData, calleeData; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "name", PT_PTRNOEDIT, (ULONG_PTR) pSA, pSA }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) &pSA->sa_data, &pSA->sa_data }, { "namelen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpCallerData", PT_PTRNOEDIT, (ULONG_PTR) &callerData, &callerData }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) pCallerBuf, pCallerBuf }, { "lpCalleeData", PT_PTRNOEDIT, (ULONG_PTR) &calleeData, &calleeData }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) pCalleeBuf, pCalleeBuf }, { "lpSQOS", PT_QOS, (ULONG_PTR) pSQOS, pSQOS }, { "lpGQOS", PT_QOS, (ULONG_PTR) pGQOS, pGQOS }, { "dwFlags", PT_ORDINAL, (ULONG_PTR) 0, aJLFlags } }; FUNC_PARAM_HEADER paramsHeader = { 14, funcIndex, params, NULL }; if (!pBuf) { break; } ZeroMemory (pSQOS, sizeof (QOS)); pSQOS->ProviderSpecific.len = dwBigBufSize; ZeroMemory (pGQOS, sizeof (QOS)); pGQOS->ProviderSpecific.len = dwBigBufSize; if (LetUserMungeParams (¶msHeader)) { pSA->sa_family = (u_short) LOWORD(params[2].dwValue); callerData.len = (DWORD) params[6].dwValue; calleeData.len = (DWORD) params[9].dwValue; if ((i = (int)WSAJoinLeaf( (SOCKET) params[0].dwValue, (LPSOCKADDR) params[1].dwValue, (int) params[4].dwValue, (LPWSABUF) params[5].dwValue, (LPWSABUF) params[8].dwValue, (LPQOS) params[11].dwValue, (LPQOS) params[12].dwValue, (DWORD) params[13].dwValue )) == 0) { LPWSABUF pCalleeData = (LPWSABUF) params[8].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" lpCalleeData->len=x%x", pCalleeData->len); if (pCalleeData->len) { ShowStr (" lpCalleeData->buf=x%x", pCalleeData->buf); ShowBytes (pCalleeData->len, pCalleeData->buf, 2); } } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } MyFree (pBuf); break; } case ws_WSALookupServiceBeginA: case ws_WSALookupServiceBeginW: // case ws_WSALookupServiceBeginA:/W break; case ws_WSALookupServiceEnd: { u_long ulHostLong; FUNC_PARAM params[] = { { "hLookup", PT_DWORD, (DWORD) 0, NULL }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSALookupServiceEnd ((HANDLE) params[0].dwValue)) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSALookupServiceNextA: case ws_WSALookupServiceNextW: { DWORD dwLength = dwBigBufSize; FUNC_PARAM params[] = { { "hLookup", PT_DWORD, (ULONG_PTR) 0, NULL }, { "dwControlFlags", PT_DWORD, (ULONG_PTR) 0, NULL }, // flags { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwLength, &dwLength }, { "lpqsResults", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSALookupServiceNextA) { i = WSALookupServiceNextA( (HANDLE) params[0].dwValue, (DWORD) params[1].dwValue, (LPDWORD) params[2].dwValue, (LPWSAQUERYSETA) params[3].dwValue ); } else { i = WSALookupServiceNextW( (HANDLE) params[0].dwValue, (DWORD) params[1].dwValue, (LPDWORD) params[2].dwValue, (LPWSAQUERYSETW) params[3].dwValue ); } if (i == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); // show query/set results } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSANtohl: { u_long ulHostLong; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "netLong", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpHostLong", PT_PTRNOEDIT, (ULONG_PTR) &ulHostLong, &ulHostLong } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSANtohl( (SOCKET) params[0].dwValue, (u_long) params[1].dwValue, (u_long *) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" netLong=x%x", params[1].dwValue); ShowStr (" *lpHostLong=x%x", *((u_long *) params[2].dwValue)); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSANtohs: { u_short usHostShort; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "netShort", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpHostShort", PT_PTRNOEDIT, (ULONG_PTR) &usHostShort, &usHostShort } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSANtohs( (SOCKET) params[0].dwValue, (u_short) params[1].dwValue, (u_short *) params[2].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" netShort=x%x", (DWORD) LOWORD(params[1].dwValue)); ShowStr( " *lpHostShort=x%x", (DWORD) *((u_short *) params[2].dwValue) ); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSARecv: { PMYOVERLAPPED pOverlapped = MyAlloc( sizeof (MYOVERLAPPED) + 2 * sizeof (WSABUF) + 2 * dwBigBufSize ); LPWSABUF lpBuffers = (LPWSABUF) (pOverlapped + 1); LPBYTE pBuf0 = (LPBYTE) (lpBuffers + 2), pBuf1 = pBuf0 + dwBigBufSize; DWORD dwNumBytesRecvd, dwFlags; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuffers", PT_PTRNOEDIT, (ULONG_PTR) lpBuffers, lpBuffers }, { " buf[0].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[0].buf", PT_PTRNOEDIT, (ULONG_PTR) pBuf0, pBuf0 }, { " buf[1].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[1].buf", PT_PTRNOEDIT, (ULONG_PTR) pBuf1, pBuf1 }, { "dwBufferCount", PT_DWORD, (ULONG_PTR) 2, NULL }, { "lpdwNumBytesRecvd", PT_PTRNOEDIT, (ULONG_PTR) &dwNumBytesRecvd, &dwNumBytesRecvd }, { "lpdwFlags", PT_POINTER, (ULONG_PTR) &dwFlags, &dwFlags }, { " ->dwFlags", PT_FLAGS, (ULONG_PTR) gdwDefRecvFlags, aWSARecvFlags }, { "lpOverlapped", PT_PTRNOEDIT, (ULONG_PTR) 0, pOverlapped }, { " ->hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpfnCompletionProc", PT_PTRNOEDIT, (ULONG_PTR) 0, CompletionProc } }; FUNC_PARAM_HEADER paramsHeader = { 13, funcIndex, params, NULL }; if (!pOverlapped) { break; } if (LetUserMungeParams (¶msHeader)) { pOverlapped->WSAOverlapped.hEvent = (WSAEVENT) params[10].dwValue; pOverlapped->FuncIndex = funcIndex; pOverlapped->dwFuncSpecific1 = (DWORD) params[6].dwValue; // bufCount dwFlags = (DWORD) params[9].dwValue; if ((i = WSARecv( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue, (DWORD) params[6].dwValue, (LPDWORD) params[7].dwValue, (LPDWORD) params[8].dwValue, (LPWSAOVERLAPPED) params[10].dwValue, (LPWSAOVERLAPPED_COMPLETION_ROUTINE) params[12].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwNumBytesRecvd=x%x", *((LPDWORD) params[7].dwValue) ); ShowFlags( *((LPDWORD) params[8].dwValue), " *lpdwFlags", aWSASendFlags ); } else if (i == SOCKET_ERROR) { if (ShowError (funcIndex, 0) == WSA_IO_PENDING) { ShowStr (" lpOverlapped=x%x", params[10].dwValue); break; } } else { ShowUnknownError (funcIndex, i); } } MyFree (pOverlapped); break; } case ws_WSARecvDisconnect: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpInboundDisconnectData", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) (pBigBuf + sizeof (u_long)), (pBigBuf + sizeof (u_long)) } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSARecvDisconnect( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSARecvFrom: { PMYOVERLAPPED pOverlapped = MyAlloc( sizeof (MYOVERLAPPED) + 2 * sizeof (WSABUF) + 2 * dwBigBufSize ); LPWSABUF lpBuffers = (LPWSABUF) (pOverlapped + 1); LPBYTE pBuf0 = (LPBYTE) (lpBuffers + 2), pBuf1 = pBuf0 + dwBigBufSize; DWORD dwNumBytesSent, dwFlags; LPSOCKADDR psa = (LPSOCKADDR) pBigBuf; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuffers", PT_PTRNOEDIT, (ULONG_PTR) lpBuffers, lpBuffers }, { " buf[0].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[0].buf", PT_PTRNOEDIT, (ULONG_PTR) pBuf0, pBuf0 }, { " buf[1].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[1].buf", PT_PTRNOEDIT, (ULONG_PTR) pBuf1, pBuf1 }, { "dwBufferCount", PT_DWORD, (ULONG_PTR) 2, NULL }, { "lpdwNumBytesRecvd", PT_PTRNOEDIT, (ULONG_PTR) &dwNumBytesSent, &dwNumBytesSent }, { "lpdwFlags", PT_POINTER, (ULONG_PTR) &dwFlags, &dwFlags }, { " ->dwFlags", PT_FLAGS, (ULONG_PTR) gdwDefRecvFlags, aWSARecvFlags }, { "lpTo", PT_PTRNOEDIT, (ULONG_PTR) psa, psa }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) psa->sa_data, psa->sa_data }, { "iToLen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpOverlapped", PT_PTRNOEDIT, (ULONG_PTR) 0, pOverlapped }, { " ->hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpfnCompletionProc", PT_PTRNOEDIT, (ULONG_PTR) 0, CompletionProc } }; FUNC_PARAM_HEADER paramsHeader = { 17, funcIndex, params, NULL }; if (!pOverlapped) { break; } if (LetUserMungeParams (¶msHeader)) { pOverlapped->WSAOverlapped.hEvent = (WSAEVENT) params[14].dwValue; pOverlapped->FuncIndex = funcIndex; pOverlapped->dwFuncSpecific1 = (DWORD) params[6].dwValue; // bufCount dwFlags = (DWORD) params[9].dwValue; psa->sa_family = (u_short) LOWORD(params[11].dwValue); if ((i = WSASendTo( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue, (DWORD) params[6].dwValue, (LPDWORD) params[7].dwValue, (DWORD) params[8].dwValue, (LPSOCKADDR) params[10].dwValue, (int) params[13].dwValue, (LPWSAOVERLAPPED) params[14].dwValue, (LPWSAOVERLAPPED_COMPLETION_ROUTINE) params[16].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwNumBytesSent=x%x", *((LPDWORD) params[7].dwValue) ); ShowFlags( *((LPDWORD) params[8].dwValue), " *lpdwNumBytesSent=x%x", aWSAFlags ); } else if (i == SOCKET_ERROR) { if (ShowError (funcIndex, 0) == WSA_IO_PENDING) { ShowStr (" lpOverlapped=x%x", params[14].dwValue); break; } } else { ShowUnknownError (funcIndex, i); } } MyFree (pOverlapped); break; } case ws_WSARemoveServiceClass: { GUID guid[2]; // add padding to keep dumb user from hosing stack FUNC_PARAM params[] = { { "lpServiceClassId", PT_POINTER, (ULONG_PTR) guid, guid }, }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSARemoveServiceClass ((LPGUID) params[0].dwValue)) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSAResetEvent: { FUNC_PARAM params[] = { { "hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (WSAResetEvent ((WSAEVENT) params[0].dwValue) == TRUE) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else { ShowError (funcIndex, 0); } } break; } case ws_WSASend: { PMYOVERLAPPED pOverlapped = MyAlloc( sizeof (MYOVERLAPPED) + 2 * sizeof (WSABUF) + 2 * dwBigBufSize ); LPWSABUF lpBuffers = (LPWSABUF) (pOverlapped + 1); LPBYTE pBuf0 = (LPBYTE) (lpBuffers + 2), pBuf1 = pBuf0 + dwBigBufSize; DWORD dwNumBytesSent; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuffers", PT_PTRNOEDIT, (ULONG_PTR) lpBuffers, lpBuffers }, { " buf[0].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[0].buf", PT_POINTER, (ULONG_PTR) pBuf0, pBuf0 }, { " buf[1].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[1].buf", PT_POINTER, (ULONG_PTR) pBuf1, pBuf1 }, { "dwBufferCount", PT_DWORD, (ULONG_PTR) 2, NULL }, { "lpdwNumBytesSent", PT_PTRNOEDIT, (ULONG_PTR) &dwNumBytesSent, &dwNumBytesSent }, { "dwFlags", PT_FLAGS, (ULONG_PTR) gdwDefSendFlags, aWSASendFlags }, { "lpOverlapped", PT_PTRNOEDIT, (ULONG_PTR) 0, pOverlapped }, { " ->hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpfnCompletionProc", PT_PTRNOEDIT, (ULONG_PTR) 0, CompletionProc } }; FUNC_PARAM_HEADER paramsHeader = { 12, funcIndex, params, NULL }; if (!pOverlapped) { break; } if (LetUserMungeParams (¶msHeader)) { pOverlapped->WSAOverlapped.hEvent = (WSAEVENT) params[10].dwValue; pOverlapped->FuncIndex = funcIndex; pOverlapped->dwFuncSpecific1 = (DWORD) params[6].dwValue; // bufCount if ((i = WSASend( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue, (DWORD) params[6].dwValue, (LPDWORD) params[7].dwValue, (DWORD) params[8].dwValue, (LPWSAOVERLAPPED) params[9].dwValue, (LPWSAOVERLAPPED_COMPLETION_ROUTINE) params[11].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwNumBytesSent=x%x", *((LPDWORD) params[7].dwValue) ); } else if (i == SOCKET_ERROR) { if (ShowError (funcIndex, 0) == WSA_IO_PENDING) { ShowStr (" lpOverlapped=x%x", params[9].dwValue); break; } } else { ShowUnknownError (funcIndex, i); } } MyFree (pOverlapped); break; } case ws_WSASendDisconnect: { FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpOutboundDisconnectData", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { " ->len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " ->buf", PT_POINTER, (ULONG_PTR) (pBigBuf + sizeof (u_long)), (pBigBuf + sizeof (u_long)) } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSASendDisconnect( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } case ws_WSASendTo: { PMYOVERLAPPED pOverlapped = MyAlloc( sizeof (MYOVERLAPPED) + 2 * sizeof (WSABUF) + 2 * dwBigBufSize ); LPWSABUF lpBuffers = (LPWSABUF) (pOverlapped + 1); LPBYTE pBuf0 = (LPBYTE) (lpBuffers + 2), pBuf1 = pBuf0 + dwBigBufSize; DWORD dwNumBytesSent; LPSOCKADDR psa = (LPSOCKADDR) pBigBuf; FUNC_PARAM params[] = { { gszSocket, PT_DWORD, (ULONG_PTR) gpSelectedSocket->Sock, NULL }, { "lpBuffers", PT_PTRNOEDIT, (ULONG_PTR) lpBuffers, lpBuffers }, { " buf[0].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[0].buf", PT_POINTER, (ULONG_PTR) pBuf0, pBuf0 }, { " buf[1].len", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { " buf[1].buf", PT_POINTER, (ULONG_PTR) pBuf1, pBuf1 }, { "dwBufferCount", PT_DWORD, (ULONG_PTR) 2, NULL }, { "lpdwNumBytesSent", PT_PTRNOEDIT, (ULONG_PTR) &dwNumBytesSent, &dwNumBytesSent }, { "dwFlags", PT_FLAGS, (ULONG_PTR) gdwDefSendFlags, aWSASendFlags }, { "lpTo", PT_PTRNOEDIT, (ULONG_PTR) psa, psa }, { " ->sa_family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { " ->sa_data", PT_POINTER, (ULONG_PTR) psa->sa_data, psa->sa_data }, { "iToLen", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }, { "lpOverlapped", PT_PTRNOEDIT, (ULONG_PTR) 0, pOverlapped }, { " ->hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL }, { "lpfnCompletionProc", PT_PTRNOEDIT, (ULONG_PTR) 0, CompletionProc } }; FUNC_PARAM_HEADER paramsHeader = { 16, funcIndex, params, NULL }; if (!pOverlapped) { break; } if (LetUserMungeParams (¶msHeader)) { pOverlapped->WSAOverlapped.hEvent = (WSAEVENT) params[14].dwValue; pOverlapped->FuncIndex = funcIndex; pOverlapped->dwFuncSpecific1 = (DWORD) params[6].dwValue; // bufCount psa->sa_family = (u_short) LOWORD(params[10].dwValue); if ((i = WSASendTo( (SOCKET) params[0].dwValue, (LPWSABUF) params[1].dwValue, (DWORD) params[6].dwValue, (LPDWORD) params[7].dwValue, (DWORD) params[8].dwValue, (LPSOCKADDR) params[9].dwValue, (int) params[12].dwValue, (LPWSAOVERLAPPED) params[13].dwValue, (LPWSAOVERLAPPED_COMPLETION_ROUTINE) params[15].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwNumBytesSent=x%x", *((LPDWORD) params[7].dwValue) ); } else if (i == SOCKET_ERROR) { if (ShowError (funcIndex, 0) == WSA_IO_PENDING) { ShowStr (" lpOverlapped=x%x", params[13].dwValue); break; } } else { ShowUnknownError (funcIndex, i); } } MyFree (pOverlapped); break; } // case ws_WSASetBlockingHook: not implemented in ws 2 // // break; case ws_WSASetEvent: { FUNC_PARAM params[] = { { "hEvent", PT_DWORD, (ULONG_PTR) ghSelectedEvent, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (WSASetEvent ((WSAEVENT) params[0].dwValue) == TRUE) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else { ShowError (funcIndex, 0); } } break; } case ws_WSASetLastError: { FUNC_PARAM params[] = { { "iError", PT_DWORD, (ULONG_PTR) 0, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 1, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { WSASetLastError ((int) params[0].dwValue); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } break; } case ws_WSASetServiceA: case ws_WSASetServiceW: // case ws_WSASetServiceA:/W break; case ws_WSASocketA: case ws_WSASocketW: { FUNC_PARAM params[] = { { "address family", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { "socket type", PT_ORDINAL, (ULONG_PTR) gdwDefSocketType, aSocketTypes }, { "protocol", PT_DWORD, (ULONG_PTR) gdwDefProtocol, aProtocols }, { "protocol info", PT_WSAPROTOCOLINFO, 0, (gbWideStringParams ? (LPVOID) &gWSAProtocolInfoW : (LPVOID) &gWSAProtocolInfoA) }, { "group", PT_DWORD, (ULONG_PTR) 0, NULL }, { "flags", PT_FLAGS, (ULONG_PTR) gdwDefWSASocketFlags, aWSAFlags }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { PMYSOCKET pSocket; if (!(pSocket = MyAlloc (sizeof (MYSOCKET)))) { break; } if (gbWideStringParams) { pSocket->Sock = WSASocketW( (int) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue, (LPWSAPROTOCOL_INFOW) params[3].dwValue, (GROUP) params[4].dwValue, (DWORD) params[5].dwValue ); } else { pSocket->Sock = WSASocketA( (int) params[0].dwValue, (int) params[1].dwValue, (int) params[2].dwValue, (LPWSAPROTOCOL_INFOA) params[3].dwValue, (GROUP) params[4].dwValue, (DWORD) params[5].dwValue ); } if (pSocket->Sock != INVALID_SOCKET) { char buf[128]; LRESULT index; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); pSocket->bWSASocket = TRUE; pSocket->dwAddressFamily = (DWORD) params[0].dwValue; pSocket->dwSocketType = (DWORD) params[1].dwValue; pSocket->dwFlags = (DWORD) params[5].dwValue; wsprintf( buf, "WSASocket=x%x (%s %s%s)", pSocket->Sock, GetStringFromOrdinalValue (pSocket->dwAddressFamily, aAddressFamilies), GetStringFromOrdinalValue (pSocket->dwSocketType, aSocketTypes), (pSocket->dwFlags & WSA_FLAG_OVERLAPPED ? " OVERLAPPED" : "") ); index = SendMessage( ghwndList1, LB_ADDSTRING, 0, (LPARAM) buf ); SendMessage( ghwndList1, LB_SETITEMDATA, index, (LPARAM) pSocket ); } else { ShowError (funcIndex, 0); MyFree (pSocket); } } break; } case ws_WSAStartup: { WSADATA wsaData; FUNC_PARAM params[] = { { "wVersionRequested", PT_DWORD, (ULONG_PTR) 0x101, NULL }, { "lpWSAData", PT_PTRNOEDIT, (ULONG_PTR) &wsaData, &wsaData }, }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSAStartup( LOWORD(params[0].dwValue), (LPWSADATA) params[1].dwValue )) == 0) { char szButtonText[32]; LPWSADATA pWSAData = (LPWSADATA) params[1].dwValue; wsprintf (szButtonText, "Startup (%d)", ++giCurrNumStartups); SetDlgItemText (ghwndMain, IDC_BUTTON1, szButtonText); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr (" wVersion=x%x", (DWORD) pWSAData->wVersion); ShowStr (" wHighVersion=x%x", (DWORD) pWSAData->wHighVersion); ShowStr (" szDescription=%s", pWSAData->szDescription); ShowStr (" szSystemStatus=%s", pWSAData->szSystemStatus); ShowStr (" iMaxSockets=%d", (DWORD) pWSAData->iMaxSockets); ShowStr (" iMaxUdpDg=%d", (DWORD) pWSAData->iMaxUdpDg); // ignored for 2.0+ ShowStr (" ", pWSAData->lpVendorInfo); } else { ShowError (funcIndex, i); } } break; } case ws_WSAStringToAddressA: case ws_WSAStringToAddressW: { INT iAddrLen = (INT) dwBigBufSize; char szAddrString[MAX_STRING_PARAM_SIZE] = ""; LPWSAPROTOCOL_INFOA pInfo = (funcIndex == ws_WSAStringToAddressA ? &gWSAProtocolInfoA : (LPWSAPROTOCOL_INFOA) &gWSAProtocolInfoW); FUNC_PARAM params[] = { { "lpszAddressString", PT_STRING, (ULONG_PTR) szAddrString, szAddrString }, { "iAddressFamily", PT_ORDINAL, (ULONG_PTR) gdwDefAddrFamily, aAddressFamilies }, { "lpProtocolInfo", PT_WSAPROTOCOLINFO, (ULONG_PTR) pInfo, pInfo }, { "lpAddress", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpAddressLength", PT_POINTER, (ULONG_PTR) &iAddrLen, &iAddrLen } }; FUNC_PARAM_HEADER paramsHeader = { 5, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if (funcIndex == ws_WSAStringToAddressA) { i = WSAStringToAddressA( (LPSTR) params[0].dwValue, (INT) params[1].dwValue, (LPWSAPROTOCOL_INFOA) params[2].dwValue, (LPSOCKADDR) params[3].dwValue, (LPINT) params[4].dwValue ); } else { i = WSAStringToAddressW( (LPWSTR) params[0].dwValue, (INT) params[1].dwValue, (LPWSAPROTOCOL_INFOW) params[2].dwValue, (LPSOCKADDR) params[3].dwValue, (LPINT) params[4].dwValue ); } if (i == 0) { LPSOCKADDR pSockAddr = (LPSOCKADDR) params[3].dwValue; ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpAddressLength=x%x", *((LPINT) params[4].dwValue) ); ShowStr (" lpAddress=x%x", params[3].dwValue); ShowStr( " ->sa_family=%d, %s", (DWORD) pSockAddr->sa_family, GetStringFromOrdinalValue( (DWORD) pSockAddr->sa_family, aAddressFamilies ) ); ShowStr (" ->sa_data="); ShowBytes (14, pSockAddr->sa_data, 3); } else if (i == SOCKET_ERROR) { ShowError (funcIndex, 0); } else { ShowUnknownError (funcIndex, i); } } break; } // case ws_WSAUnhookBlockingHook: // // break; case ws_WSAWaitForMultipleEvents: // case ws_WSAWaitForMultipleEvents: break; case ws_WSCEnumProtocols: { int aProtocols[32], iErrno; DWORD dwSize = dwBigBufSize; FUNC_PARAM params[] = { { "lpiProtocols", PT_POINTER, (ULONG_PTR) NULL, aProtocols }, { "lpProtocolBuffer", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwSize, &dwSize }, { "lpErrno", PT_POINTER, (ULONG_PTR) &iErrno, &iErrno } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = WSCEnumProtocols( (LPINT) params[0].dwValue, (LPWSAPROTOCOL_INFOW) params[1].dwValue, (LPDWORD) params[2].dwValue, (LPINT) params[3].dwValue ); if (i != SOCKET_ERROR) { LPWSAPROTOCOL_INFOW pInfo = (LPWSAPROTOCOL_INFOW) params[1].dwValue; UpdateResults (TRUE); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); for (j = 0; j < i; j++) { ShowProtoInfo ((LPWSAPROTOCOL_INFOA) pInfo, j, FALSE); pInfo++; } UpdateResults (FALSE); } else { ShowError (funcIndex, iErrno); if (iErrno == WSAENOBUFS) { ShowStr( " *lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); } } } break; } case ws_WSCGetProviderPath: { GUID guid[2]; INT iPathLen = dwBigBufSize, iErrno = 0; FUNC_PARAM params[] = { { "lpProviderId", PT_POINTER, (ULONG_PTR) guid, guid }, { "lpszProviderDllPath", PT_PTRNOEDIT,(ULONG_PTR) pBigBuf, pBigBuf }, { "lpProviderDllPathLen", PT_POINTER, (ULONG_PTR) &iPathLen, &iPathLen }, { "lpErrno", PT_PTRNOEDIT,(ULONG_PTR) &iErrno, &iErrno } }; FUNC_PARAM_HEADER paramsHeader = { 4, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { if ((i = WSCGetProviderPath( (LPGUID) params[0].dwValue, (LPWSTR) params[1].dwValue, (LPINT) params[2].dwValue, (LPINT) params[3].dwValue )) == 0) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr ("*lpszProviderDllPath='%ws'", params[1].dwValue); ShowStr ("*lpProviderDllPathLen=%d", *((LPINT)params[2].dwValue)); } else { ShowError (funcIndex, iErrno); } } break; } case ws_EnumProtocolsA: case ws_EnumProtocolsW: { INT aiProtocols[32]; DWORD dwBufSize = dwBigBufSize; FUNC_PARAM params[] = { { "lpiProtocols", PT_POINTER, (ULONG_PTR) NULL, aiProtocols }, { "lpProtocolBuffer", PT_PTRNOEDIT,(ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwBufferLength", PT_POINTER, (ULONG_PTR) &dwBufSize, &dwBufSize } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_EnumProtocolsA ? EnumProtocolsA( (LPINT) params[0].dwValue, (LPVOID) params[1].dwValue, (LPDWORD) params[2].dwValue ) : EnumProtocolsW( (LPINT) params[0].dwValue, (LPVOID) params[1].dwValue, (LPDWORD) params[2].dwValue )); if (i >= 0) { char szProtoInfoN[20], buf[36]; PROTOCOL_INFO *pInfo; UpdateResults (TRUE); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr ("iResult=%d", i); ShowStr( "*lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); for( j = 0, pInfo = (PROTOCOL_INFO *) params[1].dwValue; j < i; j++, pInfo++ ) { wsprintf (szProtoInfoN, " protoInfo[%d].", j); wsprintf (buf, "%sdwServiceFlags", szProtoInfoN); ShowFlags (pInfo->dwServiceFlags, buf, aServiceFlags); ShowStr( "%siAddressFamily=%d, %s", szProtoInfoN, (DWORD) pInfo->iAddressFamily, GetStringFromOrdinalValue( (DWORD) pInfo->iAddressFamily, aAddressFamilies ) ); ShowStr( "%siMaxSockAddr=%d", szProtoInfoN, (DWORD) pInfo->iMaxSockAddr ); ShowStr( "%siMinSockAddr=%d", szProtoInfoN, (DWORD) pInfo->iMinSockAddr ); ShowStr( "%siSocketType=%d, %s", szProtoInfoN, (DWORD) pInfo->iSocketType, GetStringFromOrdinalValue( (DWORD) pInfo->iSocketType, aSocketTypes ) ); ShowStr( "%siProtocol=%d (x%x)", // ought to be flags??? szProtoInfoN, (DWORD) pInfo->iProtocol, (DWORD) pInfo->iProtocol ); ShowStr( "%sdwMessageSize=x%x", szProtoInfoN, (DWORD) pInfo->dwMessageSize ); ShowStr( "%slpProtocol=x%x", szProtoInfoN, pInfo->lpProtocol ); if (funcIndex == ws_EnumProtocolsA) { ShowStr( "%s*lpProtocol=%s", szProtoInfoN, pInfo->lpProtocol ); ShowBytes( (lstrlenA (pInfo->lpProtocol) + 1) * sizeof(CHAR), pInfo->lpProtocol, 2 ); } else { ShowStr( "%s*lpProtocol=%ws", szProtoInfoN, pInfo->lpProtocol ); ShowBytes( (lstrlenW ((WCHAR *) pInfo->lpProtocol) + 1) * sizeof(WCHAR), pInfo->lpProtocol, 2 ); } } UpdateResults (FALSE); } else { if (ShowError (funcIndex, 0) == ERROR_INSUFFICIENT_BUFFER) { ShowStr( "*lpdwBufferLength=x%x", *((LPDWORD) params[2].dwValue) ); } } } break; } case ws_GetAddressByNameA: case ws_GetAddressByNameW: { GUID guid[2]; WCHAR szSvcName[MAX_STRING_PARAM_SIZE] = L""; INT aiProtocols[32]; char *pBigBuf2 = (char *) LocalAlloc (LPTR, dwBigBufSize); DWORD dwCsaddrBufLen = dwBigBufSize, dwAliasBufLen = dwBigBufSize; FUNC_PARAM params[] = { { "dwNameSpace", PT_ORDINAL, (ULONG_PTR) 0, aNameSpaces }, { "lpServiceType", PT_POINTER, (ULONG_PTR) guid, guid }, { "lpServiceName", PT_STRING, (ULONG_PTR) NULL, szSvcName }, { "lpiProtocols", PT_POINTER, (ULONG_PTR) NULL, aiProtocols }, { "dwResolution", PT_FLAGS, (ULONG_PTR) 0, aResFlags }, { "lpServiceAsyncInfo", PT_DWORD, (ULONG_PTR) 0, 0 }, { "lpCsaddrBuffer", PT_PTRNOEDIT,(ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwCsaddrBufLen", PT_POINTER, (ULONG_PTR) &dwCsaddrBufLen, &dwCsaddrBufLen }, { "lpAliasBuf", PT_PTRNOEDIT,(ULONG_PTR) pBigBuf2, pBigBuf2 }, { "lpdwAliasBufLen", PT_POINTER, (ULONG_PTR) &dwAliasBufLen, &dwAliasBufLen } }; FUNC_PARAM_HEADER paramsHeader = { 10, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_GetAddressByNameA ? GetAddressByNameA( (DWORD) params[0].dwValue, (LPGUID) params[1].dwValue, (LPSTR) params[2].dwValue, (LPINT) params[3].dwValue, (DWORD) params[4].dwValue, (LPSERVICE_ASYNC_INFO) params[5].dwValue, (LPVOID) params[6].dwValue, (LPDWORD) params[7].dwValue, (LPSTR) params[8].dwValue, (LPDWORD) params[9].dwValue ) : GetAddressByNameW( (DWORD) params[0].dwValue, (LPGUID) params[1].dwValue, (LPWSTR) params[2].dwValue, (LPINT) params[3].dwValue, (DWORD) params[4].dwValue, (LPSERVICE_ASYNC_INFO) params[5].dwValue, (LPVOID) params[6].dwValue, (LPDWORD) params[7].dwValue, (LPWSTR) params[8].dwValue, (LPDWORD) params[9].dwValue )); if (i >= 0) { char szAddrInfoN[20]; CSADDR_INFO *pInfo; UpdateResults (TRUE); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr ("iResult=%d", i); ShowStr( "*lpdwCsaddrBufLen=x%x", *((LPDWORD) params[7].dwValue) ); for( j = 0, pInfo = (CSADDR_INFO *) params[6].dwValue; j < i; j++, pInfo++ ) { wsprintf (szAddrInfoN, " addrInfo[%d].", j); ShowStr( "%sLocalAddr.lpSockaddr=x%x", szAddrInfoN, pInfo->LocalAddr.lpSockaddr ); ShowBytes( pInfo->LocalAddr.iSockaddrLength, pInfo->LocalAddr.lpSockaddr, 2 ); ShowStr( "%sLocalAddr.iSockaddrLen=%d (x%x)", szAddrInfoN, pInfo->LocalAddr.iSockaddrLength, pInfo->LocalAddr.iSockaddrLength ); ShowStr( "%sRemoteAddr.lpSockaddr=x%x", szAddrInfoN, pInfo->RemoteAddr.lpSockaddr ); ShowBytes( pInfo->RemoteAddr.iSockaddrLength, pInfo->RemoteAddr.lpSockaddr, 2 ); ShowStr( "%sRemoteAddr.iSockaddrLen=%d (x%x)", szAddrInfoN, pInfo->RemoteAddr.iSockaddrLength, pInfo->RemoteAddr.iSockaddrLength ); ShowStr( "%siSocketType=%d, %s", szAddrInfoN, (DWORD) pInfo->iSocketType, GetStringFromOrdinalValue( (DWORD) pInfo->iSocketType, aSocketTypes ) ); ShowStr( "%siProtocol=%d (x%x)", // ought to be flags??? szAddrInfoN, (DWORD) pInfo->iProtocol, (DWORD) pInfo->iProtocol ); } UpdateResults (FALSE); } else { if (ShowError (funcIndex, 0) == ERROR_INSUFFICIENT_BUFFER) { ShowStr( "*lpdwCsaddrBufLen=x%x", *((LPDWORD) params[7].dwValue) ); } } } LocalFree (pBigBuf2); break; } case ws_GetNameByTypeA: case ws_GetNameByTypeW: { GUID guid[2]; FUNC_PARAM params[] = { { "lpServiceType", PT_POINTER, (ULONG_PTR) guid, guid }, { "lpServiceName", PT_PTRNOEDIT,(ULONG_PTR) pBigBuf, pBigBuf }, { "dwNameLength", PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL } }; FUNC_PARAM_HEADER paramsHeader = { 3, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_GetNameByTypeA ? GetNameByTypeA( (LPGUID) params[0].dwValue, (LPSTR) params[1].dwValue, (DWORD) params[2].dwValue ) : GetNameByTypeW( (LPGUID) params[0].dwValue, (LPWSTR) params[1].dwValue, (DWORD) params[2].dwValue )); if (i != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); if (funcIndex == ws_GetNameByTypeA) { ShowStr ("*lpServiceName=%s", (char *) params[1].dwValue); } else { ShowStr ("*lpServiceName=%ws", (char *) params[1].dwValue); } } else { ShowError (funcIndex, 0); } } break; } case ws_GetServiceA: case ws_GetServiceW: { GUID guid[2]; WCHAR szSvcName[MAX_STRING_PARAM_SIZE] = L""; DWORD dwBufSize = dwBigBufSize; FUNC_PARAM params[] = { { "dwNameSpace", PT_ORDINAL, (ULONG_PTR) 0, aNameSpaces }, { "lpGuid", PT_POINTER, (ULONG_PTR) guid, guid }, { "lpServiceName", PT_STRING, (ULONG_PTR) szSvcName, szSvcName }, { "dwProperties", PT_FLAGS, (ULONG_PTR) 0, aProperties }, { "lpBuffer", PT_PTRNOEDIT, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpdwBufLen", PT_POINTER, (ULONG_PTR) &dwBufSize, &dwBufSize }, { "lpSvcAsyncInfo", PT_DWORD, (ULONG_PTR) 0, 0 } }; FUNC_PARAM_HEADER paramsHeader = { 7, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_GetServiceA ? GetServiceA( (DWORD) params[0].dwValue, (LPGUID) params[1].dwValue, (LPSTR) params[2].dwValue, (DWORD) params[3].dwValue, (LPVOID) params[4].dwValue, (LPDWORD) params[5].dwValue, (LPSERVICE_ASYNC_INFO) params[6].dwValue ) : GetServiceW( (DWORD) params[0].dwValue, (LPGUID) params[1].dwValue, (LPWSTR) params[2].dwValue, (DWORD) params[3].dwValue, (LPVOID) params[4].dwValue, (LPDWORD) params[5].dwValue, (LPSERVICE_ASYNC_INFO) params[6].dwValue )); if (i >= 0) { char szSvcInfoN[20], buf[36]; SERVICE_INFO *pInfo; SERVICE_ADDRESS *pAddr; UpdateResults (TRUE); ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowStr ("iResult=%d", i); ShowStr( "*lpdwBufLen=x%x", *((LPDWORD) params[5].dwValue) ); for( j = 0, pInfo = (SERVICE_INFO *) params[4].dwValue; j < i; j++, pInfo++ ) { wsprintf (szSvcInfoN, " svcInfo[%d].", j); wsprintf (buf, "lpServiceType="); ShowGUID (buf, pInfo->lpServiceType); ShowStr( (funcIndex == ws_GetServiceA ? "%slpServiceName=%s" : "%slpServiceName=%ws"), szSvcInfoN, pInfo->lpServiceName ); ShowStr( (funcIndex == ws_GetServiceA ? "%slpComment=%s" : "%slpComment=%ws"), szSvcInfoN, pInfo->lpServiceName ); ShowStr( (funcIndex == ws_GetServiceA ? "%slpLocale=%s" : "%slpLocale=%ws"), szSvcInfoN, pInfo->lpLocale ); ShowStr( "%sdwDisplayHint=%d, %s", szSvcInfoN, (DWORD) pInfo->dwDisplayHint, GetStringFromOrdinalValue( (DWORD) pInfo->dwDisplayHint, aResDisplayTypes ) ); ShowStr ("%sdwVersion=x%x", szSvcInfoN, pInfo->dwVersion); ShowStr ("%sdwTime=x%x", szSvcInfoN, pInfo->dwTime); ShowStr( (funcIndex == ws_GetServiceA ? "%slpMachineName=%s" : "%slpMachineName=%ws"), szSvcInfoN, pInfo->lpMachineName ); ShowStr( "%slpServiceAddress.dwAddressCount=%d (x%x)", szSvcInfoN, pInfo->lpServiceAddress->dwAddressCount, pInfo->lpServiceAddress->dwAddressCount ); for( k = 0, pAddr = pInfo->lpServiceAddress->Addresses; k < (int) pInfo->lpServiceAddress->dwAddressCount; k++, pAddr++ ) { } ShowStr( "%sServiceSpecificInfo.cbSize=%d (x%x)", szSvcInfoN, pInfo->ServiceSpecificInfo.cbSize, pInfo->ServiceSpecificInfo.cbSize ); ShowBytes( pInfo->ServiceSpecificInfo.cbSize, pInfo->ServiceSpecificInfo.pBlobData, 2 ); } UpdateResults (FALSE); } else { if (ShowError (funcIndex, i) == ERROR_INSUFFICIENT_BUFFER) { ShowStr( "*lpdwBufLen=x%x", *((LPDWORD) params[5].dwValue) ); } } } break; } case ws_GetTypeByNameA: case ws_GetTypeByNameW: { GUID guid[2]; WCHAR szSvcName[MAX_STRING_PARAM_SIZE] = L""; FUNC_PARAM params[] = { { "lpServiceName", PT_PTRNOEDIT,(ULONG_PTR) szSvcName, szSvcName }, { "lpServiceType", PT_POINTER, (ULONG_PTR) guid, guid } }; FUNC_PARAM_HEADER paramsHeader = { 2, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_GetTypeByNameA ? GetTypeByNameA( (LPSTR) params[0].dwValue, (LPGUID) params[1].dwValue ) : GetTypeByNameW( (LPWSTR) params[0].dwValue, (LPGUID) params[1].dwValue )); if (i != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); ShowGUID ("*lpServiceType=", (LPGUID) params[1].dwValue); } else { ShowError (funcIndex, 0); } } break; } case ws_SetServiceA: case ws_SetServiceW: { DWORD dwStatusFlags; FUNC_PARAM params[] = { { "dwNameSpace", PT_ORDINAL, (ULONG_PTR) 0, aNameSpaces }, { "dwOperation", PT_ORDINAL, (ULONG_PTR) 0, aServiceOps }, { "dwFlags", PT_FLAGS, (ULONG_PTR) 0, aSvcFlags }, { "lpServiceInfo", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }, { "lpServiceAsnycInfo", PT_DWORD, (ULONG_PTR) 0, NULL }, { "lpdwStatusFlags", PT_PTRNOEDIT, (ULONG_PTR) &dwStatusFlags, &dwStatusFlags }, }; FUNC_PARAM_HEADER paramsHeader = { 6, funcIndex, params, NULL }; if (LetUserMungeParams (¶msHeader)) { i = (funcIndex == ws_SetServiceA ? SetServiceA( (DWORD) params[0].dwValue, (DWORD) params[1].dwValue, (DWORD) params[2].dwValue, (LPSERVICE_INFOA) params[3].dwValue, (LPSERVICE_ASYNC_INFO) params[4].dwValue, (LPDWORD) params[5].dwValue ) : SetServiceW( (DWORD) params[0].dwValue, (DWORD) params[1].dwValue, (DWORD) params[2].dwValue, (LPSERVICE_INFOW) params[3].dwValue, (LPSERVICE_ASYNC_INFO) params[4].dwValue, (LPDWORD) params[5].dwValue )); if (i != SOCKET_ERROR) { ShowStr (gszXxxSUCCESS, aFuncNames[funcIndex]); } else { ShowError (funcIndex, 0); } } break; } // case CloseHandl: // // break; // case DumpBuffer: // // break; } } void FAR ShowHostEnt( struct hostent *phe ) { DWORD i, j; ShowStr (" pHostEnt=x%x", phe); ShowStr (" ->h_name=%s", phe->h_name); for (i = 0; *(phe->h_aliases + i); i++) { ShowStr (" ->h_aliases[%d]=%s", i, *(phe->h_aliases + i)); } ShowStr (" ->h_addrtype=%x", (DWORD) phe->h_addrtype); ShowStr (" ->h_length=%x", (DWORD) phe->h_length); for (i = 0; *(phe->h_addr_list + i); i++) { char far *pAddr = *(phe->h_addr_list + i); if (phe->h_addrtype == AF_INET) { ShowStr (" ->h_addr_list[%d]=", i); ShowBytes (sizeof (DWORD) + lstrlenA (pAddr+4), pAddr, 2); } else { ShowStr (" ->h_addr_list[%d]=%s", i, *(phe->h_addr_list + i)); } } } void FAR ShowProtoEnt( struct protoent *ppe ) { DWORD i; ShowStr (" pProtoEnt=x%x", ppe); ShowStr (" ->p_name=%s", ppe->p_name); for (i = 0; *(ppe->p_aliases + i); i++) { ShowStr (" ->p_aliases[%d]=%s", i, *(ppe->p_aliases + i)); } ShowStr (" ->p_proto=%x", (DWORD) ppe->p_proto); } void FAR ShowServEnt( struct servent *pse ) { DWORD i; ShowStr (" pServEnt=x%x", pse); ShowStr (" ->s_name=%s", pse->s_name); for (i = 0; *(pse->s_aliases + i); i++) { ShowStr (" ->s_aliases[%d]=%s", i, *(pse->s_aliases + i)); } ShowStr (" ->s_port=%d (x%x)", (DWORD) pse->s_port, (DWORD) pse->s_port); ShowStr (" ->s_proto=%s", pse->s_proto); } void PASCAL QueueAsyncRequestInfo( PASYNC_REQUEST_INFO pAsyncReqInfo ) { pAsyncReqInfo->pNext = gpAsyncReqInfoList; gpAsyncReqInfoList = pAsyncReqInfo; } PASYNC_REQUEST_INFO PASCAL DequeueAsyncRequestInfo( HANDLE hRequest ) { PASYNC_REQUEST_INFO pAsyncReqInfo; for( pAsyncReqInfo = gpAsyncReqInfoList; pAsyncReqInfo && pAsyncReqInfo->hRequest != hRequest; pAsyncReqInfo = pAsyncReqInfo->pNext ); if (pAsyncReqInfo) { if (pAsyncReqInfo->pPrev) { pAsyncReqInfo->pPrev->pNext = pAsyncReqInfo->pNext; } else { gpAsyncReqInfoList = pAsyncReqInfo->pNext; } if (pAsyncReqInfo->pNext) { pAsyncReqInfo->pNext->pPrev = pAsyncReqInfo->pPrev; } } return pAsyncReqInfo; } void PASCAL ShowModBytes( DWORD dwSize, unsigned char far *lpc, char *pszTab, char *buf ) { DWORD dwSize2 = dwSize, i, j, k; strcpy (buf, pszTab); k = strlen (buf); for (i = 8; i < 36; i += 9) { buf[k + i] = ' '; for (j = 2; j < 9; j += 2) { char buf2[8] = "xx"; if (dwSize2) { sprintf (buf2, "%02x", (int) (*lpc)); dwSize2--; } buf[k + i - j] = buf2[0]; buf[k + i - j + 1] = buf2[1]; lpc++; } } k += 37; buf[k - 1] = ' '; lpc -= 16; for (i = 0; i < dwSize; i++) { buf[k + i] = aAscii[*(lpc+i)]; } buf[k + i] = 0; ShowStr (buf); } void UpdateResults( BOOL bBegin ) { // // In order to maximize speed, minimize flash, & have the // latest info in the edit control scrolled into view we // shrink the window down and hide it. Later, when all the // text has been inserted in the edit control, we show // the window (since window must be visible in order to // scroll caret into view), then tell it to scroll the caret // (at this point the window is still 1x1 so the painting // overhead is 0), and finally restore the control to it's // full size. In doing so we have zero flash and only 1 real // complete paint. Also put up the hourglass for warm fuzzies. // static RECT rect; static HCURSOR hCurSave; static int iNumBegins = 0; if (bBegin) { iNumBegins++; if (iNumBegins > 1) { return; } hCurSave = SetCursor (LoadCursor ((HINSTANCE)NULL, IDC_WAIT)); GetWindowRect (ghwndEdit, &rect); SetWindowPos( ghwndEdit, (HWND) NULL, 0, 0, 1, 1, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER | SWP_HIDEWINDOW ); } else { iNumBegins--; if (iNumBegins > 0) { return; } // // Do control restoration as described above // ShowWindow (ghwndEdit, SW_SHOW); #ifdef WIN32 SendMessage (ghwndEdit, EM_SCROLLCARET, 0, 0); #else SendMessage( ghwndEdit, EM_SETSEL, (WPARAM)0, (LPARAM) MAKELONG(0xfffd,0xfffe) ); #endif SetWindowPos( ghwndEdit, (HWND) NULL, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); SetCursor (hCurSave); } } void PASCAL ShowBytes( DWORD dwSize, LPVOID lp, DWORD dwNumTabs ) { char tabBuf[17] = ""; char buf[80]; DWORD i, j, k, dwNumDWORDs, dwMod4 = (DWORD)(((ULONG_PTR) lp) % 4); LPDWORD lpdw; unsigned char far *lpc = (unsigned char far *) lp; UpdateResults (TRUE); for (i = 0; i < dwNumTabs; i++) { strcat (tabBuf, szTab); } // // Special case for unaligned pointers (will fault on ppc/mips) // if (dwMod4) { DWORD dwNumUnalignedBytes = 4 - dwMod4, dwNumBytesToShow = (dwNumUnalignedBytes > dwSize ? dwSize : dwNumUnalignedBytes); ShowModBytes (dwNumBytesToShow, lpc, tabBuf, buf); lpc += dwNumUnalignedBytes; lpdw = (LPDWORD) lpc; dwSize -= dwNumBytesToShow; } else { lpdw = (LPDWORD) lp; } // // Dump full lines of four DWORDs in hex & corresponding ASCII // if (dwSize >= (4*sizeof(DWORD))) { dwNumDWORDs = dwSize / 4; // adjust from numBytes to num DWORDs for (i = 0; i < (dwNumDWORDs - (dwNumDWORDs%4)); i += 4) { sprintf ( buf, "%s%08lx %08lx %08lx %08lx ", tabBuf, *lpdw, *(lpdw+1), *(lpdw+2), *(lpdw+3) ); k = strlen (buf); for (j = 0; j < 16; j++) { buf[k + j] = aAscii[*(lpc + j)]; } buf[k + j] = 0; ShowStr (buf); lpdw += 4; lpc += 16; } } // // Special case for remaining bytes to dump (0 < n < 16) // if ((dwSize %= 16)) { ShowModBytes (dwSize, lpc, tabBuf, buf); } UpdateResults (FALSE); } void PASCAL ShowFlags( DWORD dwValue, char FAR *pszValueName, PLOOKUP pLookup ) { char buf[80]; DWORD i; wsprintf (buf, "%s=x%lx, ", pszValueName, dwValue); for (i = 0; dwValue && pLookup[i].lpszVal; i++) { if (dwValue & pLookup[i].dwVal) { if (buf[0] == 0) { lstrcpyA (buf, " "); } lstrcatA (buf, pLookup[i].lpszVal); lstrcat (buf, " "); dwValue &= ~pLookup[i].dwVal; if (lstrlen (buf) > 50) { // // We don't want strings getting so long that // they're going offscreen, so break them up. // ShowStr (buf); buf[0] = 0; } } } if (dwValue) { lstrcat (buf, ""); } if (buf[0]) { ShowStr (buf); } } LPSTR PASCAL GetStringFromOrdinalValue( DWORD dwValue, PLOOKUP pLookup ) { DWORD i; for (i = 0; pLookup[i].lpszVal && dwValue != pLookup[i].dwVal; i++); return (pLookup[i].lpszVal ? pLookup[i].lpszVal : gszUnknown); } VOID PASCAL ShowGUID( char *pszProlog, GUID *pGuid ) { ShowStr( "%s%08x %04x %04x %02x%02x%02x%02x%02x%02x%02x%02x", (ULONG_PTR) pszProlog, (DWORD) pGuid->Data1, (DWORD) pGuid->Data2, (DWORD) pGuid->Data3, (DWORD) pGuid->Data4[0], (DWORD) pGuid->Data4[1], (DWORD) pGuid->Data4[2], (DWORD) pGuid->Data4[3], (DWORD) pGuid->Data4[4], (DWORD) pGuid->Data4[5], (DWORD) pGuid->Data4[6], (DWORD) pGuid->Data4[7] ); // // Dump the GUID in a form that can be copied & pasted into other // API params // { LPBYTE p = (LPBYTE) pGuid; ShowStr( " (%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x)", (DWORD) *p, (DWORD) *(p + 1), (DWORD) *(p + 2), (DWORD) *(p + 3), (DWORD) *(p + 4), (DWORD) *(p + 5), (DWORD) *(p + 6), (DWORD) *(p + 7), (DWORD) *(p + 8), (DWORD) *(p + 9), (DWORD) *(p + 10), (DWORD) *(p + 11), (DWORD) *(p + 12), (DWORD) *(p + 13), (DWORD) *(p + 14), (DWORD) *(p + 15) ); } } VOID PASCAL ShowProtoInfo( LPWSAPROTOCOL_INFOA pInfo, DWORD dwIndex, BOOL bAscii ) { char szProtoInfoN[20], buf[40]; if (dwIndex == 0xffffffff) { wsprintf (szProtoInfoN, " protoInfo"); } else { wsprintf (szProtoInfoN, " protoInfo[%d].", dwIndex); } wsprintf (buf, "%sdwServiceFlags", szProtoInfoN); ShowFlags (pInfo->dwServiceFlags1, buf, aServiceFlags); ShowStr( "%sdwServiceFlags2=x%x", szProtoInfoN, pInfo->dwServiceFlags2 ); ShowStr( "%sdwServiceFlags3=x%x", szProtoInfoN, pInfo->dwServiceFlags3 ); ShowStr( "%sdwServiceFlags4=x%x", szProtoInfoN, pInfo->dwServiceFlags4 ); wsprintf (buf, "%sdwProviderFlags", szProtoInfoN); ShowFlags (pInfo->dwProviderFlags, buf, aProviderFlags); wsprintf (buf, "%sProviderId=", szProtoInfoN); ShowGUID (buf, &pInfo->ProviderId); ShowStr( "%sdwCatalogEntryId=x%x", szProtoInfoN, pInfo->dwCatalogEntryId ); ShowStr( "%sProtocolChain.ChainLen=x%x", szProtoInfoN, (DWORD) pInfo->ProtocolChain.ChainLen ); ShowStr( "%sProtocolChain.ChainEntries=", szProtoInfoN ); ShowBytes( sizeof (DWORD) * MAX_PROTOCOL_CHAIN, pInfo->ProtocolChain.ChainEntries, 2 ); ShowStr( "%siVersion=x%x", szProtoInfoN, (DWORD) pInfo->iVersion ); ShowStr( "%siAddressFamily=%d, %s", szProtoInfoN, (DWORD) pInfo->iAddressFamily, GetStringFromOrdinalValue( (DWORD) pInfo->iAddressFamily, aAddressFamilies ) ); ShowStr( "%siMaxSockAddr=%d", szProtoInfoN, (DWORD) pInfo->iMaxSockAddr ); ShowStr( "%siMinSockAddr=%d", szProtoInfoN, (DWORD) pInfo->iMinSockAddr ); ShowStr( "%siSocketType=%d, %s", szProtoInfoN, (DWORD) pInfo->iSocketType, GetStringFromOrdinalValue( (DWORD) pInfo->iSocketType, aSocketTypes ) ); ShowStr( "%siProtocol=%d (x%x)", // ought to be flags??? szProtoInfoN, (DWORD) pInfo->iProtocol, (DWORD) pInfo->iProtocol ); ShowStr( "%siProtocolMaxOffset=%d", szProtoInfoN, (DWORD) pInfo->iProtocolMaxOffset ); ShowStr( "%siNetworkByteOrder=%d, %s", szProtoInfoN, (DWORD) pInfo->iNetworkByteOrder, GetStringFromOrdinalValue( (DWORD) pInfo->iNetworkByteOrder, aNetworkByteOrders ) ); ShowStr( "%siSecurityScheme=x%x", szProtoInfoN, (DWORD) pInfo->iSecurityScheme ); ShowStr( "%sdwMessageSize=x%x", szProtoInfoN, (DWORD) pInfo->dwMessageSize ); ShowStr( "%sdwProviderReserved=x%x", szProtoInfoN, (DWORD) pInfo->dwMessageSize ); if (bAscii) { ShowStr( "%sszProtocol=%s", szProtoInfoN, pInfo->szProtocol ); ShowBytes( (lstrlenA (pInfo->szProtocol) + 1) * sizeof(CHAR), pInfo->szProtocol, 2 ); } else { ShowStr( "%sszProtocol=%ws", szProtoInfoN, pInfo->szProtocol ); ShowBytes( (lstrlenW (((LPWSAPROTOCOL_INFOW) pInfo)->szProtocol) + 1) * sizeof(WCHAR), pInfo->szProtocol, 2 ); } }