Add Windows SDK sample code to deps/third_party/winsdk_samples_v71

TBR=kjellander
Review URL: https://webrtc-codereview.appspot.com/939023

git-svn-id: http://webrtc.googlecode.com/svn/deps/third_party/winsdk_samples_v71@3145 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/Samples/multimedia/directshow/baseclasses/perflog.cpp b/Samples/multimedia/directshow/baseclasses/perflog.cpp
new file mode 100644
index 0000000..e642538
--- /dev/null
+++ b/Samples/multimedia/directshow/baseclasses/perflog.cpp
@@ -0,0 +1,347 @@
+//------------------------------------------------------------------------------

+// File: perflog.cpp

+//

+// Desc: Macros for DirectShow performance logging.

+//

+// Copyright (c) 1992-2001 Microsoft Corporation.  All rights reserved.

+//------------------------------------------------------------------------------

+

+#pragma warning (disable:4201)

+

+#include <streams.h>

+#include <windows.h>

+#include <tchar.h>

+#include <winperf.h>

+#include <wmistr.h>

+#include <evntrace.h>

+#include <strsafe.h>

+#include "perflog.h"

+

+//

+// Local function prototypes.

+//

+

+ULONG

+WINAPI

+PerflogCallback (

+    WMIDPREQUESTCODE RequestCode,

+    __in PVOID Context,

+    __out ULONG* BufferSize,

+    __in PVOID Buffer

+    );

+

+//

+// Event tracing function pointers.

+// We have to do this to run on down-level platforms.

+//

+

+#ifdef UNICODE

+

+ULONG

+(__stdcall * _RegisterTraceGuids) (

+    __in IN WMIDPREQUEST RequestAddress,

+    __in IN PVOID RequestContext,

+    IN LPCGUID ControlGuid,

+    IN ULONG GuidCount,

+    __in IN PTRACE_GUID_REGISTRATION TraceGuidReg,

+    IN LPCWSTR MofImagePath,

+    IN LPCWSTR MofResourceName,

+    OUT PTRACEHANDLE RegistrationHandle

+    );

+

+#define REGISTERTRACEGUIDS_NAME "RegisterTraceGuidsW"

+

+#else

+

+ULONG

+(__stdcall * _RegisterTraceGuids) (

+    __in IN WMIDPREQUEST RequestAddress,

+    __in IN PVOID RequestContext,

+    IN LPCGUID ControlGuid,

+    IN ULONG GuidCount,

+    __in IN PTRACE_GUID_REGISTRATION TraceGuidReg,

+    IN LPCSTR MofImagePath,

+    IN LPCSTR MofResourceName,

+    __out OUT PTRACEHANDLE RegistrationHandle

+    );

+

+#define REGISTERTRACEGUIDS_NAME "RegisterTraceGuidsA"

+

+#endif

+

+ULONG

+(__stdcall * _UnregisterTraceGuids) (

+    TRACEHANDLE RegistrationHandle

+    );

+

+TRACEHANDLE

+(__stdcall * _GetTraceLoggerHandle) (

+    __in PVOID Buffer

+    );

+

+UCHAR

+(__stdcall * _GetTraceEnableLevel) (

+    TRACEHANDLE TraceHandle

+    );

+

+ULONG

+(__stdcall * _GetTraceEnableFlags) (

+    TRACEHANDLE TraceHandle

+    );

+

+ULONG

+(__stdcall * _TraceEvent) (

+    TRACEHANDLE TraceHandle,

+    __in PEVENT_TRACE_HEADER EventTrace

+    );

+

+HINSTANCE _Advapi32;

+

+//

+// Global variables.

+//

+

+BOOL EventTracingAvailable=FALSE;

+ULONG PerflogEnableFlags;

+UCHAR PerflogEnableLevel;

+ULONG PerflogModuleLevel = 0;

+void (*OnStateChanged)(void);

+TRACEHANDLE PerflogTraceHandle=NULL;

+TRACEHANDLE PerflogRegHandle;

+

+// The Win32 wsprintf() function writes a maximum of 1024 characters to it's output buffer.

+// See the documentation for wsprintf()'s lpOut parameter for more information.

+const INT iDEBUGINFO = 1024; // Used to format strings

+

+//

+// This routine initializes performance logging.

+// It should be called from DllMain().

+//

+

+

+VOID

+PerflogReadModuleLevel(

+    HINSTANCE hInstance

+    )

+{

+    LONG lReturn;                   // Create key return value

+    TCHAR szInfo[iDEBUGINFO];       // Constructs key names

+    TCHAR szFullName[iDEBUGINFO];   // Load the full path and module name

+    HKEY hModuleKey;                // Module key handle

+    LPTSTR pName;                   // Searches from the end for a backslash

+    DWORD dwKeySize, dwKeyType, dwKeyValue;

+

+    DWORD dwSize = GetModuleFileName(

+        (hInstance ? hInstance : GetModuleHandle( NULL )),

+        szFullName,

+        iDEBUGINFO );

+

+    if (0 == dwSize || iDEBUGINFO == dwSize) {

+        return;

+    }

+

+    pName = _tcsrchr(szFullName,'\\');

+    if (pName == NULL) {

+        pName = szFullName;

+    } else {

+        pName++;

+    }

+

+    /* Construct the base key name */

+    (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("SOFTWARE\\Debug\\%s"),pName);

+

+    /* Open the key for this module */

+    lReturn =

+        RegOpenKeyEx(

+            HKEY_LOCAL_MACHINE,   // Handle of an open key

+            szInfo,               // Address of subkey name

+            (DWORD) 0,            // Reserved value

+            KEY_QUERY_VALUE,      // Desired security access

+            &hModuleKey );        // Opened handle buffer

+

+    if (lReturn != ERROR_SUCCESS) {

+        return;

+    }

+

+    dwKeySize = sizeof(DWORD);

+    lReturn = RegQueryValueEx(

+        hModuleKey,                 // Handle to an open key

+        TEXT("PERFLOG"),

+        NULL,                       // Reserved field

+        &dwKeyType,                 // Returns the field type

+        (LPBYTE) &dwKeyValue,       // Returns the field's value

+        &dwKeySize );               // Number of bytes transferred

+

+    if ((lReturn == ERROR_SUCCESS) && (dwKeyType == REG_DWORD))

+    {

+        PerflogModuleLevel = dwKeyValue;

+    }

+

+    RegCloseKey(hModuleKey);

+}

