mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
596 lines
10 KiB
596 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tpstress.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the
|
|
|
|
Author:
|
|
|
|
Dan Knudson (DanKn) 05-May-1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "windows.h"
|
|
#include "malloc.h"
|
|
#include "string.h"
|
|
#include "tapi.h"
|
|
#include "trapper.h"
|
|
|
|
|
|
typedef struct _INSTANCE_INFO
|
|
{
|
|
LONG lExpectedReplyID;
|
|
|
|
BOOL bExpectedMsgReceived;
|
|
|
|
} INSTANCE_INFO, *PINSTANCE_INFO;
|
|
|
|
|
|
#define LOW_API_VERSION 0x10003
|
|
#define HIGH_API_VERSION 0x10005
|
|
|
|
HANDLE ghDll;
|
|
LOGPROC gpfnLog;
|
|
|
|
char gszDestAddress[64] = "20110";
|
|
|
|
#ifdef WIN32
|
|
|
|
#define __export
|
|
#define __loadds
|
|
|
|
BOOL
|
|
WINAPI
|
|
DllMain(
|
|
HANDLE hDLL,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
|
|
ghDll = hDLL;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
case DLL_THREAD_ATTACH:
|
|
case DLL_THREAD_DETACH:
|
|
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#else
|
|
|
|
int
|
|
FAR
|
|
PASCAL
|
|
LibMain(
|
|
HANDLE hInstance,
|
|
WORD wDataSegment,
|
|
WORD wHeapSize,
|
|
LPSTR lpszCmdLine
|
|
)
|
|
{
|
|
ghDll = hInstance;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
VOID
|
|
FAR
|
|
PASCAL
|
|
__loadds
|
|
__export
|
|
TapiCallback(
|
|
DWORD hDevice,
|
|
DWORD dwMsg,
|
|
DWORD dwCallbackInstance,
|
|
DWORD dwParam1,
|
|
DWORD dwParam2,
|
|
DWORD dwParam3
|
|
)
|
|
{
|
|
(*gpfnLog)(
|
|
3,
|
|
"TapiCallback: enter, dwMsg=x%lx, dwCbInst=%ld, dwP1=x%lx",
|
|
dwMsg,
|
|
dwCallbackInstance,
|
|
dwParam1
|
|
);
|
|
|
|
switch (dwMsg)
|
|
{
|
|
case LINE_REPLY:
|
|
{
|
|
PINSTANCE_INFO pInstInfo = (PINSTANCE_INFO) dwCallbackInstance;
|
|
|
|
|
|
if (dwParam1 == (DWORD) pInstInfo->lExpectedReplyID)
|
|
{
|
|
pInstInfo->bExpectedMsgReceived = TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
} // switch
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
SuiteInit(
|
|
LOGPROC pfnLog
|
|
)
|
|
{
|
|
gpfnLog = pfnLog;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
SuiteShutdown(
|
|
void
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
SuiteAbout(
|
|
HWND hwndOwner
|
|
)
|
|
{
|
|
MessageBox (hwndOwner, "xxx", "About the Tapi Stress Suite", MB_OK);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
SuiteConfig(
|
|
HWND hwndOwner
|
|
)
|
|
{
|
|
MessageBox (hwndOwner, "xxx", "Tapi Stress Suite Config", MB_OK);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
MakeNCalls(
|
|
DWORD dwNumCalls
|
|
)
|
|
{
|
|
MSG msg;
|
|
LONG lResult;
|
|
BOOL bFoundESP = FALSE, bResult = TRUE;
|
|
DWORD dwDeviceID, dwAPIVersion, dwNumDevs, i;
|
|
HCALL hCall;
|
|
HLINE hLine;
|
|
HLINEAPP hLineApp;
|
|
LPLINEDEVCAPS pLineDevCaps;
|
|
PINSTANCE_INFO pInstInfo;
|
|
LINEEXTENSIONID extensionID;
|
|
|
|
|
|
Sleep (1000); // give other apps time to play
|
|
|
|
pInstInfo = LocalAlloc (LPTR, sizeof (INSTANCE_INFO));
|
|
|
|
lResult = lineInitialize(
|
|
&hLineApp,
|
|
ghDll,
|
|
TapiCallback,
|
|
"tpstress.dll",
|
|
&dwNumDevs
|
|
);
|
|
|
|
if (lResult)
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: lineInitialize failed, err=x%lx", lResult);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//
|
|
// Find an ESP line device
|
|
//
|
|
|
|
pLineDevCaps = (LPLINEDEVCAPS) LocalAlloc (LPTR, 1024);
|
|
|
|
for (dwDeviceID = 0; ((dwDeviceID < dwNumDevs) && !bFoundESP); dwDeviceID++)
|
|
{
|
|
char *pszProviderInfo;
|
|
|
|
|
|
pLineDevCaps->dwTotalSize = 1024;
|
|
|
|
lResult = lineNegotiateAPIVersion(
|
|
hLineApp,
|
|
dwDeviceID,
|
|
LOW_API_VERSION,
|
|
HIGH_API_VERSION,
|
|
&dwAPIVersion,
|
|
&extensionID
|
|
);
|
|
|
|
lResult = lineGetDevCaps(
|
|
hLineApp,
|
|
dwDeviceID,
|
|
dwAPIVersion,
|
|
0,
|
|
pLineDevCaps
|
|
);
|
|
|
|
pszProviderInfo = ((char *) pLineDevCaps) +
|
|
pLineDevCaps->dwProviderInfoOffset;
|
|
|
|
try
|
|
{
|
|
if (strstr (pszProviderInfo, "ESP"))
|
|
{
|
|
bFoundESP = TRUE;
|
|
}
|
|
}
|
|
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
|
|
{
|
|
}
|
|
}
|
|
|
|
LocalFree (LocalHandle (pLineDevCaps));
|
|
|
|
if (dwDeviceID == dwNumDevs)
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: couldn't locate ESP line");
|
|
|
|
bResult = FALSE;
|
|
|
|
goto MakeNCalls_lineShutdown;
|
|
}
|
|
|
|
lResult = lineOpen(
|
|
hLineApp,
|
|
dwDeviceID,
|
|
&hLine,
|
|
dwAPIVersion,
|
|
0,
|
|
(DWORD) pInstInfo,
|
|
LINECALLPRIVILEGE_NONE,
|
|
0,
|
|
(LPLINECALLPARAMS) NULL
|
|
);
|
|
|
|
if (lResult)
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: lineOpen failed, err=x%lx", lResult);
|
|
|
|
bResult = FALSE;
|
|
|
|
goto MakeNCalls_lineShutdown;
|
|
}
|
|
|
|
for (i = 0; i < dwNumCalls; i++)
|
|
{
|
|
if ((lResult = lineMakeCall(
|
|
hLine,
|
|
&hCall,
|
|
gszDestAddress,
|
|
0,
|
|
(LPLINECALLPARAMS) NULL
|
|
|
|
)) > 0)
|
|
{
|
|
//
|
|
// Wait for the make call request to complete
|
|
//
|
|
|
|
pInstInfo->lExpectedReplyID = lResult;
|
|
|
|
pInstInfo->bExpectedMsgReceived = FALSE;
|
|
|
|
while (!pInstInfo->bExpectedMsgReceived)
|
|
{
|
|
GetMessage (&msg, NULL, 0, 0);
|
|
DispatchMessage (&msg);
|
|
}
|
|
|
|
|
|
//
|
|
// Now drop the call
|
|
//
|
|
|
|
if ((lResult = lineDrop (hCall, NULL, 0)) > 0)
|
|
{
|
|
//
|
|
// Wait for the drop request to complete
|
|
//
|
|
|
|
pInstInfo->lExpectedReplyID = lResult;
|
|
|
|
pInstInfo->bExpectedMsgReceived = FALSE;
|
|
|
|
while (!pInstInfo->bExpectedMsgReceived)
|
|
{
|
|
GetMessage (&msg, NULL, 0, 0);
|
|
DispatchMessage (&msg);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Nuke the call handle
|
|
//
|
|
|
|
lResult = lineDeallocateCall (hCall);
|
|
}
|
|
else
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: lineMakeCall failed, err=x%lx", lResult);
|
|
}
|
|
}
|
|
|
|
if ((lResult = lineClose (hLine)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: lineClose failed, err=x%lx", lResult);
|
|
|
|
bResult = FALSE;
|
|
}
|
|
|
|
MakeNCalls_lineShutdown:
|
|
|
|
if ((lResult = lineShutdown (hLineApp)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: lineShutdown failed, err=x%lx", lResult);
|
|
|
|
bResult = FALSE;
|
|
}
|
|
|
|
LocalFree (LocalHandle (pInstInfo));
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
Test1(
|
|
HINSTANCE hAppInst
|
|
)
|
|
/*++
|
|
|
|
Makes a voice call on an ESP line device
|
|
|
|
--*/
|
|
{
|
|
return (MakeNCalls (1));
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
Test2(
|
|
HINSTANCE hAppInst
|
|
)
|
|
/*++
|
|
|
|
Makes 10 voice calls on an ESP line device
|
|
|
|
--*/
|
|
{
|
|
return (MakeNCalls (10));
|
|
}
|
|
|
|
|
|
BOOL
|
|
FAR
|
|
PASCAL
|
|
__export
|
|
Test3(
|
|
HINSTANCE hAppInst
|
|
)
|
|
/*++
|
|
|
|
Does a init, open, close, & shutdown on an ESP phone device
|
|
|
|
--*/
|
|
{
|
|
BOOL bResult = TRUE, bFoundESP = FALSE;
|
|
LONG lResult;
|
|
DWORD dwNumPhones, dwDeviceID, dwGain, dwAPIVersion,
|
|
dwPrivilege = PHONEPRIVILEGE_OWNER;
|
|
HPHONE hPhone;
|
|
HPHONEAPP hPhoneApp;
|
|
LPPHONECAPS pPhoneCaps;
|
|
PHONEEXTENSIONID extensionID;
|
|
|
|
//
|
|
// Init TAPI
|
|
//
|
|
|
|
if ((lResult = phoneInitialize(
|
|
&hPhoneApp,
|
|
ghDll,
|
|
TapiCallback,
|
|
"tpstress.dll",
|
|
&dwNumPhones
|
|
)))
|
|
{
|
|
(*gpfnLog)(1, "phoneInitialize ret'd x%x", lResult);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//
|
|
// Try to find an ESP phone device
|
|
//
|
|
|
|
pPhoneCaps = (LPPHONECAPS) LocalAlloc (LPTR, 1024);
|
|
|
|
for(
|
|
dwDeviceID = 0;
|
|
((dwDeviceID < dwNumPhones) && !bFoundESP);
|
|
dwDeviceID++
|
|
)
|
|
{
|
|
char *pszProviderInfo;
|
|
|
|
|
|
pPhoneCaps->dwTotalSize = 1024;
|
|
|
|
lResult = phoneNegotiateAPIVersion(
|
|
hPhoneApp,
|
|
dwDeviceID,
|
|
LOW_API_VERSION,
|
|
HIGH_API_VERSION,
|
|
&dwAPIVersion,
|
|
&extensionID
|
|
);
|
|
|
|
lResult = phoneGetDevCaps(
|
|
hPhoneApp,
|
|
dwDeviceID,
|
|
dwAPIVersion,
|
|
0,
|
|
pPhoneCaps
|
|
);
|
|
|
|
pszProviderInfo = ((char *) pPhoneCaps) +
|
|
pPhoneCaps->dwProviderInfoOffset;
|
|
|
|
try
|
|
{
|
|
if (strstr (pszProviderInfo, "ESP"))
|
|
{
|
|
bFoundESP = TRUE;
|
|
}
|
|
}
|
|
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
|
|
{
|
|
}
|
|
}
|
|
|
|
LocalFree (LocalHandle (pPhoneCaps));
|
|
|
|
if (dwDeviceID == dwNumPhones)
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: couldn't locate ESP phone");
|
|
|
|
bResult = FALSE;
|
|
|
|
goto Test3_phoneShutdown;
|
|
}
|
|
|
|
|
|
//
|
|
// Open the ESP phone device & make some basic requests (if we can't
|
|
// open as owner try opening as monitor)
|
|
//
|
|
|
|
if ((lResult = phoneOpen(
|
|
hPhoneApp,
|
|
dwDeviceID,
|
|
&hPhone,
|
|
dwAPIVersion,
|
|
0,
|
|
0,
|
|
dwPrivilege
|
|
)))
|
|
{
|
|
dwPrivilege = PHONEPRIVILEGE_MONITOR;
|
|
|
|
if ((lResult != PHONEERR_INVALPRIVILEGE) ||
|
|
|
|
(lResult = phoneOpen(
|
|
hPhoneApp,
|
|
dwDeviceID,
|
|
&hPhone,
|
|
dwAPIVersion,
|
|
0, // dwExtVersion
|
|
0, // dwCallbackInst
|
|
dwPrivilege
|
|
)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: phoneOpen ret'd x%x", lResult);
|
|
|
|
bResult = FALSE;
|
|
|
|
goto Test3_phoneShutdown;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if ((lResult = phoneGetGain(
|
|
hPhone,
|
|
PHONEHOOKSWITCHDEV_HANDSET,
|
|
&dwGain
|
|
)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: phoneGetDisplay ret'd x%x", lResult);
|
|
|
|
bResult = FALSE;
|
|
|
|
goto Test3_phoneShutdown;
|
|
}
|
|
|
|
|
|
//
|
|
// Clean up
|
|
//
|
|
|
|
if ((lResult = phoneClose (hPhone)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: phoneClose ret'd x%x", lResult);
|
|
|
|
bResult = FALSE;
|
|
}
|
|
|
|
Test3_phoneShutdown:
|
|
|
|
if ((lResult = phoneShutdown (hPhoneApp)))
|
|
{
|
|
(*gpfnLog)(0, " TPSTRESS: phoneShutdown ret'd x%x", lResult);
|
|
|
|
bResult = FALSE;
|
|
}
|
|
|
|
return bResult;
|
|
}
|