-
Notifications
You must be signed in to change notification settings - Fork 321
Expand file tree
/
Copy pathIHttpServerGetTraceContext.cpp
More file actions
154 lines (133 loc) · 4.3 KB
/
IHttpServerGetTraceContext.cpp
File metadata and controls
154 lines (133 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// <Snippet1>
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create a pointer for the global server interface.
IHttpServer * g_pHttpServer = NULL;
// Create the module's global class.
class MyGlobalModule : public CGlobalModule
{
public:
GLOBAL_NOTIFICATION_STATUS
OnGlobalPreBeginRequest(
IN IPreBeginRequestProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Test for errors.
if (NULL != g_pHttpServer)
{
// Retrieve the trace context.
IHttpTraceContext * pTraceContext = g_pHttpServer->GetTraceContext();
// Test for errors.
if (NULL != pTraceContext)
{
// Retrieve the trace activity GUID.
LPCGUID pTraceGuid = pTraceContext->GetTraceActivityId();
// Test for errors.
if (NULL != pTraceGuid)
{
// Create a string buffer for the converted Unicode GUID.
WCHAR pwszGuid[256] = L"";
// Convert the GUID to a Unicode string.
int cbBytes = StringFromGUID2(*pTraceGuid, pwszGuid, 256);
// Allocate space for an ANSI string.
PSTR pszGuid =
(PSTR) pProvider->GetHttpContext()->AllocateRequestMemory(
(DWORD)cbBytes);
// Convert the Unicode string to an ANSI string.
wcstombs_s((size_t*)&cbBytes,pszGuid,cbBytes,pwszGuid,cbBytes);
// Test for errors.
if (cbBytes > 0)
{
// Create an array of strings.
LPCSTR szBuffer[2] = {"Trace Activity ID",pszGuid};
// Write the strings to the Event Viewer.
WriteEventViewerLog(szBuffer,2);
}
}
}
}
// Return processing to the pipeline.
return GL_NOTIFICATION_CONTINUE;
}
VOID Terminate()
{
// Remove the class from memory.
delete this;
}
MyGlobalModule()
{
// Open a handle to the Event Viewer.
m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
}
~MyGlobalModule()
{
// Test whether the handle for the Event Viewer is open.
if (NULL != m_hEventLog)
{
// Close the handle to the Event Viewer.
DeregisterEventSource( m_hEventLog );
m_hEventLog = NULL;
}
}
private:
// Create a handle for the event viewer.
HANDLE m_hEventLog;
// Define a method that writes to the Event Viewer.
BOOL WriteEventViewerLog(LPCSTR szBuffer[], WORD wNumStrings)
{
// Test whether the handle for the Event Viewer is open.
if (NULL != m_hEventLog)
{
// Write any strings to the Event Viewer and return.
return ReportEvent(
m_hEventLog,
EVENTLOG_INFORMATION_TYPE,
0, 0, NULL, wNumStrings,
0, szBuffer, NULL );
}
return FALSE;
}
};
// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER( dwServerVersion );
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Create an instance of the global module class.
MyGlobalModule * pGlobalModule = new MyGlobalModule;
// Test for an error.
if (NULL == pGlobalModule)
{
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
// Store the pointer for the global server interface.
g_pHttpServer = pGlobalInfo;
// Set the global notifications and exit.
hr = pModuleInfo->SetGlobalNotifications(
pGlobalModule, GL_PRE_BEGIN_REQUEST );
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// Set the global priority.
hr = pModuleInfo->SetPriorityForGlobalNotification(
GL_PRE_BEGIN_REQUEST,PRIORITY_ALIAS_HIGH);
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
return S_OK;
}
// </Snippet1>