windows-nt/Source/XPSP1/NT/drivers/wdm/input/tabletpc/wintrace/client.c
2020-09-26 16:20:57 +08:00

275 lines
6 KiB
C

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
client.c
Abstract:
This module contains the message client code.
Author:
Michael Tsang (MikeTs) 25-May-2000
Environment:
User mode
Revision History:
--*/
#include "pch.h"
//
// Global Data
//
DWORD gdwfWinTrace = 0;
CLIENTINFO gClientInfo = {0};
char gszClientName[MAX_CLIENTNAME_LEN] = {0};
HANDLE ghTraceMutex = NULL;
HANDLE ghClientThread = (HANDLE)-1;
HCLIENT ghClient = 0;
PSZ gpszProcName = NULL;
RPC_BINDING_HANDLE ghTracerBinding = NULL;
/*++
@doc INTERNAL
@func VOID | ClientThread | Client thread procedure.
@parm IN PSZ | pszClientName | Points to client name string.
@rvalue None.
--*/
VOID __cdecl
ClientThread(
IN PSZ pszClientName
)
{
WTTRACEPROC("ClientThread", 1)
BOOL fDone = FALSE;
RPC_STATUS status;
unsigned char *StringBinding = NULL;
WTENTER(("(ClientName=%s)\n", pszClientName));
while (!fDone)
{
if ((status = RpcStringBindingCompose(NULL,
TEXT("ncalrpc"),
NULL,
NULL,
NULL,
&StringBinding)) != RPC_S_OK)
{
WTERRPRINT(("RpcStringBindingCompose failed (status=%d)\n",
status));
break;
}
else if ((status = RpcBindingFromStringBinding(StringBinding,
&ghTracerBinding)) !=
RPC_S_OK)
{
WTERRPRINT(("RpcBindingFromStringBinding failed (status=%d)\n",
status));
break;
}
else if ((status = RpcBindingSetAuthInfo(ghTracerBinding,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_AUTHN_WINNT,
NULL,
0)) != RPC_S_OK)
{
WTERRPRINT(("RpcBindingSetAuthInfo failed (status=%d)\n", status));
break;
}
else
{
RPC_TRY("WTRegisterClient",
ghClient = WTRegisterClient(ghTracerBinding,
pszClientName));
if (ghClient == 0)
{
WTWARNPRINT(("Failed to register client \"%s\", try again later...\n",
pszClientName));
}
else
{
//
// Service server callback requests. This call does not
// come back until the server terminates the link.
//
gdwfWinTrace |= WTF_CLIENT_READY;
RPC_TRY("WTDispatchServerRequests",
WTDispatchServerRequests(ghTracerBinding, ghClient));
gdwfWinTrace &= ~WTF_CLIENT_READY;
}
}
if (StringBinding != NULL)
{
RpcStringFree(&StringBinding);
StringBinding = NULL;
}
if (gdwfWinTrace & WTF_TERMINATING)
{
break;
}
Sleep(TIMEOUT_WAIT_SERVER);
}
_endthread();
WTEXIT(("!\n"));
return;
} //ClientThread
/*++
@doc EXTERNAL
@func VOID | WTGetClientInfo | Get client info.
@parm IN PCLIENTINFO | ClientInfo | Points to the buffer to hold client
info.
@rvalue None.
--*/
VOID
WTGetClientInfo(
IN PCLIENTINFO ClientInfo
)
{
WTTRACEPROC("WTGetClientInfo", 1)
WTENTER(("(ClientInfo=%p)\n", ClientInfo));
*ClientInfo = gClientInfo;
WTEXIT(("!\n"));
return;
} //WTGetClientInfo
/*++
@doc EXTERNAL
@func VOID | WTSetClientInfo | Set client info.
@parm IN PCLIENTINFO | ClientInfo | Points to the client info.
info.
@rvalue None.
--*/
VOID
WTSetClientInfo(
IN PCLIENTINFO ClientInfo
)
{
WTTRACEPROC("WTSetClientInfo", 1)
WTENTER(("(ClientInfo=%p)\n", ClientInfo));
gClientInfo = *ClientInfo;
WTEXIT(("!\n"));
return;
} //WTSetClientInfo
/*++
@doc INTERNAL
@func PTRIGPT | FindTrigPt |
Determine if the given procedure is a trigger point.
@parm IN PSZ | pszProcName | Points to procedure name string.
@rvalue SUCCESS | Returns the trigger point found.
@rvalue FAILURE | Returns NULL.
--*/
PTRIGPT LOCAL
FindTrigPt(
IN PSZ pszProcName
)
{
WTTRACEPROC("FindTrigPt", 3)
PTRIGPT TrigPt = NULL;
int i;
WTENTER(("(ProcName=%s)\n", pszProcName));
for (i = 0; i < NUM_TRIGPTS; ++i)
{
if ((gClientInfo.TrigPts[i].dwfTrigPt &
(TRIGPT_TRACE_ENABLED | TRIGPT_BREAK_ENABLED)) &&
strstr(pszProcName, gClientInfo.TrigPts[i].szProcName))
{
TrigPt = &gClientInfo.TrigPts[i];
break;
}
}
WTEXIT(("=%p\n", TrigPt));
return TrigPt;
} //FindTrigPt
/*++
@doc EXTERNAL
@func void __RPC_FAR * | MIDL_alloc | MIDL allocate.
@parm IN size_t | len | size of allocation.
@rvalue SUCCESS | Returns the pointer to the memory allocated.
@rvalue FAILURE | Returns NULL.
--*/
void __RPC_FAR * __RPC_USER
MIDL_alloc(
IN size_t len
)
{
WTTRACEPROC("MIDL_alloc", 5)
void __RPC_FAR *ptr;
WTENTER(("(len=%d)\n", len));
ptr = malloc(len);
WTEXIT(("=%p\n", ptr));
return ptr;
} //MIDL_alloc
/*++
@doc EXTERNAL
@func void | MIDL_free | MIDL free.
@parm IN void __PRC_FAR * | ptr | Points to the memory to be freed.
@rvalue None.
--*/
void __RPC_USER
MIDL_free(
IN void __RPC_FAR *ptr
)
{
WTTRACEPROC("MIDL_free", 5)
WTENTER(("(ptr=%p)\n", ptr));
free(ptr);
WTEXIT(("!\n"));
return;
} //MIDL_free