|
|
/*++
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
|