8846 lines
265 KiB
C
8846 lines
265 KiB
C
/*++ 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <io.h>
|
|
#include <commdlg.h>
|
|
#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) "<none>"
|
|
);
|
|
|
|
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 "<none>" 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, "<unknown flag(s)>");
|
|
}
|
|
|
|
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
|
|
);
|
|
}
|
|
}
|