+

+BOOL PerflogInitIfEnabled(

+    IN HINSTANCE hInstance,

+    __in IN PPERFLOG_LOGGING_PARAMS LogParams

+    )

+{

+    PerflogReadModuleLevel( hInstance );

+    if (PerflogModuleLevel)

+    {

+        return PerflogInitialize( LogParams );

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+BOOL

+PerflogInitialize (

+    __in IN PPERFLOG_LOGGING_PARAMS LogParams

+    )

+{

+    ULONG status;

+

+    //

+    // If we're running on a recent-enough platform, this will get

+    // pointers to the event tracing routines.

+    //

+

+    _Advapi32 = GetModuleHandle (_T("ADVAPI32.DLL"));

+    if (_Advapi32 == NULL) {

+        return FALSE;

+    }

+

+    *((FARPROC*) &_RegisterTraceGuids) = GetProcAddress (_Advapi32, REGISTERTRACEGUIDS_NAME);

+    *((FARPROC*) &_UnregisterTraceGuids) = GetProcAddress (_Advapi32, "UnregisterTraceGuids");

+    *((FARPROC*) &_GetTraceLoggerHandle) = GetProcAddress (_Advapi32, "GetTraceLoggerHandle");

+    *((FARPROC*) &_GetTraceEnableLevel) = GetProcAddress (_Advapi32, "GetTraceEnableLevel");

+    *((FARPROC*) &_GetTraceEnableFlags) = GetProcAddress (_Advapi32, "GetTraceEnableFlags");

+    *((FARPROC*) &_TraceEvent) = GetProcAddress (_Advapi32, "TraceEvent");

+

+    if (_RegisterTraceGuids == NULL ||

+        _UnregisterTraceGuids == NULL ||

+        _GetTraceEnableLevel == NULL ||

+        _GetTraceEnableFlags == NULL ||

+        _TraceEvent == NULL) {

+

+        return FALSE;

+    }

+

+    EventTracingAvailable = TRUE;

+

+    OnStateChanged = LogParams->OnStateChanged;

+

+    //

+    // Register our GUIDs.

+    //

+

+    status = _RegisterTraceGuids (PerflogCallback,

+                                  LogParams,

+                                  &LogParams->ControlGuid,

+                                  LogParams->NumberOfTraceGuids,

+                                  LogParams->TraceGuids,

+                                  NULL,

+                                  NULL,

+                                  &PerflogRegHandle);

+

+    return (status == ERROR_SUCCESS);

+}

+

+//

+// This routine shuts down performance logging.

+//

+

+VOID

+PerflogShutdown (

+    VOID

+    )

+{

+    if (!EventTracingAvailable) {

+        return;

+    }

+

+    _UnregisterTraceGuids (PerflogRegHandle);

+    PerflogRegHandle = NULL;

+    PerflogTraceHandle = NULL;

+}

+

+//

+// Event tracing callback routine.

+// It's called when controllers call event tracing control functions.

+//

+

+ULONG

+WINAPI

+PerflogCallback (

+    WMIDPREQUESTCODE RequestCode,

+    __in PVOID Context,

+    __out ULONG* BufferSize,

+    __in PVOID Buffer

+    )

+{

+    ULONG status;

+

+    UNREFERENCED_PARAMETER (Context);

+

+    ASSERT (EventTracingAvailable);

+

+    status = ERROR_SUCCESS;

+

+    switch (RequestCode) {

+

+    case WMI_ENABLE_EVENTS:

+        PerflogTraceHandle = _GetTraceLoggerHandle (Buffer);

+        PerflogEnableFlags = _GetTraceEnableFlags (PerflogTraceHandle);

+        PerflogEnableLevel = _GetTraceEnableLevel (PerflogTraceHandle);

+        break;

+

+    case WMI_DISABLE_EVENTS:

+        PerflogTraceHandle = NULL;

+        PerflogEnableFlags = 0;

+        PerflogEnableLevel = 0;

+        break;

+

+    default:

+        status = ERROR_INVALID_PARAMETER;

+    }

+

+    if (OnStateChanged != NULL) {

+        OnStateChanged();

+    }

+

+    *BufferSize = 0;

+    return status;

+}

+

+//

+// Logging routine.

+//

+

+VOID

+PerflogTraceEvent (

+    __in PEVENT_TRACE_HEADER Event

+    )

+{

+    if (!EventTracingAvailable) {

+        return;

+    }

+

+    _TraceEvent (PerflogTraceHandle, Event);

+}

+

+VOID

+PerflogTraceEventLevel(

+    ULONG Level,

+    __in PEVENT_TRACE_HEADER Event

+    )

+{

+    if ((!EventTracingAvailable) || (Level <= PerflogModuleLevel)) {

+        return;

+    }

+

+    _TraceEvent (PerflogTraceHandle, Event);

+}

+

+