summaryrefslogtreecommitdiff
path: root/src/win32ctl
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
commit47e6e7c84f008a53061e661f31ae96629bc694ef (patch)
tree648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/win32ctl
downloadpcp-debian.tar.gz
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/win32ctl')
-rw-r--r--src/win32ctl/GNUmakefile36
-rw-r--r--src/win32ctl/eventlog/GNUmakefile38
-rw-r--r--src/win32ctl/eventlog/pcp-eventlog.c144
-rw-r--r--src/win32ctl/include/GNUmakefile32
-rw-r--r--src/win32ctl/include/_mingw_unicode.h33
-rw-r--r--src/win32ctl/include/evntcons.h158
-rw-r--r--src/win32ctl/include/evntprov.h354
-rw-r--r--src/win32ctl/include/evntrace.h841
-rw-r--r--src/win32ctl/include/pdh.h605
-rw-r--r--src/win32ctl/include/pdhmsg.h101
-rw-r--r--src/win32ctl/include/pshpack8.h8
-rw-r--r--src/win32ctl/include/tdh.h329
-rw-r--r--src/win32ctl/include/tdhmsg.h39
-rw-r--r--src/win32ctl/include/winevt.h758
-rw-r--r--src/win32ctl/include/winmeta.h3
-rw-r--r--src/win32ctl/include/winperf.h193
-rw-r--r--src/win32ctl/include/wmistr.h198
-rwxr-xr-xsrc/win32ctl/lib/GNUmakefile42
-rw-r--r--src/win32ctl/lib/libpcp_pdh.def12
-rw-r--r--src/win32ctl/lib/libpcp_tdh.def10
-rwxr-xr-xsrc/win32ctl/mkaf.bat10
-rwxr-xr-xsrc/win32ctl/pcp.bat10
-rwxr-xr-xsrc/win32ctl/pmafm.bat10
-rwxr-xr-xsrc/win32ctl/pmsignal.bat10
-rw-r--r--src/win32ctl/services/GNUmakefile38
-rw-r--r--src/win32ctl/services/pcp-services.c248
-rw-r--r--src/win32ctl/setevent/GNUmakefile38
-rw-r--r--src/win32ctl/setevent/pcp-setevent.c84
28 files changed, 4382 insertions, 0 deletions
diff --git a/src/win32ctl/GNUmakefile b/src/win32ctl/GNUmakefile
new file mode 100644
index 0000000..6ae7223
--- /dev/null
+++ b/src/win32ctl/GNUmakefile
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2008-2011 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../..
+include $(TOPDIR)/src/include/builddefs
+
+SUBDIRS = include lib \
+ eventlog services setevent
+BATCHES = pcp.bat pmafm.bat mkaf.bat pmsignal.bat
+LSRCFILES = $(BATCHES)
+
+default :: default_pcp
+
+default_pcp : $(SUBDIRS)
+ $(SUBDIRS_MAKERULE)
+
+install :: default_pcp install_pcp
+
+install_pcp : $(SUBDIRS)
+ $(SUBDIRS_MAKERULE)
+ifeq "$(TARGET_OS)" "mingw"
+ $(INSTALL) -m 755 $(BATCHES) $(PCP_BIN_DIR)
+endif
+
+include $(BUILDRULES)
diff --git a/src/win32ctl/eventlog/GNUmakefile b/src/win32ctl/eventlog/GNUmakefile
new file mode 100644
index 0000000..cab11e1
--- /dev/null
+++ b/src/win32ctl/eventlog/GNUmakefile
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2008-2009 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../../..
+include $(TOPDIR)/src/include/builddefs
+
+CFILES = pcp-eventlog.c
+CMDTARGET = pcp-eventlog.exe
+LLDLIBS = $(PCPLIB)
+LSRCFILES = $(WRAPPERS)
+
+default: build-me
+
+include $(BUILDRULES)
+
+ifeq "$(TARGET_OS)" "mingw"
+build-me: $(CMDTARGET)
+install: default
+ $(INSTALL) -m 755 $(CMDTARGET) $(PCP_BIN_DIR)/$(CMDTARGET)
+else
+build-me:
+install:
+endif
+
+default_pcp: default
+
+install_pcp: install
diff --git a/src/win32ctl/eventlog/pcp-eventlog.c b/src/win32ctl/eventlog/pcp-eventlog.c
new file mode 100644
index 0000000..e8f8fe3
--- /dev/null
+++ b/src/win32ctl/eventlog/pcp-eventlog.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2008 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include "pmapi.h"
+#include "impl.h"
+#include <string.h>
+#include <winbase.h>
+
+int
+posix2win32(char *pri)
+{
+ if (strcmp(pri, "alert") == 0 || strcmp(pri, "warning") == 0 ||
+ strcmp(pri, "warn") == 0)
+ return EVENTLOG_WARNING_TYPE;
+ if (strcmp(pri, "crit") == 0 || strcmp(pri, "emerg") == 0 ||
+ strcmp(pri, "err") == 0 || strcmp(pri, "error") == 0 ||
+ strcmp(pri, "panic") == 0)
+ return EVENTLOG_ERROR_TYPE;
+ if (strcmp(pri, "info") == 0 || strcmp(pri, "notice") == 0 ||
+ strcmp(pri, "debug") == 0)
+ return EVENTLOG_INFORMATION_TYPE;
+ return -1;
+}
+
+void
+append(char *buffer, int bsize, char *string)
+{
+ static int spaced; /* first argument needs no whitespace-prefix */
+ static int offset;
+
+ if (spaced)
+ offset += snprintf(buffer + offset, bsize - offset, " %s", string);
+ else {
+ offset += snprintf(buffer + offset, bsize - offset, "%s", string);
+ spaced = 1; /* remainder will all be space-prefixed */
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ HANDLE sink;
+ LPCSTR msgptr;
+ char buffer[256];
+ char msg[32*1024];
+ char *pri = NULL;
+ char *tag = NULL;
+ int error = 0;
+ int iflag = 0;
+ int sflag = 0;
+ int priority;
+ int c;
+
+ __pmSetProgname(argv[0]);
+
+ while ((c = getopt(argc, argv, "ip:st:?")) != EOF) {
+ switch (c) {
+ case 'i': /* process ID */
+ iflag = 1;
+ break;
+ case 'p': /* pri (facility.level) */
+ pri = optarg;
+ break;
+ case 's': /* stderr too */
+ sflag = 1;
+ break;
+ case 't': /* tag (prefix) */
+ tag = optarg;
+ break;
+ default:
+ error++;
+ }
+ }
+
+ if (error) {
+ fprintf(stderr, "Usage: %s [ options ] message\n\n"
+ "Options:\n"
+ " -i log process identifier with each line\n"
+ " -s log message to standard error as well\n"
+ " -p pri enter message with specified priority\n"
+ " -t tag mark the line with the specified tag\n",
+ pmProgname);
+ return 2;
+ }
+
+ /*
+ * Parse priority. Discard facility, pick out valid level names.
+ */
+ if (!pri)
+ priority = EVENTLOG_INFORMATION_TYPE; /* default event type */
+ else {
+ char *p = strrchr(pri, '.');
+ if (p)
+ pri = p;
+ priority = posix2win32(pri);
+ if (!priority)
+ priority = EVENTLOG_INFORMATION_TYPE; /* default event type */
+ }
+
+ /*
+ * Construct the message from all contributing components.
+ */
+ if (iflag) {
+ snprintf(buffer, sizeof(buffer), "[%" FMT_PID "]", getpid());
+ append(msg, sizeof(msg), buffer);
+ }
+ if (tag) {
+ snprintf(buffer, sizeof(buffer), "%s:", tag);
+ append(msg, sizeof(msg), buffer);
+ }
+ for (c = optind; c < argc; c++) /* insert the remaining text */
+ append(msg, sizeof(msg), argv[c]);
+
+ /*
+ * Optionally write to the standard error stream (as well).
+ */
+ if (sflag) {
+ fputs(msg, stderr);
+ fputc('\n', stderr);
+ }
+
+ sink = RegisterEventSource(NULL, "Application");
+ if (!sink) {
+ fprintf(stderr, "%s: RegisterEventSource failed (%ld)\n",
+ pmProgname, GetLastError());
+ return 1;
+ }
+ msgptr = msg;
+ if (!ReportEvent(sink, priority, 0, 0, NULL, 1, 0, &msgptr, NULL))
+ fprintf(stderr, "%s: ReportEvent failed (%ld)\n",
+ pmProgname, GetLastError());
+ DeregisterEventSource(sink);
+ return 0;
+}
diff --git a/src/win32ctl/include/GNUmakefile b/src/win32ctl/include/GNUmakefile
new file mode 100644
index 0000000..ce72f8e
--- /dev/null
+++ b/src/win32ctl/include/GNUmakefile
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2011 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../../..
+include $(TOPDIR)/src/include/builddefs
+
+HFILES = _mingw_unicode.h pshpack8.h \
+ evntcons.h evntprov.h evntrace.h \
+ pdh.h pdhmsg.h \
+ tdh.h tdhmsg.h \
+ winevt.h winmeta.h winperf.h wmistr.h
+
+default :: default_pcp
+
+default_pcp :
+
+include $(BUILDRULES)
+
+install :: default_pcp install_pcp
+
+install_pcp : default_pcp
diff --git a/src/win32ctl/include/_mingw_unicode.h b/src/win32ctl/include/_mingw_unicode.h
new file mode 100644
index 0000000..38334bc
--- /dev/null
+++ b/src/win32ctl/include/_mingw_unicode.h
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#if !defined(_INC_CRT_UNICODE_MACROS)
+/* _INC_CRT_UNICODE_MACROS defined based on UNICODE flag */
+
+#if defined(UNICODE)
+# define _INC_CRT_UNICODE_MACROS 1
+# define __MINGW_NAME_AW(func) func##W
+# define __MINGW_NAME_AW_EXT(func,ext) func##W##ext
+# define __MINGW_NAME_UAW(func) func##_W
+# define __MINGW_NAME_UAW_EXT(func,ext) func##_W_##ext
+# define __MINGW_STRING_AW(str) L##str /* same as TEXT() from winnt.h */
+# define __MINGW_PROCNAMEEXT_AW "W"
+#else
+# define _INC_CRT_UNICODE_MACROS 2
+# define __MINGW_NAME_AW(func) func##A
+# define __MINGW_NAME_AW_EXT(func,ext) func##A##ext
+# define __MINGW_NAME_UAW(func) func##_A
+# define __MINGW_NAME_UAW_EXT(func,ext) func##_A_##ext
+# define __MINGW_STRING_AW(str) str /* same as TEXT() from winnt.h */
+# define __MINGW_PROCNAMEEXT_AW "A"
+#endif
+
+#define __MINGW_TYPEDEF_AW(type) \
+ typedef __MINGW_NAME_AW(type) type;
+#define __MINGW_TYPEDEF_UAW(type) \
+ typedef __MINGW_NAME_UAW(type) type;
+
+#endif /* !defined(_INC_CRT_UNICODE_MACROS) */
diff --git a/src/win32ctl/include/evntcons.h b/src/win32ctl/include/evntcons.h
new file mode 100644
index 0000000..8c15a20
--- /dev/null
+++ b/src/win32ctl/include/evntcons.h
@@ -0,0 +1,158 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _EVNTCONS_H_
+#define _EVNTCONS_H_
+
+/* --- start added by kenj */
+#undef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+/* --- end added by kenj */
+
+#include <wmistr.h>
+#include <evntrace.h>
+#include <evntprov.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum EVENTSECURITYOPERATION {
+ EventSecuritySetDACL,
+ EventSecuritySetSACL,
+ EventSecurityAddDACL,
+ EventSecurityAddSACL,
+ EventSecurityMax
+} EVENTSECURITYOPERATION;
+
+typedef struct _EVENT_EXTENDED_ITEM_INSTANCE {
+ ULONG InstanceId;
+ ULONG ParentInstanceId;
+ GUID ParentGuid;
+} EVENT_EXTENDED_ITEM_INSTANCE, *PEVENT_EXTENDED_ITEM_INSTANCE;
+
+typedef struct _EVENT_EXTENDED_ITEM_TS_ID {
+ ULONG SessionId;
+} EVENT_EXTENDED_ITEM_TS_ID, *PEVENT_EXTENDED_ITEM_TS_ID;
+
+typedef struct _EVENT_EXTENDED_ITEM_RELATED_ACTIVITYID {
+ GUID RelatedActivityId;
+} EVENT_EXTENDED_ITEM_RELATED_ACTIVITYID, *PEVENT_EXTENDED_ITEM_RELATED_ACTIVITYID;
+
+typedef struct _EVENT_HEADER_EXTENDED_DATA_ITEM {
+ USHORT Reserved1;
+ USHORT ExtType;
+ __MINGW_EXTENSION struct {
+ USHORT Linkage : 1;
+ USHORT Reserved2 :15;
+ } DUMMYSTRUCTNAME;
+ USHORT DataSize;
+ ULONGLONG DataPtr;
+} EVENT_HEADER_EXTENDED_DATA_ITEM, *PEVENT_HEADER_EXTENDED_DATA_ITEM;
+
+typedef struct _EVENT_HEADER {
+ USHORT Size;
+ USHORT HeaderType;
+ USHORT Flags;
+ USHORT EventProperty;
+ ULONG ThreadId;
+ ULONG ProcessId;
+ LARGE_INTEGER TimeStamp;
+ GUID ProviderId;
+ EVENT_DESCRIPTOR EventDescriptor;
+ __MINGW_EXTENSION union {
+ __MINGW_EXTENSION struct {
+ ULONG KernelTime;
+ ULONG UserTime;
+ } DUMMYSTRUCTNAME;
+ ULONG64 ProcessorTime;
+ } DUMMYUNIONNAME;
+ GUID ActivityId;
+} EVENT_HEADER, *PEVENT_HEADER;
+
+#define EVENT_HEADER_PROPERTY_XML 0x0001
+#define EVENT_HEADER_PROPERTY_FORWARDED_XML 0x0002
+#define EVENT_HEADER_PROPERTY_LEGACY_EVENTLOG 0x0004
+
+#define EVENT_HEADER_FLAG_EXTENDED_INFO 0x0001
+#define EVENT_HEADER_FLAG_PRIVATE_SESSION 0x0002
+#define EVENT_HEADER_FLAG_STRING_ONLY 0x0004
+#define EVENT_HEADER_FLAG_TRACE_MESSAGE 0x0008
+#define EVENT_HEADER_FLAG_NO_CPUTIME 0x0010
+#define EVENT_HEADER_FLAG_32_BIT_HEADER 0x0020
+#define EVENT_HEADER_FLAG_64_BIT_HEADER 0x0040
+#define EVENT_HEADER_FLAG_CLASSIC_HEADER 0x0100
+
+#define EVENT_HEADER_EXT_TYPE_RELATED_ACTIVITYID 0x0001
+#define EVENT_HEADER_EXT_TYPE_SID 0x0002
+#define EVENT_HEADER_EXT_TYPE_TS_ID 0x0003
+#define EVENT_HEADER_EXT_TYPE_INSTANCE_INFO 0x0004
+#define EVENT_HEADER_EXT_TYPE_STACK_TRACE32 0x0005
+#define EVENT_HEADER_EXT_TYPE_STACK_TRACE64 0x0006
+
+struct _EVENT_RECORD {
+ EVENT_HEADER EventHeader;
+ ETW_BUFFER_CONTEXT BufferContext;
+ USHORT ExtendedDataCount;
+ USHORT UserDataLength;
+ PEVENT_HEADER_EXTENDED_DATA_ITEM ExtendedData;
+ PVOID UserData;
+ PVOID UserContext;
+};
+#ifndef DEFINED_PEVENT_RECORD
+typedef struct _EVENT_RECORD EVENT_RECORD, *PEVENT_RECORD;
+#define DEFINED_PEVENT_RECORD 1
+#endif /* for evntrace.h */
+
+#if (_WIN32_WINNT >= 0x0601)
+typedef struct _EVENT_EXTENDED_ITEM_STACK_TRACE32 {
+ ULONG64 MatchId;
+ ULONG Address[ANYSIZE_ARRAY];
+} EVENT_EXTENDED_ITEM_STACK_TRACE32, *PEVENT_EXTENDED_ITEM_STACK_TRACE32;
+
+typedef struct _EVENT_EXTENDED_ITEM_STACK_TRACE64 {
+ ULONG64 MatchId;
+ ULONG64 Address[ANYSIZE_ARRAY];
+} EVENT_EXTENDED_ITEM_STACK_TRACE64, *PEVENT_EXTENDED_ITEM_STACK_TRACE64;
+#endif /*(_WIN32_WINNT >= 0x0601)*/
+
+#define EVENT_ENABLE_PROPERTY_SID 0x00000001
+#define EVENT_ENABLE_PROPERTY_TS_ID 0x00000002
+#define EVENT_ENABLE_PROPERTY_STACK_TRACE 0x00000004
+
+#define PROCESS_TRACE_MODE_REAL_TIME 0x00000100
+#define PROCESS_TRACE_MODE_RAW_TIMESTAMP 0x00001000
+#define PROCESS_TRACE_MODE_EVENT_RECORD 0x10000000
+
+#if (_WIN32_WINNT >= 0x0600)
+ULONG EVNTAPI EventAccessControl(
+ LPGUID Guid,
+ ULONG Operation,
+ PSID Sid,
+ ULONG Rights,
+ BOOLEAN AllowOrDeny
+);
+
+ULONG EVNTAPI EventAccessQuery(
+ LPGUID Guid,
+ PSECURITY_DESCRIPTOR Buffer,
+ PULONG BufferSize
+);
+
+ULONG EVNTAPI EventAccessRemove(
+ LPGUID Guid
+);
+#endif /*(_WIN32_WINNT >= 0x0600)*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EVNTCONS_H_ */
+
diff --git a/src/win32ctl/include/evntprov.h b/src/win32ctl/include/evntprov.h
new file mode 100644
index 0000000..c0dc243
--- /dev/null
+++ b/src/win32ctl/include/evntprov.h
@@ -0,0 +1,354 @@
+/*
+ * evntprov.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef _EVNTPROV_H_
+#define _EVNTPROV_H_
+
+#ifndef EVNTAPI
+#ifndef MIDL_PASS
+#ifdef _EVNT_SOURCE_
+#define EVNTAPI __stdcall
+#else
+#define EVNTAPI DECLSPEC_IMPORT __stdcall
+#endif /* _EVNT_SOURCE_ */
+#endif /* MIDL_PASS */
+#endif /* EVNTAPI */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EVENT_MIN_LEVEL 0
+#define EVENT_MAX_LEVEL 0xff
+
+#define EVENT_ACTIVITY_CTRL_GET_ID 1
+#define EVENT_ACTIVITY_CTRL_SET_ID 2
+#define EVENT_ACTIVITY_CTRL_CREATE_ID 3
+#define EVENT_ACTIVITY_CTRL_GET_SET_ID 4
+#define EVENT_ACTIVITY_CTRL_CREATE_SET_ID 5
+
+typedef ULONGLONG REGHANDLE, *PREGHANDLE;
+
+#define MAX_EVENT_DATA_DESCRIPTORS 128
+#define MAX_EVENT_FILTER_DATA_SIZE 1024
+
+#define EVENT_FILTER_TYPE_SCHEMATIZED 0x80000000
+
+typedef struct _EVENT_DESCRIPTOR {
+ USHORT Id;
+ UCHAR Version;
+ UCHAR Channel;
+ UCHAR Level;
+ UCHAR Opcode;
+ USHORT Task;
+ ULONGLONG Keyword;
+} EVENT_DESCRIPTOR, *PEVENT_DESCRIPTOR;
+typedef const EVENT_DESCRIPTOR *PCEVENT_DESCRIPTOR;
+
+typedef struct _EVENT_DATA_DESCRIPTOR {
+ ULONGLONG Ptr;
+ ULONG Size;
+ ULONG Reserved;
+} EVENT_DATA_DESCRIPTOR, *PEVENT_DATA_DESCRIPTOR;
+
+struct _EVENT_FILTER_DESCRIPTOR {
+ ULONGLONG Ptr;
+ ULONG Size;
+ ULONG Type;
+};
+#ifndef DEFINED_PEVENT_FILTER_DESC
+typedef struct _EVENT_FILTER_DESCRIPTOR EVENT_FILTER_DESCRIPTOR, *PEVENT_FILTER_DESCRIPTOR;
+#define DEFINED_PEVENT_FILTER_DESC 1
+#endif /* for evntrace.h */
+
+typedef struct _EVENT_FILTER_HEADER {
+ USHORT Id;
+ UCHAR Version;
+ UCHAR Reserved[5];
+ ULONGLONG InstanceId;
+ ULONG Size;
+ ULONG NextOffset;
+} EVENT_FILTER_HEADER, *PEVENT_FILTER_HEADER;
+
+
+#ifndef _ETW_KM_ /* for wdm.h */
+
+typedef VOID
+(NTAPI *PENABLECALLBACK)(
+ LPCGUID SourceId,
+ ULONG IsEnabled,
+ UCHAR Level,
+ ULONGLONG MatchAnyKeyword,
+ ULONGLONG MatchAllKeyword,
+ PEVENT_FILTER_DESCRIPTOR FilterData,
+ PVOID CallbackContext);
+
+#if (_WIN32_WINNT >= 0x0600)
+ULONG EVNTAPI EventRegister(
+ LPCGUID ProviderId,
+ PENABLECALLBACK EnableCallback,
+ PVOID CallbackContext,
+ PREGHANDLE RegHandle
+);
+
+ULONG EVNTAPI EventUnregister(
+ REGHANDLE RegHandle
+);
+
+BOOLEAN EVNTAPI EventEnabled(
+ REGHANDLE RegHandle,
+ PCEVENT_DESCRIPTOR EventDescriptor
+);
+
+BOOLEAN EVNTAPI EventProviderEnabled(
+ REGHANDLE RegHandle,
+ UCHAR Level,
+ ULONGLONG Keyword
+);
+
+ULONG EVNTAPI EventWrite(
+ REGHANDLE RegHandle,
+ PCEVENT_DESCRIPTOR EventDescriptor,
+ ULONG UserDataCount,
+ PEVENT_DATA_DESCRIPTOR UserData
+);
+
+ULONG EVNTAPI EventWriteTransfer(
+ REGHANDLE RegHandle,
+ PCEVENT_DESCRIPTOR EventDescriptor,
+ LPCGUID ActivityId,
+ LPCGUID RelatedActivityId,
+ ULONG UserDataCount,
+ PEVENT_DATA_DESCRIPTOR UserData
+);
+
+ULONG EVNTAPI EventWriteString(
+ REGHANDLE RegHandle,
+ UCHAR Level,
+ ULONGLONG Keyword,
+ PCWSTR String
+);
+
+ULONG EVNTAPI EventActivityIdControl(
+ ULONG ControlCode,
+ LPGUID ActivityId
+);
+
+#endif /*(_WIN32_WINNT >= 0x0600)*/
+
+#if (_WIN32_WINNT >= 0x0601)
+ULONG EVNTAPI EventWriteEx(
+ REGHANDLE RegHandle,
+ PCEVENT_DESCRIPTOR EventDescriptor,
+ ULONG64 Filter,
+ ULONG Flags,
+ LPCGUID ActivityId,
+ LPCGUID RelatedActivityId,
+ ULONG UserDataCount,
+ PEVENT_DATA_DESCRIPTOR UserData
+);
+#endif /*(_WIN32_WINNT >= 0x0601)*/
+
+#endif /* _ETW_KM_ */
+
+FORCEINLINE
+VOID
+EventDataDescCreate(
+ PEVENT_DATA_DESCRIPTOR EventDataDescriptor,
+ const VOID* DataPtr,
+ ULONG DataSize)
+{
+ EventDataDescriptor->Ptr = (ULONGLONG)(ULONG_PTR)DataPtr;
+ EventDataDescriptor->Size = DataSize;
+ EventDataDescriptor->Reserved = 0;
+}
+
+FORCEINLINE
+VOID
+EventDescCreate(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ USHORT Id,
+ UCHAR Version,
+ UCHAR Channel,
+ UCHAR Level,
+ USHORT Task,
+ UCHAR Opcode,
+ ULONGLONG Keyword)
+{
+ EventDescriptor->Id = Id;
+ EventDescriptor->Version = Version;
+ EventDescriptor->Channel = Channel;
+ EventDescriptor->Level = Level;
+ EventDescriptor->Task = Task;
+ EventDescriptor->Opcode = Opcode;
+ EventDescriptor->Keyword = Keyword;
+}
+
+FORCEINLINE
+VOID
+EventDescZero(
+ PEVENT_DESCRIPTOR EventDescriptor)
+{
+ memset(EventDescriptor, 0, sizeof(EVENT_DESCRIPTOR));
+}
+
+FORCEINLINE
+USHORT
+EventDescGetId(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Id);
+}
+
+FORCEINLINE
+UCHAR
+EventDescGetVersion(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Version);
+}
+
+FORCEINLINE
+USHORT
+EventDescGetTask(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Task);
+}
+
+FORCEINLINE
+UCHAR
+EventDescGetOpcode(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Opcode);
+}
+
+FORCEINLINE
+UCHAR
+EventDescGetChannel(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Channel);
+}
+
+FORCEINLINE
+UCHAR
+EventDescGetLevel(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Level);
+}
+
+FORCEINLINE
+ULONGLONG
+EventDescGetKeyword(
+ PCEVENT_DESCRIPTOR EventDescriptor)
+{
+ return (EventDescriptor->Keyword);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetId(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ USHORT Id)
+{
+ EventDescriptor->Id = Id;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetVersion(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ UCHAR Version)
+{
+ EventDescriptor->Version = Version;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetTask(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ USHORT Task)
+{
+ EventDescriptor->Task = Task;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetOpcode(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ UCHAR Opcode)
+{
+ EventDescriptor->Opcode = Opcode;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetLevel(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ UCHAR Level)
+{
+ EventDescriptor->Level = Level;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetChannel(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ UCHAR Channel)
+{
+ EventDescriptor->Channel = Channel;
+ return (EventDescriptor);
+}
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescSetKeyword(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ ULONGLONG Keyword)
+{
+ EventDescriptor->Keyword = Keyword;
+ return (EventDescriptor);
+}
+
+
+FORCEINLINE
+PEVENT_DESCRIPTOR
+EventDescOrKeyword(
+ PEVENT_DESCRIPTOR EventDescriptor,
+ ULONGLONG Keyword)
+{
+ EventDescriptor->Keyword |= Keyword;
+ return (EventDescriptor);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EVNTPROV_H_ */
+
diff --git a/src/win32ctl/include/evntrace.h b/src/win32ctl/include/evntrace.h
new file mode 100644
index 0000000..6e9e2a0
--- /dev/null
+++ b/src/win32ctl/include/evntrace.h
@@ -0,0 +1,841 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _EVNTRACE_
+#define _EVNTRACE_
+
+/* --- start added by kenj */
+#undef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+/* --- end added by kenj */
+
+#if defined(_WINNT_) || defined(WINNT)
+
+#ifndef WMIAPI
+#ifndef MIDL_PASS
+#ifdef _WMI_SOURCE_
+#define WMIAPI __stdcall
+#else
+#define WMIAPI DECLSPEC_IMPORT __stdcall
+#endif
+#endif /* MIDL_PASS */
+#endif /* WMIAPI */
+
+DEFINE_GUID (EventTraceGuid,0x68fdd900,0x4a3e,0x11d1,0x84,0xf4,0x00,0x00,0xf8,0x04,0x64,0xe3);
+DEFINE_GUID (SystemTraceControlGuid,0x9e814aad,0x3204,0x11d2,0x9a,0x82,0x00,0x60,0x08,0xa8,0x69,0x39);
+DEFINE_GUID (EventTraceConfigGuid,0x01853a65,0x418f,0x4f36,0xae,0xfc,0xdc,0x0f,0x1d,0x2f,0xd2,0x35);
+DEFINE_GUID (DefaultTraceSecurityGuid,0x0811c1af,0x7a07,0x4a06,0x82,0xed,0x86,0x94,0x55,0xcd,0xf7,0x13);
+
+#define KERNEL_LOGGER_NAMEW L"NT Kernel Logger"
+#define GLOBAL_LOGGER_NAMEW L"GlobalLogger"
+#define EVENT_LOGGER_NAMEW L"Event Log"
+#define DIAG_LOGGER_NAMEW L"DiagLog"
+
+#define KERNEL_LOGGER_NAMEA "NT Kernel Logger"
+#define GLOBAL_LOGGER_NAMEA "GlobalLogger"
+#define EVENT_LOGGER_NAMEA "Event Log"
+#define DIAG_LOGGER_NAMEA "DiagLog"
+
+#define MAX_MOF_FIELDS 16
+
+#ifndef _TRACEHANDLE_DEFINED
+#define _TRACEHANDLE_DEFINED
+typedef ULONG64 TRACEHANDLE,*PTRACEHANDLE;
+#endif
+
+#define SYSTEM_EVENT_TYPE 1
+
+#define EVENT_TRACE_TYPE_INFO 0x00
+#define EVENT_TRACE_TYPE_START 0x01
+#define EVENT_TRACE_TYPE_END 0x02
+#define EVENT_TRACE_TYPE_STOP 0x02
+#define EVENT_TRACE_TYPE_DC_START 0x03
+#define EVENT_TRACE_TYPE_DC_END 0x04
+#define EVENT_TRACE_TYPE_EXTENSION 0x05
+#define EVENT_TRACE_TYPE_REPLY 0x06
+#define EVENT_TRACE_TYPE_DEQUEUE 0x07
+#define EVENT_TRACE_TYPE_RESUME 0x07
+#define EVENT_TRACE_TYPE_CHECKPOINT 0x08
+#define EVENT_TRACE_TYPE_SUSPEND 0x08
+#define EVENT_TRACE_TYPE_WINEVT_SEND 0x09
+#define EVENT_TRACE_TYPE_WINEVT_RECEIVE 0XF0
+
+#define TRACE_LEVEL_NONE 0
+#define TRACE_LEVEL_CRITICAL 1
+#define TRACE_LEVEL_FATAL 1
+#define TRACE_LEVEL_ERROR 2
+#define TRACE_LEVEL_WARNING 3
+#define TRACE_LEVEL_INFORMATION 4
+#define TRACE_LEVEL_VERBOSE 5
+#define TRACE_LEVEL_RESERVED6 6
+#define TRACE_LEVEL_RESERVED7 7
+#define TRACE_LEVEL_RESERVED8 8
+#define TRACE_LEVEL_RESERVED9 9
+
+#define EVENT_TRACE_TYPE_LOAD 0x0A
+
+#define EVENT_TRACE_TYPE_IO_READ 0x0A
+#define EVENT_TRACE_TYPE_IO_WRITE 0x0B
+#define EVENT_TRACE_TYPE_IO_READ_INIT 0x0C
+#define EVENT_TRACE_TYPE_IO_WRITE_INIT 0x0D
+#define EVENT_TRACE_TYPE_IO_FLUSH 0x0E
+#define EVENT_TRACE_TYPE_IO_FLUSH_INIT 0x0F
+
+#define EVENT_TRACE_TYPE_MM_TF 0x0A
+#define EVENT_TRACE_TYPE_MM_DZF 0x0B
+#define EVENT_TRACE_TYPE_MM_COW 0x0C
+#define EVENT_TRACE_TYPE_MM_GPF 0x0D
+#define EVENT_TRACE_TYPE_MM_HPF 0x0E
+#define EVENT_TRACE_TYPE_MM_AV 0x0F
+
+#define EVENT_TRACE_TYPE_SEND 0x0A
+#define EVENT_TRACE_TYPE_RECEIVE 0x0B
+#define EVENT_TRACE_TYPE_CONNECT 0x0C
+#define EVENT_TRACE_TYPE_DISCONNECT 0x0D
+#define EVENT_TRACE_TYPE_RETRANSMIT 0x0E
+#define EVENT_TRACE_TYPE_ACCEPT 0x0F
+#define EVENT_TRACE_TYPE_RECONNECT 0x10
+#define EVENT_TRACE_TYPE_CONNFAIL 0x11
+#define EVENT_TRACE_TYPE_COPY_TCP 0x12
+#define EVENT_TRACE_TYPE_COPY_ARP 0x13
+#define EVENT_TRACE_TYPE_ACKFULL 0x14
+#define EVENT_TRACE_TYPE_ACKPART 0x15
+#define EVENT_TRACE_TYPE_ACKDUP 0x16
+
+#define EVENT_TRACE_TYPE_GUIDMAP 0x0A
+#define EVENT_TRACE_TYPE_CONFIG 0x0B
+#define EVENT_TRACE_TYPE_SIDINFO 0x0C
+#define EVENT_TRACE_TYPE_SECURITY 0x0D
+
+#define EVENT_TRACE_TYPE_REGCREATE 0x0A
+#define EVENT_TRACE_TYPE_REGOPEN 0x0B
+#define EVENT_TRACE_TYPE_REGDELETE 0x0C
+#define EVENT_TRACE_TYPE_REGQUERY 0x0D
+#define EVENT_TRACE_TYPE_REGSETVALUE 0x0E
+#define EVENT_TRACE_TYPE_REGDELETEVALUE 0x0F
+#define EVENT_TRACE_TYPE_REGQUERYVALUE 0x10
+#define EVENT_TRACE_TYPE_REGENUMERATEKEY 0x11
+#define EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY 0x12
+#define EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE 0x13
+#define EVENT_TRACE_TYPE_REGSETINFORMATION 0x14
+#define EVENT_TRACE_TYPE_REGFLUSH 0x15
+#define EVENT_TRACE_TYPE_REGKCBCREATE 0x16
+#define EVENT_TRACE_TYPE_REGKCBDELETE 0x17
+#define EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN 0x18
+#define EVENT_TRACE_TYPE_REGKCBRUNDOWNEND 0x19
+#define EVENT_TRACE_TYPE_REGVIRTUALIZE 0x1A
+#define EVENT_TRACE_TYPE_REGCLOSE 0x1B
+#define EVENT_TRACE_TYPE_REGSETSECURITY 0x1C
+#define EVENT_TRACE_TYPE_REGQUERYSECURITY 0x1D
+#define EVENT_TRACE_TYPE_REGCOMMIT 0x1E
+#define EVENT_TRACE_TYPE_REGPREPARE 0x1F
+#define EVENT_TRACE_TYPE_REGROLLBACK 0x20
+#define EVENT_TRACE_TYPE_REGMOUNTHIVE 0x21
+
+#define EVENT_TRACE_TYPE_CONFIG_CPU 0x0A
+#define EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK 0x0B
+#define EVENT_TRACE_TYPE_CONFIG_LOGICALDISK 0x0C
+#define EVENT_TRACE_TYPE_CONFIG_NIC 0x0D
+#define EVENT_TRACE_TYPE_CONFIG_VIDEO 0x0E
+#define EVENT_TRACE_TYPE_CONFIG_SERVICES 0x0F
+#define EVENT_TRACE_TYPE_CONFIG_POWER 0x10
+#define EVENT_TRACE_TYPE_CONFIG_NETINFO 0x11
+
+#define EVENT_TRACE_TYPE_CONFIG_IRQ 0x15
+#define EVENT_TRACE_TYPE_CONFIG_PNP 0x16
+#define EVENT_TRACE_TYPE_CONFIG_IDECHANNEL 0x17
+#define EVENT_TRACE_TYPE_CONFIG_PLATFORM 0x19
+
+#define EVENT_TRACE_FLAG_PROCESS 0x00000001
+#define EVENT_TRACE_FLAG_THREAD 0x00000002
+#define EVENT_TRACE_FLAG_IMAGE_LOAD 0x00000004
+
+#define EVENT_TRACE_FLAG_DISK_IO 0x00000100
+#define EVENT_TRACE_FLAG_DISK_FILE_IO 0x00000200
+
+#define EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS 0x00001000
+#define EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS 0x00002000
+
+#define EVENT_TRACE_FLAG_NETWORK_TCPIP 0x00010000
+
+#define EVENT_TRACE_FLAG_REGISTRY 0x00020000
+#define EVENT_TRACE_FLAG_DBGPRINT 0x00040000
+
+#define EVENT_TRACE_FLAG_PROCESS_COUNTERS 0x00000008
+#define EVENT_TRACE_FLAG_CSWITCH 0x00000010
+#define EVENT_TRACE_FLAG_DPC 0x00000020
+#define EVENT_TRACE_FLAG_INTERRUPT 0x00000040
+#define EVENT_TRACE_FLAG_SYSTEMCALL 0x00000080
+
+#define EVENT_TRACE_FLAG_DISK_IO_INIT 0x00000400
+
+#define EVENT_TRACE_FLAG_ALPC 0x00100000
+#define EVENT_TRACE_FLAG_SPLIT_IO 0x00200000
+
+#define EVENT_TRACE_FLAG_DRIVER 0x00800000
+#define EVENT_TRACE_FLAG_PROFILE 0x01000000
+#define EVENT_TRACE_FLAG_FILE_IO 0x02000000
+#define EVENT_TRACE_FLAG_FILE_IO_INIT 0x04000000
+
+#define EVENT_TRACE_FLAG_DISPATCHER 0x00000800
+#define EVENT_TRACE_FLAG_VIRTUAL_ALLOC 0x00004000
+
+#define EVENT_TRACE_FLAG_EXTENSION 0x80000000
+#define EVENT_TRACE_FLAG_FORWARD_WMI 0x40000000
+#define EVENT_TRACE_FLAG_ENABLE_RESERVE 0x20000000
+
+#define EVENT_TRACE_FILE_MODE_NONE 0x00000000
+#define EVENT_TRACE_FILE_MODE_SEQUENTIAL 0x00000001
+#define EVENT_TRACE_FILE_MODE_CIRCULAR 0x00000002
+#define EVENT_TRACE_FILE_MODE_APPEND 0x00000004
+#define EVENT_TRACE_FILE_MODE_NEWFILE 0x00000008
+#define EVENT_TRACE_FILE_MODE_PREALLOCATE 0x00000020
+
+#define EVENT_TRACE_NONSTOPPABLE_MODE 0x00000040
+#define EVENT_TRACE_SECURE_MODE 0x00000080
+#define EVENT_TRACE_USE_KBYTES_FOR_SIZE 0x00002000
+#define EVENT_TRACE_PRIVATE_IN_PROC 0x00020000
+#define EVENT_TRACE_MODE_RESERVED 0x00100000
+
+#define EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING 0x10000000
+
+#define EVENT_TRACE_REAL_TIME_MODE 0x00000100
+#define EVENT_TRACE_DELAY_OPEN_FILE_MODE 0x00000200
+#define EVENT_TRACE_BUFFERING_MODE 0x00000400
+#define EVENT_TRACE_PRIVATE_LOGGER_MODE 0x00000800
+#define EVENT_TRACE_ADD_HEADER_MODE 0x00001000
+
+#define EVENT_TRACE_USE_GLOBAL_SEQUENCE 0x00004000
+#define EVENT_TRACE_USE_LOCAL_SEQUENCE 0x00008000
+
+#define EVENT_TRACE_RELOG_MODE 0x00010000
+
+#define EVENT_TRACE_USE_PAGED_MEMORY 0x01000000
+
+#define EVENT_TRACE_CONTROL_QUERY 0
+#define EVENT_TRACE_CONTROL_STOP 1
+#define EVENT_TRACE_CONTROL_UPDATE 2
+#define EVENT_TRACE_CONTROL_FLUSH 3
+
+#define TRACE_MESSAGE_SEQUENCE 1
+#define TRACE_MESSAGE_GUID 2
+#define TRACE_MESSAGE_COMPONENTID 4
+#define TRACE_MESSAGE_TIMESTAMP 8
+#define TRACE_MESSAGE_PERFORMANCE_TIMESTAMP 16
+#define TRACE_MESSAGE_SYSTEMINFO 32
+
+#define TRACE_MESSAGE_POINTER32 0x0040
+#define TRACE_MESSAGE_POINTER64 0x0080
+
+#define TRACE_MESSAGE_FLAG_MASK 0xFFFF
+
+#define TRACE_HEADER_FLAG_USE_TIMESTAMP 0x00000200
+#define TRACE_HEADER_FLAG_TRACED_GUID 0x00020000
+#define TRACE_HEADER_FLAG_LOG_WNODE 0x00040000
+#define TRACE_HEADER_FLAG_USE_GUID_PTR 0x00080000
+#define TRACE_HEADER_FLAG_USE_MOF_PTR 0x00100000
+
+#define TRACE_MESSAGE_MAXIMUM_SIZE 8*1024
+
+#define ETW_NULL_TYPE_VALUE 0
+#define ETW_OBJECT_TYPE_VALUE 1
+#define ETW_STRING_TYPE_VALUE 2
+#define ETW_SBYTE_TYPE_VALUE 3
+#define ETW_BYTE_TYPE_VALUE 4
+#define ETW_INT16_TYPE_VALUE 5
+#define ETW_UINT16_TYPE_VALUE 6
+#define ETW_INT32_TYPE_VALUE 7
+#define ETW_UINT32_TYPE_VALUE 8
+#define ETW_INT64_TYPE_VALUE 9
+#define ETW_UINT64_TYPE_VALUE 10
+#define ETW_CHAR_TYPE_VALUE 11
+#define ETW_SINGLE_TYPE_VALUE 12
+#define ETW_DOUBLE_TYPE_VALUE 13
+#define ETW_BOOLEAN_TYPE_VALUE 14
+#define ETW_DECIMAL_TYPE_VALUE 15
+
+#define ETW_GUID_TYPE_VALUE 101
+#define ETW_ASCIICHAR_TYPE_VALUE 102
+#define ETW_ASCIISTRING_TYPE_VALUE 103
+#define ETW_COUNTED_STRING_TYPE_VALUE 104
+#define ETW_POINTER_TYPE_VALUE 105
+#define ETW_SIZET_TYPE_VALUE 106
+#define ETW_HIDDEN_TYPE_VALUE 107
+#define ETW_BOOL_TYPE_VALUE 108
+#define ETW_COUNTED_ANSISTRING_TYPE_VALUE 109
+#define ETW_REVERSED_COUNTED_STRING_TYPE_VALUE 110
+#define ETW_REVERSED_COUNTED_ANSISTRING_TYPE_VALUE 111
+#define ETW_NON_NULL_TERMINATED_STRING_TYPE_VALUE 112
+#define ETW_REDUCED_ANSISTRING_TYPE_VALUE 113
+#define ETW_REDUCED_STRING_TYPE_VALUE 114
+#define ETW_SID_TYPE_VALUE 115
+#define ETW_VARIANT_TYPE_VALUE 116
+#define ETW_PTVECTOR_TYPE_VALUE 117
+#define ETW_WMITIME_TYPE_VALUE 118
+#define ETW_DATETIME_TYPE_VALUE 119
+#define ETW_REFRENCE_TYPE_VALUE 120
+
+#define TRACE_PROVIDER_FLAG_LEGACY 0x00000001
+#define TRACE_PROVIDER_FLAG_PRE_ENABLE 0x00000002
+
+#define EVENT_CONTROL_CODE_DISABLE_PROVIDER 0
+#define EVENT_CONTROL_CODE_ENABLE_PROVIDER 1
+#define EVENT_CONTROL_CODE_CAPTURE_STATE 2
+
+#define EVENT_TRACE_USE_PROCTIME 0x0001
+#define EVENT_TRACE_USE_NOCPUTIME 0x0002
+
+typedef struct _EVENT_TRACE_HEADER {
+ USHORT Size;
+ __MINGW_EXTENSION union {
+ USHORT FieldTypeFlags;
+ __MINGW_EXTENSION struct {
+ UCHAR HeaderType;
+ UCHAR MarkerFlags;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ __MINGW_EXTENSION union {
+ ULONG Version;
+ struct {
+ UCHAR Type;
+ UCHAR Level;
+ USHORT Version;
+ } Class;
+ } DUMMYUNIONNAME2;
+ ULONG ThreadId;
+ ULONG ProcessId;
+ LARGE_INTEGER TimeStamp;
+ __MINGW_EXTENSION union {
+ GUID Guid;
+ ULONGLONG GuidPtr;
+ } DUMMYUNIONNAME3;
+ __MINGW_EXTENSION union {
+ __MINGW_EXTENSION struct {
+ ULONG KernelTime;
+ ULONG UserTime;
+ } DUMMYSTRUCTNAME;
+ ULONG64 ProcessorTime;
+ __MINGW_EXTENSION struct {
+ ULONG ClientContext;
+ ULONG Flags;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME4;
+} EVENT_TRACE_HEADER,*PEVENT_TRACE_HEADER;
+
+typedef struct _EVENT_INSTANCE_HEADER {
+ USHORT Size;
+ __MINGW_EXTENSION union {
+ USHORT FieldTypeFlags;
+ __MINGW_EXTENSION struct {
+ UCHAR HeaderType;
+ UCHAR MarkerFlags;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ __MINGW_EXTENSION union {
+ ULONG Version;
+ struct {
+ UCHAR Type;
+ UCHAR Level;
+ USHORT Version;
+ } Class;
+ } DUMMYUNIONNAME2;
+ ULONG ThreadId;
+ ULONG ProcessId;
+ LARGE_INTEGER TimeStamp;
+ ULONGLONG RegHandle;
+ ULONG InstanceId;
+ ULONG ParentInstanceId;
+ __MINGW_EXTENSION union {
+ __MINGW_EXTENSION struct {
+ ULONG KernelTime;
+ ULONG UserTime;
+ } DUMMYSTRUCTNAME;
+ ULONG64 ProcessorTime;
+ __MINGW_EXTENSION struct {
+ ULONG EventId;
+ ULONG Flags;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME3;
+ ULONGLONG ParentRegHandle;
+} EVENT_INSTANCE_HEADER,*PEVENT_INSTANCE_HEADER;
+
+#define DEFINE_TRACE_MOF_FIELD(MOF,ptr,length,type) \
+ (MOF)->DataPtr = (ULONG64) (ULONG_PTR) ptr; \
+ (MOF)->Length = (ULONG) length; \
+ (MOF)->DataType = (ULONG) type;
+
+typedef struct _MOF_FIELD {
+ ULONG64 DataPtr;
+ ULONG Length;
+ ULONG DataType;
+} MOF_FIELD,*PMOF_FIELD;
+
+#if !(defined(_NTDDK_) || defined(_NTIFS_)) || defined(_WMIKM_)
+
+typedef struct _TRACE_LOGFILE_HEADER {
+ ULONG BufferSize;
+ __MINGW_EXTENSION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ } DUMMYUNIONNAME;
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ __MINGW_EXTENSION union {
+ GUID LogInstanceGuid;
+ __MINGW_EXTENSION struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
+#if defined(_WMIKM_)
+ PWCHAR LoggerName;
+ PWCHAR LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ LPWSTR LoggerName;
+ LPWSTR LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER,*PTRACE_LOGFILE_HEADER;
+
+typedef struct _TRACE_LOGFILE_HEADER32 {
+ ULONG BufferSize;
+ __MINGW_EXTENSION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ };
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ __MINGW_EXTENSION union {
+ GUID LogInstanceGuid;
+ __MINGW_EXTENSION struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ };
+ };
+#if defined(_WMIKM_)
+ ULONG32 LoggerName;
+ ULONG32 LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ ULONG32 LoggerName;
+ ULONG32 LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER32, *PTRACE_LOGFILE_HEADER32;
+
+typedef struct _TRACE_LOGFILE_HEADER64 {
+ ULONG BufferSize;
+ __MINGW_EXTENSION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ };
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ __MINGW_EXTENSION union {
+ GUID LogInstanceGuid;
+ __MINGW_EXTENSION struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ };
+ };
+#if defined(_WMIKM_)
+ ULONG64 LoggerName;
+ ULONG64 LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ ULONG64 LoggerName;
+ ULONG64 LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER64, *PTRACE_LOGFILE_HEADER64;
+
+#endif /* !_NTDDK_ || _WMIKM_ */
+
+typedef struct _EVENT_INSTANCE_INFO {
+ HANDLE RegHandle;
+ ULONG InstanceId;
+} EVENT_INSTANCE_INFO,*PEVENT_INSTANCE_INFO;
+
+#if !defined(_WMIKM_) && !defined(_NTDDK_) && !defined(_NTIFS_)
+
+typedef struct _EVENT_TRACE_PROPERTIES {
+ WNODE_HEADER Wnode;
+ ULONG BufferSize;
+ ULONG MinimumBuffers;
+ ULONG MaximumBuffers;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG FlushTimer;
+ ULONG EnableFlags;
+ LONG AgeLimit;
+
+ ULONG NumberOfBuffers;
+ ULONG FreeBuffers;
+ ULONG EventsLost;
+ ULONG BuffersWritten;
+ ULONG LogBuffersLost;
+ ULONG RealTimeBuffersLost;
+ HANDLE LoggerThreadId;
+ ULONG LogFileNameOffset;
+ ULONG LoggerNameOffset;
+} EVENT_TRACE_PROPERTIES,*PEVENT_TRACE_PROPERTIES;
+
+typedef struct _TRACE_GUID_REGISTRATION {
+ LPCGUID Guid;
+ HANDLE RegHandle;
+} TRACE_GUID_REGISTRATION,*PTRACE_GUID_REGISTRATION;
+
+#endif /* !_NTDDK_ || _WMIKM_ */
+
+typedef struct _TRACE_GUID_PROPERTIES {
+ GUID Guid;
+ ULONG GuidType;
+ ULONG LoggerId;
+ ULONG EnableLevel;
+ ULONG EnableFlags;
+ BOOLEAN IsEnable;
+} TRACE_GUID_PROPERTIES,*PTRACE_GUID_PROPERTIES;
+
+typedef struct _ETW_BUFFER_CONTEXT {
+ UCHAR ProcessorNumber;
+ UCHAR Alignment;
+ USHORT LoggerId;
+} ETW_BUFFER_CONTEXT, *PETW_BUFFER_CONTEXT;
+
+typedef struct _TRACE_ENABLE_INFO {
+ ULONG IsEnabled;
+ UCHAR Level;
+ UCHAR Reserved1;
+ USHORT LoggerId;
+ ULONG EnableProperty;
+ ULONG Reserved2;
+ ULONGLONG MatchAnyKeyword;
+ ULONGLONG MatchAllKeyword;
+} TRACE_ENABLE_INFO, *PTRACE_ENABLE_INFO;
+
+typedef struct _TRACE_PROVIDER_INSTANCE_INFO {
+ ULONG NextOffset;
+ ULONG EnableCount;
+ ULONG Pid;
+ ULONG Flags;
+} TRACE_PROVIDER_INSTANCE_INFO, *PTRACE_PROVIDER_INSTANCE_INFO;
+
+typedef struct _TRACE_GUID_INFO {
+ ULONG InstanceCount;
+ ULONG Reserved;
+} TRACE_GUID_INFO, *PTRACE_GUID_INFO;
+
+typedef struct _EVENT_TRACE {
+ EVENT_TRACE_HEADER Header;
+ ULONG InstanceId;
+ ULONG ParentInstanceId;
+ GUID ParentGuid;
+ PVOID MofData;
+ ULONG MofLength;
+ __MINGW_EXTENSION union {
+ ULONG ClientContext;
+ ETW_BUFFER_CONTEXT BufferContext; /* MSDN says ULONG, for XP and older? */
+ } DUMMYUNIONNAME;
+} EVENT_TRACE,*PEVENT_TRACE;
+
+#if !defined(_WMIKM_) && !defined(_NTDDK_) && !defined(_NTIFS_)
+
+#ifndef DEFINED_PEVENT_RECORD
+typedef struct _EVENT_RECORD EVENT_RECORD, *PEVENT_RECORD;
+#define DEFINED_PEVENT_RECORD 1
+#endif /* for evntcons.h */
+#ifndef DEFINED_PEVENT_FILTER_DESC
+typedef struct _EVENT_FILTER_DESCRIPTOR EVENT_FILTER_DESCRIPTOR, *PEVENT_FILTER_DESCRIPTOR;
+#define DEFINED_PEVENT_FILTER_DESC 1
+#endif /* for evntprov.h */
+typedef struct _EVENT_TRACE_LOGFILEW EVENT_TRACE_LOGFILEW,*PEVENT_TRACE_LOGFILEW;
+typedef struct _EVENT_TRACE_LOGFILEA EVENT_TRACE_LOGFILEA,*PEVENT_TRACE_LOGFILEA;
+typedef ULONG (WINAPI *PEVENT_TRACE_BUFFER_CALLBACKW)(PEVENT_TRACE_LOGFILEW Logfile);
+typedef ULONG (WINAPI *PEVENT_TRACE_BUFFER_CALLBACKA)(PEVENT_TRACE_LOGFILEA Logfile);
+typedef VOID (WINAPI *PEVENT_CALLBACK)(PEVENT_TRACE pEvent);
+typedef VOID (WINAPI *PEVENT_RECORD_CALLBACK)(PEVENT_RECORD EventRecord);
+typedef ULONG (WINAPI *WMIDPREQUEST)(WMIDPREQUESTCODE RequestCode,PVOID RequestContext,ULONG *BufferSize,PVOID Buffer);
+
+struct _EVENT_TRACE_LOGFILEW {
+ LPWSTR LogFileName;
+ LPWSTR LoggerName;
+ LONGLONG CurrentTime;
+ ULONG BuffersRead;
+ __MINGW_EXTENSION union {
+ ULONG LogFileMode;
+ ULONG ProcessTraceMode;
+ } DUMMYUNIONNAME;
+ EVENT_TRACE CurrentEvent;
+ TRACE_LOGFILE_HEADER LogfileHeader;
+ PEVENT_TRACE_BUFFER_CALLBACKW BufferCallback;
+ ULONG BufferSize;
+ ULONG Filled;
+ ULONG EventsLost;
+ __MINGW_EXTENSION union {
+ PEVENT_CALLBACK EventCallback;
+ PEVENT_RECORD_CALLBACK EventRecordCallback;
+ } DUMMYUNIONNAME2;
+ ULONG IsKernelTrace;
+ PVOID Context;
+};
+
+struct _EVENT_TRACE_LOGFILEA {
+ LPSTR LogFileName;
+ LPSTR LoggerName;
+ LONGLONG CurrentTime;
+ ULONG BuffersRead;
+ __MINGW_EXTENSION union {
+ ULONG LogFileMode;
+ ULONG ProcessTraceMode;
+ } DUMMYUNIONNAME;
+ EVENT_TRACE CurrentEvent;
+ TRACE_LOGFILE_HEADER LogfileHeader;
+ PEVENT_TRACE_BUFFER_CALLBACKA BufferCallback;
+ ULONG BufferSize;
+ ULONG Filled;
+ ULONG EventsLost;
+ __MINGW_EXTENSION union {
+ PEVENT_CALLBACK EventCallback;
+ PEVENT_RECORD_CALLBACK EventRecordCallback;
+ } DUMMYUNIONNAME2;
+ ULONG IsKernelTrace;
+ PVOID Context;
+};
+
+#if defined(_UNICODE) || defined(UNICODE)
+#define PEVENT_TRACE_BUFFER_CALLBACK PEVENT_TRACE_BUFFER_CALLBACKW
+#define EVENT_TRACE_LOGFILE EVENT_TRACE_LOGFILEW
+#define PEVENT_TRACE_LOGFILE PEVENT_TRACE_LOGFILEW
+#define KERNEL_LOGGER_NAME KERNEL_LOGGER_NAMEW
+#define GLOBAL_LOGGER_NAME GLOBAL_LOGGER_NAMEW
+#define EVENT_LOGGER_NAME EVENT_LOGGER_NAMEW
+#else
+#define PEVENT_TRACE_BUFFER_CALLBACK PEVENT_TRACE_BUFFER_CALLBACKA
+#define EVENT_TRACE_LOGFILE EVENT_TRACE_LOGFILEA
+#define PEVENT_TRACE_LOGFILE PEVENT_TRACE_LOGFILEA
+#define KERNEL_LOGGER_NAME KERNEL_LOGGER_NAMEA
+#define GLOBAL_LOGGER_NAME GLOBAL_LOGGER_NAMEA
+#define EVENT_LOGGER_NAME EVENT_LOGGER_NAMEA
+#endif /* defined(_UNICODE) || defined(UNICODE) */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXTERN_C ULONG WMIAPI StartTraceW(PTRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI StartTraceA(PTRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI StopTraceW(TRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI StopTraceA(TRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI QueryTraceW(TRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI QueryTraceA(TRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI UpdateTraceW(TRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI UpdateTraceA(TRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI FlushTraceW(TRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI FlushTraceA(TRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties);
+EXTERN_C ULONG WMIAPI ControlTraceW(TRACEHANDLE TraceHandle,LPCWSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties,ULONG ControlCode);
+EXTERN_C ULONG WMIAPI ControlTraceA(TRACEHANDLE TraceHandle,LPCSTR InstanceName,PEVENT_TRACE_PROPERTIES Properties,ULONG ControlCode);
+EXTERN_C ULONG WMIAPI QueryAllTracesW(PEVENT_TRACE_PROPERTIES *PropertyArray,ULONG PropertyArrayCount,PULONG LoggerCount);
+EXTERN_C ULONG WMIAPI QueryAllTracesA(PEVENT_TRACE_PROPERTIES *PropertyArray,ULONG PropertyArrayCount,PULONG LoggerCount);
+EXTERN_C ULONG WMIAPI EnableTrace(ULONG Enable,ULONG EnableFlag,ULONG EnableLevel,LPCGUID ControlGuid,TRACEHANDLE TraceHandle);
+
+#if (_WIN32_WINNT >= 0x0600)
+EXTERN_C ULONG WMIAPI EnableTraceEx(
+ LPCGUID ProviderId,
+ LPCGUID SourceId,
+ TRACEHANDLE TraceHandle,
+ ULONG IsEnabled,
+ UCHAR Level,
+ ULONGLONG MatchAnyKeyword,
+ ULONGLONG MatchAllKeyword,
+ ULONG EnableProperty,
+ PEVENT_FILTER_DESCRIPTOR EnableFilterDesc
+);
+#endif /* _WIN32_WINNT >= 0x0600 */
+
+#define ENABLE_TRACE_PARAMETERS_VERSION 1
+
+typedef struct _ENABLE_TRACE_PARAMETERS {
+ ULONG Version;
+ ULONG EnableProperty;
+ ULONG ControlFlags;
+ GUID SourceId;
+ PEVENT_FILTER_DESCRIPTOR EnableFilterDesc;
+} ENABLE_TRACE_PARAMETERS, *PENABLE_TRACE_PARAMETERS;
+
+#if (_WIN32_WINNT >= 0x0601)
+EXTERN_C ULONG WMIAPI EnableTraceEx2(
+ TRACEHANDLE TraceHandle,
+ LPCGUID ProviderId,
+ ULONG ControlCode,
+ UCHAR Level,
+ ULONGLONG MatchAnyKeyword,
+ ULONGLONG MatchAllKeyword,
+ ULONG Timeout,
+ PENABLE_TRACE_PARAMETERS EnableParameters
+);
+#endif /* _WIN32_WINNT >= 0x0601 */
+
+typedef enum _TRACE_QUERY_INFO_CLASS {
+ TraceGuidQueryList,
+ TraceGuidQueryInfo,
+ TraceGuidQueryProcess,
+ TraceStackTracingInfo,
+ MaxTraceSetInfoClass
+} TRACE_QUERY_INFO_CLASS, TRACE_INFO_CLASS;
+
+#if (_WIN32_WINNT >= 0x0600)
+EXTERN_C ULONG WMIAPI EnumerateTraceGuidsEx(
+ TRACE_QUERY_INFO_CLASS TraceQueryInfoClass,
+ PVOID InBuffer,
+ ULONG InBufferSize,
+ PVOID OutBuffer,
+ ULONG OutBufferSize,
+ PULONG ReturnLength
+);
+#endif /* _WIN32_WINNT >= 0x0600 */
+
+/*To enable the read event type for disk IO events, set GUID to 3d6fa8d4-fe05-11d0-9dda-00c04fd7ba7c and Type to 10.*/
+typedef struct _CLASSIC_EVENT_ID {
+ GUID EventGuid;
+ UCHAR Type;
+ UCHAR Reserved[7];
+} CLASSIC_EVENT_ID, *PCLASSIC_EVENT_ID;
+
+#if (_WIN32_WINNT >= 0x0601)
+EXTERN_C ULONG WMIAPI TraceSetInformation(
+ TRACEHANDLE SessionHandle,
+ TRACE_INFO_CLASS InformationClass,
+ PVOID TraceInformation,
+ ULONG InformationLength
+);
+#endif /* _WIN32_WINNT >= 0x0601 */
+
+EXTERN_C ULONG WMIAPI CreateTraceInstanceId(HANDLE RegHandle,PEVENT_INSTANCE_INFO pInstInfo);
+EXTERN_C ULONG WMIAPI TraceEvent(TRACEHANDLE TraceHandle,PEVENT_TRACE_HEADER EventTrace);
+EXTERN_C ULONG WMIAPI TraceEventInstance(TRACEHANDLE TraceHandle,PEVENT_INSTANCE_HEADER EventTrace,PEVENT_INSTANCE_INFO pInstInfo,PEVENT_INSTANCE_INFO pParentInstInfo);
+EXTERN_C ULONG WMIAPI RegisterTraceGuidsW(WMIDPREQUEST RequestAddress,PVOID RequestContext,LPCGUID ControlGuid,ULONG GuidCount,PTRACE_GUID_REGISTRATION TraceGuidReg,LPCWSTR MofImagePath,LPCWSTR MofResourceName,PTRACEHANDLE RegistrationHandle);
+EXTERN_C ULONG WMIAPI RegisterTraceGuidsA(WMIDPREQUEST RequestAddress,PVOID RequestContext,LPCGUID ControlGuid,ULONG GuidCount,PTRACE_GUID_REGISTRATION TraceGuidReg,LPCSTR MofImagePath,LPCSTR MofResourceName,PTRACEHANDLE RegistrationHandle);
+EXTERN_C ULONG WMIAPI EnumerateTraceGuids(PTRACE_GUID_PROPERTIES *GuidPropertiesArray,ULONG PropertyArrayCount,PULONG GuidCount);
+EXTERN_C ULONG WMIAPI UnregisterTraceGuids(TRACEHANDLE RegistrationHandle);
+EXTERN_C TRACEHANDLE WMIAPI GetTraceLoggerHandle(PVOID Buffer);
+EXTERN_C UCHAR WMIAPI GetTraceEnableLevel(TRACEHANDLE TraceHandle);
+EXTERN_C ULONG WMIAPI GetTraceEnableFlags(TRACEHANDLE TraceHandle);
+EXTERN_C TRACEHANDLE WMIAPI OpenTraceA(PEVENT_TRACE_LOGFILEA Logfile);
+EXTERN_C TRACEHANDLE WMIAPI OpenTraceW(PEVENT_TRACE_LOGFILEW Logfile);
+EXTERN_C ULONG WMIAPI ProcessTrace(PTRACEHANDLE HandleArray,ULONG HandleCount,LPFILETIME StartTime,LPFILETIME EndTime);
+EXTERN_C ULONG WMIAPI CloseTrace(TRACEHANDLE TraceHandle);
+EXTERN_C ULONG WMIAPI SetTraceCallback(LPCGUID pGuid,PEVENT_CALLBACK EventCallback);
+EXTERN_C ULONG WMIAPI RemoveTraceCallback (LPCGUID pGuid);
+EXTERN_C ULONG __cdecl TraceMessage(TRACEHANDLE LoggerHandle,ULONG MessageFlags,LPCGUID MessageGuid,USHORT MessageNumber,...);
+EXTERN_C ULONG WMIAPI TraceMessageVa(TRACEHANDLE LoggerHandle,ULONG MessageFlags,LPCGUID MessageGuid,USHORT MessageNumber,va_list MessageArgList);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define INVALID_PROCESSTRACE_HANDLE ((TRACEHANDLE)INVALID_HANDLE_VALUE)
+
+#if defined(UNICODE) || defined(_UNICODE)
+#define RegisterTraceGuids RegisterTraceGuidsW
+#define StartTrace StartTraceW
+#define ControlTrace ControlTraceW
+
+#if defined(__TRACE_W2K_COMPATIBLE)
+#define StopTrace(a,b,c) ControlTraceW((a),(b),(c),EVENT_TRACE_CONTROL_STOP)
+#define QueryTrace(a,b,c) ControlTraceW((a),(b),(c),EVENT_TRACE_CONTROL_QUERY)
+#define UpdateTrace(a,b,c) ControlTraceW((a),(b),(c),EVENT_TRACE_CONTROL_UPDATE)
+#else
+#define StopTrace StopTraceW
+#define QueryTrace QueryTraceW
+#define UpdateTrace UpdateTraceW
+#endif /* defined(__TRACE_W2K_COMPATIBLE) */
+
+#define FlushTrace FlushTraceW
+#define QueryAllTraces QueryAllTracesW
+#define OpenTrace OpenTraceW
+
+#else /* defined(UNICODE) || defined(_UNICODE) */
+
+#define RegisterTraceGuids RegisterTraceGuidsA
+#define StartTrace StartTraceA
+#define ControlTrace ControlTraceA
+
+#if defined(__TRACE_W2K_COMPATIBLE)
+#define StopTrace(a,b,c) ControlTraceA((a),(b),(c),EVENT_TRACE_CONTROL_STOP)
+#define QueryTrace(a,b,c) ControlTraceA((a),(b),(c),EVENT_TRACE_CONTROL_QUERY)
+#define UpdateTrace(a,b,c) ControlTraceA((a),(b),(c),EVENT_TRACE_CONTROL_UPDATE)
+#else
+#define StopTrace StopTraceA
+#define QueryTrace QueryTraceA
+#define UpdateTrace UpdateTraceA
+#endif /* defined(__TRACE_W2K_COMPATIBLE) */
+
+#define FlushTrace FlushTraceA
+#define QueryAllTraces QueryAllTracesA
+#define OpenTrace OpenTraceA
+#endif /* defined(UNICODE) || defined(_UNICODE) */
+
+#endif /* !defined(_WMIKM_) && !defined(_NTDDK_) && !defined(_NTIFS_) */
+
+#endif /* defined(_WINNT_) || defined(WINNT) */
+
+#endif /* _EVNTRACE_ */
+
diff --git a/src/win32ctl/include/pdh.h b/src/win32ctl/include/pdh.h
new file mode 100644
index 0000000..d7828a4
--- /dev/null
+++ b/src/win32ctl/include/pdh.h
@@ -0,0 +1,605 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _PDH_H_
+#define _PDH_H_
+
+/* --- start added by kenj */
+#undef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+/* --- end added by kenj */
+
+#include <_mingw_unicode.h>
+#include <windows.h>
+#include <winperf.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef LONG PDH_STATUS;
+
+#define PDH_FUNCTION PDH_STATUS WINAPI
+
+#define PDH_CVERSION_WIN40 ((DWORD)(0x0400))
+#define PDH_CVERSION_WIN50 ((DWORD)(0x0500))
+
+#define PDH_VERSION ((DWORD)((PDH_CVERSION_WIN50) + 0x0003))
+
+#define IsSuccessSeverity(ErrorCode) ((((DWORD)(ErrorCode) & (0xC0000000L))==0x00000000L) ? TRUE : FALSE)
+#define IsInformationalSeverity(ErrorCode) ((((DWORD)(ErrorCode) & (0xC0000000L))==0x40000000L) ? TRUE : FALSE)
+#define IsWarningSeverity(ErrorCode) ((((DWORD)(ErrorCode) & (0xC0000000L))==0x80000000L) ? TRUE : FALSE)
+#define IsErrorSeverity(ErrorCode) ((((DWORD)(ErrorCode) & (0xC0000000L))==0xC0000000L) ? TRUE : FALSE)
+
+#define MAX_COUNTER_PATH 256
+
+#define PDH_MAX_COUNTER_NAME 1024
+#define PDH_MAX_INSTANCE_NAME 1024
+#define PDH_MAX_COUNTER_PATH 2048
+#define PDH_MAX_DATASOURCE_PATH 1024
+
+ typedef HANDLE PDH_HCOUNTER;
+ typedef HANDLE PDH_HQUERY;
+ typedef HANDLE PDH_HLOG;
+
+ typedef PDH_HCOUNTER HCOUNTER;
+ typedef PDH_HQUERY HQUERY;
+#ifndef _LMHLOGDEFINED_
+ typedef PDH_HLOG HLOG;
+#endif
+
+#ifdef INVALID_HANDLE_VALUE
+#undef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE ((HANDLE)((LONG_PTR)-1))
+#endif
+
+#define H_REALTIME_DATASOURCE NULL
+#define H_WBEM_DATASOURCE INVALID_HANDLE_VALUE
+
+ typedef struct _PDH_RAW_COUNTER {
+ DWORD CStatus;
+ FILETIME TimeStamp;
+ LONGLONG FirstValue;
+ LONGLONG SecondValue;
+ DWORD MultiCount;
+ } PDH_RAW_COUNTER,*PPDH_RAW_COUNTER;
+
+ typedef struct _PDH_RAW_COUNTER_ITEM_A {
+ LPSTR szName;
+ PDH_RAW_COUNTER RawValue;
+ } PDH_RAW_COUNTER_ITEM_A,*PPDH_RAW_COUNTER_ITEM_A;
+
+ typedef struct _PDH_RAW_COUNTER_ITEM_W {
+ LPWSTR szName;
+ PDH_RAW_COUNTER RawValue;
+ } PDH_RAW_COUNTER_ITEM_W,*PPDH_RAW_COUNTER_ITEM_W;
+
+ typedef struct _PDH_FMT_COUNTERVALUE {
+ DWORD CStatus;
+ __MINGW_EXTENSION union {
+ LONG longValue;
+ double doubleValue;
+ LONGLONG largeValue;
+ LPCSTR AnsiStringValue;
+ LPCWSTR WideStringValue;
+ };
+ } PDH_FMT_COUNTERVALUE,*PPDH_FMT_COUNTERVALUE;
+
+ typedef struct _PDH_FMT_COUNTERVALUE_ITEM_A {
+ LPSTR szName;
+ PDH_FMT_COUNTERVALUE FmtValue;
+ } PDH_FMT_COUNTERVALUE_ITEM_A,*PPDH_FMT_COUNTERVALUE_ITEM_A;
+
+ typedef struct _PDH_FMT_COUNTERVALUE_ITEM_W {
+ LPWSTR szName;
+ PDH_FMT_COUNTERVALUE FmtValue;
+ } PDH_FMT_COUNTERVALUE_ITEM_W,*PPDH_FMT_COUNTERVALUE_ITEM_W;
+
+ typedef struct _PDH_STATISTICS {
+ DWORD dwFormat;
+ DWORD count;
+ PDH_FMT_COUNTERVALUE min;
+ PDH_FMT_COUNTERVALUE max;
+ PDH_FMT_COUNTERVALUE mean;
+ } PDH_STATISTICS,*PPDH_STATISTICS;
+
+ typedef struct _PDH_COUNTER_PATH_ELEMENTS_A {
+ LPSTR szMachineName;
+ LPSTR szObjectName;
+ LPSTR szInstanceName;
+ LPSTR szParentInstance;
+ DWORD dwInstanceIndex;
+ LPSTR szCounterName;
+ } PDH_COUNTER_PATH_ELEMENTS_A,*PPDH_COUNTER_PATH_ELEMENTS_A;
+
+ typedef struct _PDH_COUNTER_PATH_ELEMENTS_W {
+ LPWSTR szMachineName;
+ LPWSTR szObjectName;
+ LPWSTR szInstanceName;
+ LPWSTR szParentInstance;
+ DWORD dwInstanceIndex;
+ LPWSTR szCounterName;
+ } PDH_COUNTER_PATH_ELEMENTS_W,*PPDH_COUNTER_PATH_ELEMENTS_W;
+
+ typedef struct _PDH_DATA_ITEM_PATH_ELEMENTS_A {
+ LPSTR szMachineName;
+ GUID ObjectGUID;
+ DWORD dwItemId;
+ LPSTR szInstanceName;
+ } PDH_DATA_ITEM_PATH_ELEMENTS_A,*PPDH_DATA_ITEM_PATH_ELEMENTS_A;
+
+ typedef struct _PDH_DATA_ITEM_PATH_ELEMENTS_W {
+ LPWSTR szMachineName;
+ GUID ObjectGUID;
+ DWORD dwItemId;
+ LPWSTR szInstanceName;
+ } PDH_DATA_ITEM_PATH_ELEMENTS_W,*PPDH_DATA_ITEM_PATH_ELEMENTS_W;
+
+ typedef struct _PDH_COUNTER_INFO_A {
+ DWORD dwLength;
+ DWORD dwType;
+ DWORD CVersion;
+ DWORD CStatus;
+ LONG lScale;
+ LONG lDefaultScale;
+ DWORD_PTR dwUserData;
+ DWORD_PTR dwQueryUserData;
+ LPSTR szFullPath;
+ __MINGW_EXTENSION union {
+ PDH_DATA_ITEM_PATH_ELEMENTS_A DataItemPath;
+ PDH_COUNTER_PATH_ELEMENTS_A CounterPath;
+ __MINGW_EXTENSION struct {
+ LPSTR szMachineName;
+ LPSTR szObjectName;
+ LPSTR szInstanceName;
+ LPSTR szParentInstance;
+ DWORD dwInstanceIndex;
+ LPSTR szCounterName;
+ };
+ };
+ LPSTR szExplainText;
+ DWORD DataBuffer[1];
+ } PDH_COUNTER_INFO_A,*PPDH_COUNTER_INFO_A;
+
+ typedef struct _PDH_COUNTER_INFO_W {
+ DWORD dwLength;
+ DWORD dwType;
+ DWORD CVersion;
+ DWORD CStatus;
+ LONG lScale;
+ LONG lDefaultScale;
+ DWORD_PTR dwUserData;
+ DWORD_PTR dwQueryUserData;
+ LPWSTR szFullPath;
+ __MINGW_EXTENSION union {
+ PDH_DATA_ITEM_PATH_ELEMENTS_W DataItemPath;
+ PDH_COUNTER_PATH_ELEMENTS_W CounterPath;
+ __MINGW_EXTENSION struct {
+ LPWSTR szMachineName;
+ LPWSTR szObjectName;
+ LPWSTR szInstanceName;
+ LPWSTR szParentInstance;
+ DWORD dwInstanceIndex;
+ LPWSTR szCounterName;
+ };
+ };
+ LPWSTR szExplainText;
+ DWORD DataBuffer[1];
+ } PDH_COUNTER_INFO_W,*PPDH_COUNTER_INFO_W;
+
+ typedef struct _PDH_TIME_INFO {
+ LONGLONG StartTime;
+ LONGLONG EndTime;
+ DWORD SampleCount;
+ } PDH_TIME_INFO,*PPDH_TIME_INFO;
+
+ typedef struct _PDH_RAW_LOG_RECORD {
+ DWORD dwStructureSize;
+ DWORD dwRecordType;
+ DWORD dwItems;
+ UCHAR RawBytes[1];
+ } PDH_RAW_LOG_RECORD,*PPDH_RAW_LOG_RECORD;
+
+ typedef struct _PDH_LOG_SERVICE_QUERY_INFO_A {
+ DWORD dwSize;
+ DWORD dwFlags;
+ DWORD dwLogQuota;
+ LPSTR szLogFileCaption;
+ LPSTR szDefaultDir;
+ LPSTR szBaseFileName;
+ DWORD dwFileType;
+ DWORD dwReserved;
+ __MINGW_EXTENSION union {
+ __MINGW_EXTENSION struct {
+ DWORD PdlAutoNameInterval;
+ DWORD PdlAutoNameUnits;
+ LPSTR PdlCommandFilename;
+ LPSTR PdlCounterList;
+ DWORD PdlAutoNameFormat;
+ DWORD PdlSampleInterval;
+ FILETIME PdlLogStartTime;
+ FILETIME PdlLogEndTime;
+ };
+ __MINGW_EXTENSION struct {
+ DWORD TlNumberOfBuffers;
+ DWORD TlMinimumBuffers;
+ DWORD TlMaximumBuffers;
+ DWORD TlFreeBuffers;
+ DWORD TlBufferSize;
+ DWORD TlEventsLost;
+ DWORD TlLoggerThreadId;
+ DWORD TlBuffersWritten;
+ DWORD TlLogHandle;
+ LPSTR TlLogFileName;
+ };
+ };
+ } PDH_LOG_SERVICE_QUERY_INFO_A,*PPDH_LOG_SERVICE_QUERY_INFO_A;
+
+ typedef struct _PDH_LOG_SERVICE_QUERY_INFO_W {
+ DWORD dwSize;
+ DWORD dwFlags;
+ DWORD dwLogQuota;
+ LPWSTR szLogFileCaption;
+ LPWSTR szDefaultDir;
+ LPWSTR szBaseFileName;
+ DWORD dwFileType;
+ DWORD dwReserved;
+ __MINGW_EXTENSION union {
+ __MINGW_EXTENSION struct {
+ DWORD PdlAutoNameInterval;
+ DWORD PdlAutoNameUnits;
+ LPWSTR PdlCommandFilename;
+ LPWSTR PdlCounterList;
+ DWORD PdlAutoNameFormat;
+ DWORD PdlSampleInterval;
+ FILETIME PdlLogStartTime;
+ FILETIME PdlLogEndTime;
+ };
+ __MINGW_EXTENSION struct {
+ DWORD TlNumberOfBuffers;
+ DWORD TlMinimumBuffers;
+ DWORD TlMaximumBuffers;
+ DWORD TlFreeBuffers;
+ DWORD TlBufferSize;
+ DWORD TlEventsLost;
+ DWORD TlLoggerThreadId;
+ DWORD TlBuffersWritten;
+ DWORD TlLogHandle;
+ LPWSTR TlLogFileName;
+ };
+ };
+ } PDH_LOG_SERVICE_QUERY_INFO_W,*PPDH_LOG_SERVICE_QUERY_INFO_W;
+
+#define MAX_TIME_VALUE ((LONGLONG) 0x7FFFFFFFFFFFFFFF)
+#define MIN_TIME_VALUE ((LONGLONG) 0)
+
+ PDH_FUNCTION PdhGetDllVersion(LPDWORD lpdwVersion);
+ PDH_FUNCTION PdhOpenQueryW(LPCWSTR szDataSource,DWORD_PTR dwUserData,PDH_HQUERY *phQuery);
+ PDH_FUNCTION PdhOpenQueryA(LPCSTR szDataSource,DWORD_PTR dwUserData,PDH_HQUERY *phQuery);
+ PDH_FUNCTION PdhAddCounterW(PDH_HQUERY hQuery,LPCWSTR szFullCounterPath,DWORD_PTR dwUserData,PDH_HCOUNTER *phCounter);
+ PDH_FUNCTION PdhAddCounterA(PDH_HQUERY hQuery,LPCSTR szFullCounterPath,DWORD_PTR dwUserData,PDH_HCOUNTER *phCounter);
+ PDH_FUNCTION PdhRemoveCounter(PDH_HCOUNTER hCounter);
+ PDH_FUNCTION PdhCollectQueryData(PDH_HQUERY hQuery);
+ PDH_FUNCTION PdhCloseQuery(PDH_HQUERY hQuery);
+ PDH_FUNCTION PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter,DWORD dwFormat,LPDWORD lpdwType,PPDH_FMT_COUNTERVALUE pValue);
+ PDH_FUNCTION PdhGetFormattedCounterArrayA(PDH_HCOUNTER hCounter,DWORD dwFormat,LPDWORD lpdwBufferSize,LPDWORD lpdwItemCount,PPDH_FMT_COUNTERVALUE_ITEM_A ItemBuffer);
+ PDH_FUNCTION PdhGetFormattedCounterArrayW(PDH_HCOUNTER hCounter,DWORD dwFormat,LPDWORD lpdwBufferSize,LPDWORD lpdwItemCount,PPDH_FMT_COUNTERVALUE_ITEM_W ItemBuffer);
+
+#define PDH_FMT_RAW ((DWORD) 0x00000010)
+#define PDH_FMT_ANSI ((DWORD) 0x00000020)
+#define PDH_FMT_UNICODE ((DWORD) 0x00000040)
+#define PDH_FMT_LONG ((DWORD) 0x00000100)
+#define PDH_FMT_DOUBLE ((DWORD) 0x00000200)
+#define PDH_FMT_LARGE ((DWORD) 0x00000400)
+#define PDH_FMT_NOSCALE ((DWORD) 0x00001000)
+#define PDH_FMT_1000 ((DWORD) 0x00002000)
+#define PDH_FMT_NODATA ((DWORD) 0x00004000)
+#define PDH_FMT_NOCAP100 ((DWORD) 0x00008000)
+#define PERF_DETAIL_COSTLY ((DWORD) 0x00010000)
+#define PERF_DETAIL_STANDARD ((DWORD) 0x0000FFFF)
+
+ PDH_FUNCTION PdhGetRawCounterValue(PDH_HCOUNTER hCounter,LPDWORD lpdwType,PPDH_RAW_COUNTER pValue);
+ PDH_FUNCTION PdhGetRawCounterArrayA(PDH_HCOUNTER hCounter,LPDWORD lpdwBufferSize,LPDWORD lpdwItemCount,PPDH_RAW_COUNTER_ITEM_A ItemBuffer);
+ PDH_FUNCTION PdhGetRawCounterArrayW(PDH_HCOUNTER hCounter,LPDWORD lpdwBufferSize,LPDWORD lpdwItemCount,PPDH_RAW_COUNTER_ITEM_W ItemBuffer);
+ PDH_FUNCTION PdhCalculateCounterFromRawValue(PDH_HCOUNTER hCounter,DWORD dwFormat,PPDH_RAW_COUNTER rawValue1,PPDH_RAW_COUNTER rawValue2,PPDH_FMT_COUNTERVALUE fmtValue);
+ PDH_FUNCTION PdhComputeCounterStatistics(PDH_HCOUNTER hCounter,DWORD dwFormat,DWORD dwFirstEntry,DWORD dwNumEntries,PPDH_RAW_COUNTER lpRawValueArray,PPDH_STATISTICS data);
+ PDH_FUNCTION PdhGetCounterInfoW(PDH_HCOUNTER hCounter,BOOLEAN bRetrieveExplainText,LPDWORD pdwBufferSize,PPDH_COUNTER_INFO_W lpBuffer);
+ PDH_FUNCTION PdhGetCounterInfoA(PDH_HCOUNTER hCounter,BOOLEAN bRetrieveExplainText,LPDWORD pdwBufferSize,PPDH_COUNTER_INFO_A lpBuffer);
+
+#define PDH_MAX_SCALE (7L)
+#define PDH_MIN_SCALE (-7L)
+
+ PDH_FUNCTION PdhSetCounterScaleFactor(PDH_HCOUNTER hCounter,LONG lFactor);
+ PDH_FUNCTION PdhConnectMachineW(LPCWSTR szMachineName);
+ PDH_FUNCTION PdhConnectMachineA(LPCSTR szMachineName);
+ PDH_FUNCTION PdhEnumMachinesW(LPCWSTR szDataSource,LPWSTR mszMachineList,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhEnumMachinesA(LPCSTR szDataSource,LPSTR mszMachineList,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhEnumObjectsW(LPCWSTR szDataSource,LPCWSTR szMachineName,LPWSTR mszObjectList,LPDWORD pcchBufferSize,DWORD dwDetailLevel,WINBOOL bRefresh);
+ PDH_FUNCTION PdhEnumObjectsA(LPCSTR szDataSource,LPCSTR szMachineName,LPSTR mszObjectList,LPDWORD pcchBufferSize,DWORD dwDetailLevel,WINBOOL bRefresh);
+ PDH_FUNCTION PdhEnumObjectItemsW(LPCWSTR szDataSource,LPCWSTR szMachineName,LPCWSTR szObjectName,LPWSTR mszCounterList,LPDWORD pcchCounterListLength,LPWSTR mszInstanceList,LPDWORD pcchInstanceListLength,DWORD dwDetailLevel,DWORD dwFlags);
+ PDH_FUNCTION PdhEnumObjectItemsA(LPCSTR szDataSource,LPCSTR szMachineName,LPCSTR szObjectName,LPSTR mszCounterList,LPDWORD pcchCounterListLength,LPSTR mszInstanceList,LPDWORD pcchInstanceListLength,DWORD dwDetailLevel,DWORD dwFlags);
+
+#define PDH_OBJECT_HAS_INSTANCES ((DWORD) 0x00000001)
+
+ PDH_FUNCTION PdhMakeCounterPathW(PPDH_COUNTER_PATH_ELEMENTS_W pCounterPathElements,LPWSTR szFullPathBuffer,LPDWORD pcchBufferSize,DWORD dwFlags);
+ PDH_FUNCTION PdhMakeCounterPathA(PPDH_COUNTER_PATH_ELEMENTS_A pCounterPathElements,LPSTR szFullPathBuffer,LPDWORD pcchBufferSize,DWORD dwFlags);
+ PDH_FUNCTION PdhParseCounterPathW(LPCWSTR szFullPathBuffer,PPDH_COUNTER_PATH_ELEMENTS_W pCounterPathElements,LPDWORD pdwBufferSize,DWORD dwFlags);
+ PDH_FUNCTION PdhParseCounterPathA(LPCSTR szFullPathBuffer,PPDH_COUNTER_PATH_ELEMENTS_A pCounterPathElements,LPDWORD pdwBufferSize,DWORD dwFlags);
+
+#define PDH_PATH_WBEM_RESULT ((DWORD) 0x00000001)
+#define PDH_PATH_WBEM_INPUT ((DWORD) 0x00000002)
+
+#define PDH_PATH_LANG_FLAGS(LangId,Flags) ((DWORD)(((LangId & 0x0000FFFF) << 16) | (Flags & 0x0000FFFF)))
+
+ PDH_FUNCTION PdhParseInstanceNameW(LPCWSTR szInstanceString,LPWSTR szInstanceName,LPDWORD pcchInstanceNameLength,LPWSTR szParentName,LPDWORD pcchParentNameLength,LPDWORD lpIndex);
+ PDH_FUNCTION PdhParseInstanceNameA(LPCSTR szInstanceString,LPSTR szInstanceName,LPDWORD pcchInstanceNameLength,LPSTR szParentName,LPDWORD pcchParentNameLength,LPDWORD lpIndex);
+ PDH_FUNCTION PdhValidatePathW(LPCWSTR szFullPathBuffer);
+ PDH_FUNCTION PdhValidatePathA(LPCSTR szFullPathBuffer);
+ PDH_FUNCTION PdhGetDefaultPerfObjectW(LPCWSTR szDataSource,LPCWSTR szMachineName,LPWSTR szDefaultObjectName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfObjectA(LPCSTR szDataSource,LPCSTR szMachineName,LPSTR szDefaultObjectName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfCounterW(LPCWSTR szDataSource,LPCWSTR szMachineName,LPCWSTR szObjectName,LPWSTR szDefaultCounterName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfCounterA(LPCSTR szDataSource,LPCSTR szMachineName,LPCSTR szObjectName,LPSTR szDefaultCounterName,LPDWORD pcchBufferSize);
+
+ typedef PDH_STATUS (WINAPI *CounterPathCallBack)(DWORD_PTR);
+
+ typedef struct _BrowseDlgConfig_HW {
+ DWORD bIncludeInstanceIndex : 1,bSingleCounterPerAdd : 1,bSingleCounterPerDialog : 1,bLocalCountersOnly : 1,bWildCardInstances : 1,bHideDetailBox : 1,bInitializePath : 1,bDisableMachineSelection : 1,bIncludeCostlyObjects : 1,bShowObjectBrowser : 1,bReserved : 22;
+ HWND hWndOwner;
+ PDH_HLOG hDataSource;
+ LPWSTR szReturnPathBuffer;
+ DWORD cchReturnPathLength;
+ CounterPathCallBack pCallBack;
+ DWORD_PTR dwCallBackArg;
+ PDH_STATUS CallBackStatus;
+ DWORD dwDefaultDetailLevel;
+ LPWSTR szDialogBoxCaption;
+ } PDH_BROWSE_DLG_CONFIG_HW,*PPDH_BROWSE_DLG_CONFIG_HW;
+
+ typedef struct _BrowseDlgConfig_HA {
+ DWORD bIncludeInstanceIndex : 1,bSingleCounterPerAdd : 1,bSingleCounterPerDialog : 1,bLocalCountersOnly : 1,bWildCardInstances : 1,bHideDetailBox : 1,bInitializePath : 1,bDisableMachineSelection : 1,bIncludeCostlyObjects : 1,bShowObjectBrowser : 1,bReserved:22;
+ HWND hWndOwner;
+ PDH_HLOG hDataSource;
+ LPSTR szReturnPathBuffer;
+ DWORD cchReturnPathLength;
+ CounterPathCallBack pCallBack;
+ DWORD_PTR dwCallBackArg;
+ PDH_STATUS CallBackStatus;
+ DWORD dwDefaultDetailLevel;
+ LPSTR szDialogBoxCaption;
+ } PDH_BROWSE_DLG_CONFIG_HA,*PPDH_BROWSE_DLG_CONFIG_HA;
+
+ typedef struct _BrowseDlgConfig_W {
+ DWORD bIncludeInstanceIndex : 1,bSingleCounterPerAdd : 1,bSingleCounterPerDialog : 1,bLocalCountersOnly : 1,bWildCardInstances : 1,bHideDetailBox : 1,bInitializePath : 1,bDisableMachineSelection : 1,bIncludeCostlyObjects : 1,bShowObjectBrowser : 1,bReserved:22;
+ HWND hWndOwner;
+ LPWSTR szDataSource;
+ LPWSTR szReturnPathBuffer;
+ DWORD cchReturnPathLength;
+ CounterPathCallBack pCallBack;
+ DWORD_PTR dwCallBackArg;
+ PDH_STATUS CallBackStatus;
+ DWORD dwDefaultDetailLevel;
+ LPWSTR szDialogBoxCaption;
+ } PDH_BROWSE_DLG_CONFIG_W,*PPDH_BROWSE_DLG_CONFIG_W;
+
+ typedef struct _BrowseDlgConfig_A {
+ DWORD bIncludeInstanceIndex : 1,bSingleCounterPerAdd : 1,bSingleCounterPerDialog : 1,bLocalCountersOnly : 1,bWildCardInstances : 1,bHideDetailBox : 1,bInitializePath : 1,bDisableMachineSelection : 1,bIncludeCostlyObjects : 1,bShowObjectBrowser : 1,bReserved:22;
+ HWND hWndOwner;
+ LPSTR szDataSource;
+ LPSTR szReturnPathBuffer;
+ DWORD cchReturnPathLength;
+ CounterPathCallBack pCallBack;
+ DWORD_PTR dwCallBackArg;
+ PDH_STATUS CallBackStatus;
+ DWORD dwDefaultDetailLevel;
+ LPSTR szDialogBoxCaption;
+ } PDH_BROWSE_DLG_CONFIG_A,*PPDH_BROWSE_DLG_CONFIG_A;
+
+ PDH_FUNCTION PdhBrowseCountersW(PPDH_BROWSE_DLG_CONFIG_W pBrowseDlgData);
+ PDH_FUNCTION PdhBrowseCountersA(PPDH_BROWSE_DLG_CONFIG_A pBrowseDlgData);
+ PDH_FUNCTION PdhExpandCounterPathW(LPCWSTR szWildCardPath,LPWSTR mszExpandedPathList,LPDWORD pcchPathListLength);
+ PDH_FUNCTION PdhExpandCounterPathA(LPCSTR szWildCardPath,LPSTR mszExpandedPathList,LPDWORD pcchPathListLength);
+ PDH_FUNCTION PdhLookupPerfNameByIndexW(LPCWSTR szMachineName,DWORD dwNameIndex,LPWSTR szNameBuffer,LPDWORD pcchNameBufferSize);
+ PDH_FUNCTION PdhLookupPerfNameByIndexA(LPCSTR szMachineName,DWORD dwNameIndex,LPSTR szNameBuffer,LPDWORD pcchNameBufferSize);
+ PDH_FUNCTION PdhLookupPerfIndexByNameW(LPCWSTR szMachineName,LPCWSTR szNameBuffer,LPDWORD pdwIndex);
+ PDH_FUNCTION PdhLookupPerfIndexByNameA(LPCSTR szMachineName,LPCSTR szNameBuffer,LPDWORD pdwIndex);
+
+#define PDH_NOEXPANDCOUNTERS 1
+#define PDH_NOEXPANDINSTANCES 2
+#define PDH_REFRESHCOUNTERS 4
+
+ PDH_FUNCTION PdhExpandWildCardPathA(LPCSTR szDataSource,LPCSTR szWildCardPath,LPSTR mszExpandedPathList,LPDWORD pcchPathListLength,DWORD dwFlags);
+ PDH_FUNCTION PdhExpandWildCardPathW(LPCWSTR szDataSource,LPCWSTR szWildCardPath,LPWSTR mszExpandedPathList,LPDWORD pcchPathListLength,DWORD dwFlags);
+
+#define PDH_LOG_READ_ACCESS ((DWORD) 0x00010000)
+#define PDH_LOG_WRITE_ACCESS ((DWORD) 0x00020000)
+#define PDH_LOG_UPDATE_ACCESS ((DWORD) 0x00040000)
+#define PDH_LOG_ACCESS_MASK ((DWORD) 0x000F0000)
+
+#define PDH_LOG_CREATE_NEW ((DWORD) 0x00000001)
+#define PDH_LOG_CREATE_ALWAYS ((DWORD) 0x00000002)
+#define PDH_LOG_OPEN_ALWAYS ((DWORD) 0x00000003)
+#define PDH_LOG_OPEN_EXISTING ((DWORD) 0x00000004)
+#define PDH_LOG_CREATE_MASK ((DWORD) 0x0000000F)
+
+#define PDH_LOG_OPT_USER_STRING ((DWORD) 0x01000000)
+#define PDH_LOG_OPT_CIRCULAR ((DWORD) 0x02000000)
+#define PDH_LOG_OPT_MAX_IS_BYTES ((DWORD) 0x04000000)
+#define PDH_LOG_OPT_APPEND ((DWORD) 0x08000000)
+#define PDH_LOG_OPT_MASK ((DWORD) 0x0F000000)
+
+#define PDH_LOG_TYPE_UNDEFINED 0
+#define PDH_LOG_TYPE_CSV 1
+#define PDH_LOG_TYPE_TSV 2
+
+#define PDH_LOG_TYPE_TRACE_KERNEL 4
+#define PDH_LOG_TYPE_TRACE_GENERIC 5
+#define PDH_LOG_TYPE_PERFMON 6
+#define PDH_LOG_TYPE_SQL 7
+#define PDH_LOG_TYPE_BINARY 8
+
+ PDH_FUNCTION PdhOpenLogW(LPCWSTR szLogFileName,DWORD dwAccessFlags,LPDWORD lpdwLogType,PDH_HQUERY hQuery,DWORD dwMaxSize,LPCWSTR szUserCaption,PDH_HLOG *phLog);
+ PDH_FUNCTION PdhOpenLogA(LPCSTR szLogFileName,DWORD dwAccessFlags,LPDWORD lpdwLogType,PDH_HQUERY hQuery,DWORD dwMaxSize,LPCSTR szUserCaption,PDH_HLOG *phLog);
+ PDH_FUNCTION PdhUpdateLogW(PDH_HLOG hLog,LPCWSTR szUserString);
+ PDH_FUNCTION PdhUpdateLogA(PDH_HLOG hLog,LPCSTR szUserString);
+ PDH_FUNCTION PdhUpdateLogFileCatalog(PDH_HLOG hLog);
+ PDH_FUNCTION PdhGetLogFileSize(PDH_HLOG hLog,LONGLONG *llSize);
+ PDH_FUNCTION PdhCloseLog(PDH_HLOG hLog,DWORD dwFlags);
+
+#define PDH_FLAGS_CLOSE_QUERY ((DWORD) 0x00000001)
+#define PDH_FLAGS_FILE_BROWSER_ONLY ((DWORD) 0x00000001)
+
+ PDH_FUNCTION PdhSelectDataSourceW(HWND hWndOwner,DWORD dwFlags,LPWSTR szDataSource,LPDWORD pcchBufferLength);
+ PDH_FUNCTION PdhSelectDataSourceA(HWND hWndOwner,DWORD dwFlags,LPSTR szDataSource,LPDWORD pcchBufferLength);
+ WINBOOL PdhIsRealTimeQuery(PDH_HQUERY hQuery);
+ PDH_FUNCTION PdhSetQueryTimeRange(PDH_HQUERY hQuery,PPDH_TIME_INFO pInfo);
+ PDH_FUNCTION PdhGetDataSourceTimeRangeW(LPCWSTR szDataSource,LPDWORD pdwNumEntries,PPDH_TIME_INFO pInfo,LPDWORD pdwBufferSize);
+ PDH_FUNCTION PdhGetDataSourceTimeRangeA(LPCSTR szDataSource,LPDWORD pdwNumEntries,PPDH_TIME_INFO pInfo,LPDWORD dwBufferSize);
+ PDH_FUNCTION PdhCollectQueryDataEx(PDH_HQUERY hQuery,DWORD dwIntervalTime,HANDLE hNewDataEvent);
+ PDH_FUNCTION PdhFormatFromRawValue(DWORD dwCounterType,DWORD dwFormat,LONGLONG *pTimeBase,PPDH_RAW_COUNTER pRawValue1,PPDH_RAW_COUNTER pRawValue2,PPDH_FMT_COUNTERVALUE pFmtValue);
+ PDH_FUNCTION PdhGetCounterTimeBase(PDH_HCOUNTER hCounter,LONGLONG *pTimeBase);
+ PDH_FUNCTION PdhReadRawLogRecord(PDH_HLOG hLog,FILETIME ftRecord,PPDH_RAW_LOG_RECORD pRawLogRecord,LPDWORD pdwBufferLength);
+
+#define DATA_SOURCE_REGISTRY ((DWORD) 0x00000001)
+#define DATA_SOURCE_LOGFILE ((DWORD) 0x00000002)
+#define DATA_SOURCE_WBEM ((DWORD) 0x00000004)
+
+ PDH_FUNCTION PdhSetDefaultRealTimeDataSource(DWORD dwDataSourceId);
+ PDH_FUNCTION PdhBindInputDataSourceW(PDH_HLOG *phDataSource,LPCWSTR LogFileNameList);
+ PDH_FUNCTION PdhBindInputDataSourceA(PDH_HLOG *phDataSource,LPCSTR LogFileNameList);
+ PDH_FUNCTION PdhOpenQueryH(PDH_HLOG hDataSource,DWORD_PTR dwUserData,PDH_HQUERY *phQuery);
+ PDH_FUNCTION PdhEnumMachinesHW(PDH_HLOG hDataSource,LPWSTR mszMachineList,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhEnumMachinesHA(PDH_HLOG hDataSource,LPSTR mszMachineList,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhEnumObjectsHW(PDH_HLOG hDataSource,LPCWSTR szMachineName,LPWSTR mszObjectList,LPDWORD pcchBufferSize,DWORD dwDetailLevel,WINBOOL bRefresh);
+ PDH_FUNCTION PdhEnumObjectsHA(PDH_HLOG hDataSource,LPCSTR szMachineName,LPSTR mszObjectList,LPDWORD pcchBufferSize,DWORD dwDetailLevel,WINBOOL bRefresh);
+ PDH_FUNCTION PdhEnumObjectItemsHW(PDH_HLOG hDataSource,LPCWSTR szMachineName,LPCWSTR szObjectName,LPWSTR mszCounterList,LPDWORD pcchCounterListLength,LPWSTR mszInstanceList,LPDWORD pcchInstanceListLength,DWORD dwDetailLevel,DWORD dwFlags);
+ PDH_FUNCTION PdhEnumObjectItemsHA(PDH_HLOG hDataSource,LPCSTR szMachineName,LPCSTR szObjectName,LPSTR mszCounterList,LPDWORD pcchCounterListLength,LPSTR mszInstanceList,LPDWORD pcchInstanceListLength,DWORD dwDetailLevel,DWORD dwFlags);
+ PDH_FUNCTION PdhExpandWildCardPathHW(PDH_HLOG hDataSource,LPCWSTR szWildCardPath,LPWSTR mszExpandedPathList,LPDWORD pcchPathListLength,DWORD dwFlags);
+ PDH_FUNCTION PdhExpandWildCardPathHA(PDH_HLOG hDataSource,LPCSTR szWildCardPath,LPSTR mszExpandedPathList,LPDWORD pcchPathListLength,DWORD dwFlags);
+ PDH_FUNCTION PdhGetDataSourceTimeRangeH(PDH_HLOG hDataSource,LPDWORD pdwNumEntries,PPDH_TIME_INFO pInfo,LPDWORD pdwBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfObjectHW(PDH_HLOG hDataSource,LPCWSTR szMachineName,LPWSTR szDefaultObjectName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfObjectHA(PDH_HLOG hDataSource,LPCSTR szMachineName,LPSTR szDefaultObjectName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfCounterHW(PDH_HLOG hDataSource,LPCWSTR szMachineName,LPCWSTR szObjectName,LPWSTR szDefaultCounterName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhGetDefaultPerfCounterHA(PDH_HLOG hDataSource,LPCSTR szMachineName,LPCSTR szObjectName,LPSTR szDefaultCounterName,LPDWORD pcchBufferSize);
+ PDH_FUNCTION PdhBrowseCountersHW(PPDH_BROWSE_DLG_CONFIG_HW pBrowseDlgData);
+ PDH_FUNCTION PdhBrowseCountersHA(PPDH_BROWSE_DLG_CONFIG_HA pBrowseDlgData);
+ PDH_FUNCTION PdhVerifySQLDBW(LPCWSTR szDataSource);
+ PDH_FUNCTION PdhVerifySQLDBA(LPCSTR szDataSource);
+ PDH_FUNCTION PdhCreateSQLTablesW(LPCWSTR szDataSource);
+ PDH_FUNCTION PdhCreateSQLTablesA(LPCSTR szDataSource);
+ PDH_FUNCTION PdhEnumLogSetNamesW(LPCWSTR szDataSource,LPWSTR mszDataSetNameList,LPDWORD pcchBufferLength);
+ PDH_FUNCTION PdhEnumLogSetNamesA(LPCSTR szDataSource,LPSTR mszDataSetNameList,LPDWORD pcchBufferLength);
+ PDH_FUNCTION PdhGetLogSetGUID(PDH_HLOG hLog,GUID *pGuid,int *pRunId);
+ PDH_FUNCTION PdhSetLogSetRunID(PDH_HLOG hLog,int RunId);
+
+#if defined(UNICODE)
+#ifndef _UNICODE
+#define _UNICODE
+#endif
+#endif
+
+#if defined(_UNICODE)
+#if !defined(UNICODE)
+#define UNICODE
+#endif
+#endif
+
+#define PDH_COUNTER_INFO __MINGW_NAME_UAW(PDH_COUNTER_INFO)
+#define PPDH_COUNTER_INFO __MINGW_NAME_UAW(PPDH_COUNTER_INFO)
+#define PDH_COUNTER_PATH_ELEMENTS __MINGW_NAME_UAW(PDH_COUNTER_PATH_ELEMENTS)
+#define PPDH_COUNTER_PATH_ELEMENTS __MINGW_NAME_UAW(PPDH_COUNTER_PATH_ELEMENTS)
+#define PDH_BROWSE_DLG_CONFIG __MINGW_NAME_UAW(PDH_BROWSE_DLG_CONFIG)
+#define PPDH_BROWSE_DLG_CONFIG __MINGW_NAME_UAW(PPDH_BROWSE_DLG_CONFIG)
+#define PDH_FMT_COUNTERVALUE_ITEM __MINGW_NAME_UAW(PDH_FMT_COUNTERVALUE_ITEM)
+#define PPDH_FMT_COUNTERVALUE_ITEM __MINGW_NAME_UAW(PPDH_FMT_COUNTERVALUE_ITEM)
+#define PDH_RAW_COUNTER_ITEM __MINGW_NAME_UAW(PDH_RAW_COUNTER_ITEM)
+#define PPDH_RAW_COUNTER_ITEM __MINGW_NAME_UAW(PPDH_RAW_COUNTER_ITEM)
+#define PDH_LOG_SERVICE_QUERY_INFO __MINGW_NAME_UAW(PDH_LOG_SERVICE_QUERY_INFO)
+#define PPDH_LOG_SERVICE_QUERY_INFO __MINGW_NAME_UAW(PPDH_LOG_SERVICE_QUERY_INFO)
+
+#define PDH_BROWSE_DLG_CONFIG_H __MINGW_NAME_AW(PDH_BROWSE_DLG_CONFIG_H)
+#define PPDH_BROWSE_DLG_CONFIG_H __MINGW_NAME_AW(PPDH_BROWSE_DLG_CONFIG_H)
+
+#define PdhOpenQuery __MINGW_NAME_AW(PdhOpenQuery)
+#define PdhAddCounter __MINGW_NAME_AW(PdhAddCounter)
+#define PdhGetCounterInfo __MINGW_NAME_AW(PdhGetCounterInfo)
+#define PdhConnectMachine __MINGW_NAME_AW(PdhConnectMachine)
+#define PdhEnumMachines __MINGW_NAME_AW(PdhEnumMachines)
+#define PdhEnumObjects __MINGW_NAME_AW(PdhEnumObjects)
+#define PdhEnumObjectItems __MINGW_NAME_AW(PdhEnumObjectItems)
+#define PdhMakeCounterPath __MINGW_NAME_AW(PdhMakeCounterPath)
+#define PdhParseCounterPath __MINGW_NAME_AW(PdhParseCounterPath)
+#define PdhParseInstanceName __MINGW_NAME_AW(PdhParseInstanceName)
+#define PdhValidatePath __MINGW_NAME_AW(PdhValidatePath)
+#define PdhGetDefaultPerfObject __MINGW_NAME_AW(PdhGetDefaultPerfObject)
+#define PdhGetDefaultPerfCounter __MINGW_NAME_AW(PdhGetDefaultPerfCounter)
+#define PdhBrowseCounters __MINGW_NAME_AW(PdhBrowseCounters)
+#define PdhBrowseCountersH __MINGW_NAME_AW(PdhBrowseCountersH)
+#define PdhExpandCounterPath __MINGW_NAME_AW(PdhExpandCounterPath)
+#define PdhGetFormattedCounterArray __MINGW_NAME_AW(PdhGetFormattedCounterArray)
+#define PdhGetRawCounterArray __MINGW_NAME_AW(PdhGetRawCounterArray)
+#define PdhLookupPerfNameByIndex __MINGW_NAME_AW(PdhLookupPerfNameByIndex)
+#define PdhLookupPerfIndexByName __MINGW_NAME_AW(PdhLookupPerfIndexByName)
+#define PdhOpenLog __MINGW_NAME_AW(PdhOpenLog)
+#define PdhUpdateLog __MINGW_NAME_AW(PdhUpdateLog)
+#define PdhSelectDataSource __MINGW_NAME_AW(PdhSelectDataSource)
+#define PdhGetDataSourceTimeRange __MINGW_NAME_AW(PdhGetDataSourceTimeRange)
+#define PdhLogServiceControl __MINGW_NAME_AW(PdhLogServiceControl)
+#define PdhLogServiceQuery __MINGW_NAME_AW(PdhLogServiceQuery)
+#define PdhExpandWildCardPath __MINGW_NAME_AW(PdhExpandWildCardPath)
+#define PdhBindInputDataSource __MINGW_NAME_AW(PdhBindInputDataSource)
+#define PdhEnumMachinesH __MINGW_NAME_AW(PdhEnumMachinesH)
+#define PdhEnumObjectsH __MINGW_NAME_AW(PdhEnumObjectsH)
+#define PdhEnumObjectItemsH __MINGW_NAME_AW(PdhEnumObjectItemsH)
+#define PdhExpandWildCardPathH __MINGW_NAME_AW(PdhExpandWildCardPathH)
+#define PdhGetDefaultPerfObjectH __MINGW_NAME_AW(PdhGetDefaultPerfObjectH)
+#define PdhGetDefaultPerfCounterH __MINGW_NAME_AW(PdhGetDefaultPerfCounterH)
+#define PdhEnumLogSetNames __MINGW_NAME_AW(PdhEnumLogSetNames)
+#define PdhCreateSQLTables __MINGW_NAME_AW(PdhCreateSQLTables)
+#define PdhVerifySQLDB __MINGW_NAME_AW(PdhVerifySQLDB)
+
+#if (_WIN32_WINNT >= 0x0600)
+PDH_STATUS PdhAddEnglishCounterA(
+ PDH_HQUERY hQuery,
+ LPCSTR szFullCounterPath,
+ DWORD_PTR dwUserData,
+ PDH_HCOUNTER *phCounter
+);
+
+PDH_STATUS PdhAddEnglishCounterW(
+ PDH_HQUERY hQuery,
+ LPCWSTR szFullCounterPath,
+ DWORD_PTR dwUserData,
+ PDH_HCOUNTER *phCounter
+);
+
+#define PdhAddEnglishCounter __MINGW_NAME_AW(PdhAddEnglishCounter)
+
+PDH_STATUS PdhCollectQueryDataWithTime(
+ PDH_HQUERY hQuery,
+ LONGLONG *pllTimeStamp
+);
+
+PDH_STATUS PdhValidatePathExA(
+ PDH_HLOG hDataSource,
+ LPCSTR szFullPathBuffer
+);
+
+PDH_STATUS PdhValidatePathExA(
+ PDH_HLOG hDataSource,
+ LPCWSTR szFullPathBuffer
+);
+
+#define PdhValidatePathEx __MINGW_NAME_AW(PdhValidatePathEx)
+
+#endif /*(_WIN32_WINNT >= 0x0600)*/
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/win32ctl/include/pdhmsg.h b/src/win32ctl/include/pdhmsg.h
new file mode 100644
index 0000000..fc3b42a
--- /dev/null
+++ b/src/win32ctl/include/pdhmsg.h
@@ -0,0 +1,101 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _PDH_MSG_H_
+#define _PDH_MSG_H_
+
+#define STATUS_SEVERITY_WARNING 0x2
+#define STATUS_SEVERITY_SUCCESS 0x0
+#define STATUS_SEVERITY_INFORMATIONAL 0x1
+#define STATUS_SEVERITY_ERROR 0x3
+
+#define PDH_CSTATUS_VALID_DATA ((DWORD)0x00000000L)
+#define PDH_CSTATUS_NEW_DATA ((DWORD)0x00000001L)
+#define PDH_CSTATUS_NO_MACHINE ((DWORD)0x800007D0L)
+#define PDH_CSTATUS_NO_INSTANCE ((DWORD)0x800007D1L)
+#define PDH_MORE_DATA ((DWORD)0x800007D2L)
+#define PDH_CSTATUS_ITEM_NOT_VALIDATED ((DWORD)0x800007D3L)
+#define PDH_RETRY ((DWORD)0x800007D4L)
+#define PDH_NO_DATA ((DWORD)0x800007D5L)
+#define PDH_CALC_NEGATIVE_DENOMINATOR ((DWORD)0x800007D6L)
+#define PDH_CALC_NEGATIVE_TIMEBASE ((DWORD)0x800007D7L)
+#define PDH_CALC_NEGATIVE_VALUE ((DWORD)0x800007D8L)
+#define PDH_DIALOG_CANCELLED ((DWORD)0x800007D9L)
+#define PDH_END_OF_LOG_FILE ((DWORD)0x800007DAL)
+#define PDH_ASYNC_QUERY_TIMEOUT ((DWORD)0x800007DBL)
+#define PDH_CANNOT_SET_DEFAULT_REALTIME_DATASOURCE ((DWORD)0x800007DCL)
+#define PDH_CSTATUS_NO_OBJECT ((DWORD)0xC0000BB8L)
+#define PDH_CSTATUS_NO_COUNTER ((DWORD)0xC0000BB9L)
+#define PDH_CSTATUS_INVALID_DATA ((DWORD)0xC0000BBAL)
+#define PDH_MEMORY_ALLOCATION_FAILURE ((DWORD)0xC0000BBBL)
+#define PDH_INVALID_HANDLE ((DWORD)0xC0000BBCL)
+#define PDH_INVALID_ARGUMENT ((DWORD)0xC0000BBDL)
+#define PDH_FUNCTION_NOT_FOUND ((DWORD)0xC0000BBEL)
+#define PDH_CSTATUS_NO_COUNTERNAME ((DWORD)0xC0000BBFL)
+#define PDH_CSTATUS_BAD_COUNTERNAME ((DWORD)0xC0000BC0L)
+#define PDH_INVALID_BUFFER ((DWORD)0xC0000BC1L)
+#define PDH_INSUFFICIENT_BUFFER ((DWORD)0xC0000BC2L)
+#define PDH_CANNOT_CONNECT_MACHINE ((DWORD)0xC0000BC3L)
+#define PDH_INVALID_PATH ((DWORD)0xC0000BC4L)
+#define PDH_INVALID_INSTANCE ((DWORD)0xC0000BC5L)
+#define PDH_INVALID_DATA ((DWORD)0xC0000BC6L)
+#define PDH_NO_DIALOG_DATA ((DWORD)0xC0000BC7L)
+#define PDH_CANNOT_READ_NAME_STRINGS ((DWORD)0xC0000BC8L)
+#define PDH_LOG_FILE_CREATE_ERROR ((DWORD)0xC0000BC9L)
+#define PDH_LOG_FILE_OPEN_ERROR ((DWORD)0xC0000BCAL)
+#define PDH_LOG_TYPE_NOT_FOUND ((DWORD)0xC0000BCBL)
+#define PDH_NO_MORE_DATA ((DWORD)0xC0000BCCL)
+#define PDH_ENTRY_NOT_IN_LOG_FILE ((DWORD)0xC0000BCDL)
+#define PDH_DATA_SOURCE_IS_LOG_FILE ((DWORD)0xC0000BCEL)
+#define PDH_DATA_SOURCE_IS_REAL_TIME ((DWORD)0xC0000BCFL)
+#define PDH_UNABLE_READ_LOG_HEADER ((DWORD)0xC0000BD0L)
+#define PDH_FILE_NOT_FOUND ((DWORD)0xC0000BD1L)
+#define PDH_FILE_ALREADY_EXISTS ((DWORD)0xC0000BD2L)
+#define PDH_NOT_IMPLEMENTED ((DWORD)0xC0000BD3L)
+#define PDH_STRING_NOT_FOUND ((DWORD)0xC0000BD4L)
+#define PDH_UNABLE_MAP_NAME_FILES ((DWORD)0x80000BD5L)
+#define PDH_UNKNOWN_LOG_FORMAT ((DWORD)0xC0000BD6L)
+#define PDH_UNKNOWN_LOGSVC_COMMAND ((DWORD)0xC0000BD7L)
+#define PDH_LOGSVC_QUERY_NOT_FOUND ((DWORD)0xC0000BD8L)
+#define PDH_LOGSVC_NOT_OPENED ((DWORD)0xC0000BD9L)
+#define PDH_WBEM_ERROR ((DWORD)0xC0000BDAL)
+#define PDH_ACCESS_DENIED ((DWORD)0xC0000BDBL)
+#define PDH_LOG_FILE_TOO_SMALL ((DWORD)0xC0000BDCL)
+#define PDH_INVALID_DATASOURCE ((DWORD)0xC0000BDDL)
+#define PDH_INVALID_SQLDB ((DWORD)0xC0000BDEL)
+#define PDH_NO_COUNTERS ((DWORD)0xC0000BDFL)
+#define PDH_SQL_ALLOC_FAILED ((DWORD)0xC0000BE0L)
+#define PDH_SQL_ALLOCCON_FAILED ((DWORD)0xC0000BE1L)
+#define PDH_SQL_EXEC_DIRECT_FAILED ((DWORD)0xC0000BE2L)
+#define PDH_SQL_FETCH_FAILED ((DWORD)0xC0000BE3L)
+#define PDH_SQL_ROWCOUNT_FAILED ((DWORD)0xC0000BE4L)
+#define PDH_SQL_MORE_RESULTS_FAILED ((DWORD)0xC0000BE5L)
+#define PDH_SQL_CONNECT_FAILED ((DWORD)0xC0000BE6L)
+#define PDH_SQL_BIND_FAILED ((DWORD)0xC0000BE7L)
+#define PDH_CANNOT_CONNECT_WMI_SERVER ((DWORD)0xC0000BE8L)
+#define PDH_PLA_COLLECTION_ALREADY_RUNNING ((DWORD)0xC0000BE9L)
+#define PDH_PLA_ERROR_SCHEDULE_OVERLAP ((DWORD)0xC0000BEAL)
+#define PDH_PLA_COLLECTION_NOT_FOUND ((DWORD)0xC0000BEBL)
+#define PDH_PLA_ERROR_SCHEDULE_ELAPSED ((DWORD)0xC0000BECL)
+#define PDH_PLA_ERROR_NOSTART ((DWORD)0xC0000BEDL)
+#define PDH_PLA_ERROR_ALREADY_EXISTS ((DWORD)0xC0000BEEL)
+#define PDH_PLA_ERROR_TYPE_MISMATCH ((DWORD)0xC0000BEFL)
+#define PDH_PLA_ERROR_FILEPATH ((DWORD)0xC0000BF0L)
+#define PDH_PLA_SERVICE_ERROR ((DWORD)0xC0000BF1L)
+#define PDH_PLA_VALIDATION_ERROR ((DWORD)0xC0000BF2L)
+#define PDH_PLA_VALIDATION_WARNING ((DWORD)0x80000BF3L)
+#define PDH_PLA_ERROR_NAME_TOO_LONG ((DWORD)0xC0000BF4L)
+#define PDH_INVALID_SQL_LOG_FORMAT ((DWORD)0xC0000BF5L)
+#define PDH_COUNTER_ALREADY_IN_QUERY ((DWORD)0xC0000BF6L)
+#define PDH_BINARY_LOG_CORRUPT ((DWORD)0xC0000BF7L)
+#define PDH_LOG_SAMPLE_TOO_SMALL ((DWORD)0xC0000BF8L)
+#define PDH_OS_LATER_VERSION ((DWORD)0xC0000BF9L)
+#define PDH_OS_EARLIER_VERSION ((DWORD)0xC0000BFAL)
+#define PDH_INCORRECT_APPEND_TIME ((DWORD)0xC0000BFBL)
+#define PDH_UNMATCHED_APPEND_COUNTER ((DWORD)0xC0000BFCL)
+#define PDH_SQL_ALTER_DETAIL_FAILED ((DWORD)0xC0000BFDL)
+#define PDH_QUERY_PERF_DATA_TIMEOUT ((DWORD)0xC0000BFEL)
+
+#endif
diff --git a/src/win32ctl/include/pshpack8.h b/src/win32ctl/include/pshpack8.h
new file mode 100644
index 0000000..61f803f
--- /dev/null
+++ b/src/win32ctl/include/pshpack8.h
@@ -0,0 +1,8 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#if !(defined(lint) || defined(RC_INVOKED))
+#pragma pack(push,8)
+#endif
diff --git a/src/win32ctl/include/tdh.h b/src/win32ctl/include/tdh.h
new file mode 100644
index 0000000..745c248
--- /dev/null
+++ b/src/win32ctl/include/tdh.h
@@ -0,0 +1,329 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _INC_TDH
+#define _INC_TDH
+
+/* --- start added by kenj */
+#undef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+/* --- end added by kenj */
+
+#include <evntprov.h>
+#include <evntcons.h>
+#if (_WIN32_WINNT >= 0x0600)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __TDHCACHE_ALIGN __attribute__ ((aligned (8)))
+
+typedef enum _EVENT_FIELD_TYPE {
+ EventKeywordInformation = 0,
+ EventLevelInformation = 1,
+ EventChannelInformation = 2,
+ EventTaskInformation = 3,
+ EventOpcodeInformation = 4,
+ EventInformationMax = 5
+} EVENT_FIELD_TYPE;
+
+typedef struct _EVENT_MAP_ENTRY {
+ ULONG OutputOffset;
+ __MINGW_EXTENSION union {
+ ULONG Value;
+ ULONG InputOffset;
+ };
+} __TDHCACHE_ALIGN EVENT_MAP_ENTRY, *PEVENT_MAP_ENTRY;
+
+typedef enum _MAP_VALUETYPE
+{
+ EVENTMAP_ENTRY_VALUETYPE_ULONG = 0,
+ EVENTMAP_ENTRY_VALUETYPE_STRING = 1
+} MAP_VALUETYPE;
+
+typedef enum _MAP_FLAGS {
+ EVENTMAP_INFO_FLAG_MANIFEST_VALUEMAP = 1,
+ EVENTMAP_INFO_FLAG_MANIFEST_BITMAP = 2,
+ EVENTMAP_INFO_FLAG_MANIFEST_PATTERNMAP = 4,
+ EVENTMAP_INFO_FLAG_WBEM_VALUEMAP = 8,
+ EVENTMAP_INFO_FLAG_WBEM_BITMAP = 16,
+ EVENTMAP_INFO_FLAG_WBEM_FLAG = 32,
+ EVENTMAP_INFO_FLAG_WBEM_NO_MAP = 64
+} MAP_FLAGS;
+
+typedef struct _EVENT_MAP_INFO {
+ ULONG NameOffset;
+ MAP_FLAGS Flag;
+ ULONG EntryCount;
+ __MINGW_EXTENSION union {
+ MAP_VALUETYPE MapEntryValueType;
+ ULONG FormatStringOffset;
+ };
+ EVENT_MAP_ENTRY MapEntryArray[ANYSIZE_ARRAY];
+} __TDHCACHE_ALIGN EVENT_MAP_INFO, *PEVENT_MAP_INFO;
+
+typedef enum _TDH_IN_TYPE {
+ TDH_INTYPE_NULL,
+ TDH_INTYPE_UNICODESTRING,
+ TDH_INTYPE_ANSISTRING,
+ TDH_INTYPE_INT8,
+ TDH_INTYPE_UINT8,
+ TDH_INTYPE_INT16,
+ TDH_INTYPE_UINT16,
+ TDH_INTYPE_INT32,
+ TDH_INTYPE_UINT32,
+ TDH_INTYPE_INT64,
+ TDH_INTYPE_UINT64,
+ TDH_INTYPE_FLOAT,
+ TDH_INTYPE_DOUBLE,
+ TDH_INTYPE_BOOLEAN,
+ TDH_INTYPE_BINARY,
+ TDH_INTYPE_GUID,
+ TDH_INTYPE_POINTER,
+ TDH_INTYPE_FILETIME,
+ TDH_INTYPE_SYSTEMTIME,
+ TDH_INTYPE_SID,
+ TDH_INTYPE_HEXINT32,
+ TDH_INTYPE_HEXINT64,
+ TDH_INTYPE_COUNTEDSTRING = 300,
+ TDH_INTYPE_COUNTEDANSISTRING,
+ TDH_INTYPE_REVERSEDCOUNTEDSTRING,
+ TDH_INTYPE_REVERSEDCOUNTEDANSISTRING,
+ TDH_INTYPE_NONNULLTERMINATEDSTRING,
+ TDH_INTYPE_NONNULLTERMINATEDANSISTRING,
+ TDH_INTYPE_UNICODECHAR,
+ TDH_INTYPE_ANSICHAR,
+ TDH_INTYPE_SIZET,
+ TDH_INTYPE_HEXDUMP,
+ TDH_INTYPE_WBEMSID
+} TDH_IN_TYPE;
+
+typedef enum _TDH_OUT_TYPE {
+ TDH_OUTTYPE_NULL,
+ TDH_OUTTYPE_STRING,
+ TDH_OUTTYPE_DATETIME,
+ TDH_OUTTYPE_BYTE,
+ TDH_OUTTYPE_UNSIGNEDBYTE,
+ TDH_OUTTYPE_SHORT,
+ TDH_OUTTYPE_UNSIGNEDSHORT,
+ TDH_OUTTYPE_INT,
+ TDH_OUTTYPE_UNSIGNEDINT,
+ TDH_OUTTYPE_LONG,
+ TDH_OUTTYPE_UNSIGNEDLONG,
+ TDH_OUTTYPE_FLOAT,
+ TDH_OUTTYPE_DOUBLE,
+ TDH_OUTTYPE_BOOLEAN,
+ TDH_OUTTYPE_GUID,
+ TDH_OUTTYPE_HEXBINARY,
+ TDH_OUTTYPE_HEXINT8,
+ TDH_OUTTYPE_HEXINT16,
+ TDH_OUTTYPE_HEXINT32,
+ TDH_OUTTYPE_HEXINT64,
+ TDH_OUTTYPE_PID,
+ TDH_OUTTYPE_TID,
+ TDH_OUTTYPE_PORT,
+ TDH_OUTTYPE_IPV4,
+ TDH_OUTTYPE_IPV6,
+ TDH_OUTTYPE_SOCKETADDRESS,
+ TDH_OUTTYPE_CIMDATETIME,
+ TDH_OUTTYPE_ETWTIME,
+ TDH_OUTTYPE_XML,
+ TDH_OUTTYPE_ERRORCODE,
+ TDH_OUTTYPE_WIN32ERROR,
+ TDH_OUTTYPE_NTSTATUS,
+ TDH_OUTTYPE_HRESULT,
+ TDH_OUTTYPE_CULTURE_INSENSITIVE_DATETIME,
+ TDH_OUTTYPE_REDUCEDSTRING = 300,
+ TDH_OUTTYPE_NOPRINT
+} TDH_OUT_TYPE;
+
+typedef enum _PROPERTY_FLAGS {
+ PropertyStruct = 0x1,
+ PropertyParamLength = 0x2,
+ PropertyParamCount = 0x4,
+ PropertyWBEMXmlFragment = 0x8,
+ PropertyParamFixedLength = 0x10
+} PROPERTY_FLAGS;
+
+typedef struct _EVENT_PROPERTY_INFO {
+ PROPERTY_FLAGS Flags;
+ ULONG NameOffset;
+ __MINGW_EXTENSION union {
+ struct {
+ USHORT InType;
+ USHORT OutType;
+ ULONG MapNameOffset;
+ } nonStructType;
+ struct {
+ USHORT StructStartIndex;
+ USHORT NumOfStructMembers;
+ ULONG padding;
+ } structType;
+ };
+ __MINGW_EXTENSION union {
+ USHORT count;
+ USHORT countPropertyIndex;
+ };
+ __MINGW_EXTENSION union {
+ USHORT length;
+ USHORT lengthPropertyIndex;
+ };
+ ULONG Reserved;
+} __TDHCACHE_ALIGN EVENT_PROPERTY_INFO, *PEVENT_PROPERTY_INFO;
+
+typedef enum _DECODING_SOURCE {
+ DecodingSourceXMLFile = 0,
+ DecodingSourceWbem = 1,
+ DecodingSourceWPP = 2
+} DECODING_SOURCE;
+
+typedef enum _TDH_CONTEXT_TYPE {
+ TDH_CONTEXT_WPP_TMFFILE = 0,
+ TDH_CONTEXT_WPP_TMFSEARCHPATH = 1,
+ TDH_CONTEXT_WPP_GMT = 2,
+ TDH_CONTEXT_POINTERSIZE = 3,
+ TDH_CONTEXT_MAXIMUM = 4
+} TDH_CONTEXT_TYPE;
+
+typedef enum _TEMPLATE_FLAGS {
+ TEMPLATE_EVENT_DATA = 1,
+ TEMPLATE_USER_DATA = 2
+} TEMPLATE_FLAGS;
+
+typedef struct _TRACE_EVENT_INFO {
+ GUID ProviderGuid;
+ GUID EventGuid;
+ EVENT_DESCRIPTOR EventDescriptor;
+ DECODING_SOURCE DecodingSource;
+ ULONG ProviderNameOffset;
+ ULONG LevelNameOffset;
+ ULONG ChannelNameOffset;
+ ULONG KeywordsNameOffset;
+ ULONG TaskNameOffset;
+ ULONG OpcodeNameOffset;
+ ULONG EventMessageOffset;
+ ULONG ProviderMessageOffset;
+ ULONG BinaryXMLOffset;
+ ULONG BinaryXMLSize;
+ ULONG ActivityIDNameOffset;
+ ULONG RelatedActivityIDNameOffset;
+ ULONG PropertyCount;
+ ULONG TopLevelPropertyCount;
+ TEMPLATE_FLAGS Flags;
+ EVENT_PROPERTY_INFO EventPropertyInfoArray[ANYSIZE_ARRAY];
+} __TDHCACHE_ALIGN TRACE_EVENT_INFO, *PTRACE_EVENT_INFO;
+
+typedef struct _PROPERTY_DATA_DESCRIPTOR {
+ ULONGLONG PropertyName;
+ ULONG ArrayIndex;
+ ULONG Reserved;
+} __TDHCACHE_ALIGN PROPERTY_DATA_DESCRIPTOR, *PPROPERTY_DATA_DESCRIPTOR;
+
+typedef struct _TRACE_PROVIDER_INFO {
+ GUID ProviderGuid;
+ ULONG SchemaSource;
+ ULONG ProviderNameOffset;
+} __TDHCACHE_ALIGN TRACE_PROVIDER_INFO, *PTRACE_PROVIDER_INFO;
+
+typedef struct _PROVIDER_ENUMERATION_INFO {
+ ULONG NumberOfProviders;
+ ULONG Padding;
+ TRACE_PROVIDER_INFO TraceProviderInfoArray[ANYSIZE_ARRAY];
+} __TDHCACHE_ALIGN PROVIDER_ENUMERATION_INFO, *PPROVIDER_ENUMERATION_INFO;
+
+typedef struct _PROVIDER_FIELD_INFO {
+ ULONG NameOffset;
+ ULONG DescriptionOffset;
+ ULONGLONG Value;
+} __TDHCACHE_ALIGN PROVIDER_FIELD_INFO, *PPROVIDER_FIELD_INFO;
+
+typedef struct _PROVIDER_FIELD_INFOARRAY {
+ ULONG NumberOfElements;
+ EVENT_FIELD_TYPE FieldType;
+ PROVIDER_FIELD_INFO FieldInfoArray[ANYSIZE_ARRAY];
+} __TDHCACHE_ALIGN PROVIDER_FIELD_INFOARRAY, *PPROVIDER_FIELD_INFOARRAY;
+
+typedef struct _TDH_CONTEXT {
+ ULONGLONG ParameterValue;
+ TDH_CONTEXT_TYPE ParameterType;
+ ULONG ParameterSize;
+} __TDHCACHE_ALIGN TDH_CONTEXT, *PTDH_CONTEXT;
+
+ULONG __stdcall TdhEnumerateProviderFieldInformation(
+ LPGUID pGuid,
+ EVENT_FIELD_TYPE EventFieldType,
+ PPROVIDER_FIELD_INFOARRAY pBuffer,
+ ULONG *pBufferSize
+);
+
+ULONG __stdcall TdhEnumerateProviders(
+ PPROVIDER_ENUMERATION_INFO pBuffer,
+ ULONG *pBufferSize
+);
+
+ULONG __stdcall TdhGetEventInformation(
+ PEVENT_RECORD pEvent,
+ ULONG TdhContextCount,
+ PTDH_CONTEXT pTdhContext,
+ PTRACE_EVENT_INFO pBuffer,
+ ULONG *pBufferSize
+);
+
+ULONG __stdcall TdhGetEventMapInformation(
+ PEVENT_RECORD pEvent,
+ LPWSTR pMapName,
+ PEVENT_MAP_INFO pBuffer,
+ ULONG *pBufferSize
+);
+
+ULONG __stdcall TdhGetProperty(
+ PEVENT_RECORD pEvent,
+ ULONG TdhContextCount,
+ PTDH_CONTEXT pTdhContext,
+ ULONG PropertyDataCount,
+ PPROPERTY_DATA_DESCRIPTOR pPropertyData,
+ ULONG BufferSize,
+ PBYTE pBuffer
+);
+
+ULONG __stdcall TdhGetPropertySize(
+ PEVENT_RECORD pEvent,
+ ULONG TdhContextCount,
+ PTDH_CONTEXT pTdhContext,
+ ULONG PropertyDataCount,
+ PPROPERTY_DATA_DESCRIPTOR pPropertyData,
+ ULONG *pPropertySize
+);
+
+ULONG __stdcall TdhQueryProviderFieldInformation(
+ LPGUID pGuid,
+ ULONGLONG EventFieldValue,
+ EVENT_FIELD_TYPE EventFieldType,
+ PPROVIDER_FIELD_INFOARRAY pBuffer,
+ ULONG *pBufferSize
+);
+
+#if (_WIN32_WINNT >= 0x0601)
+typedef struct _PROVIDER_FILTER_INFO {
+ UCHAR Id;
+ UCHAR Version;
+ ULONG MessageOffset;
+ ULONG Reserved;
+ ULONG PropertyCount;
+ EVENT_PROPERTY_INFO EventPropertyInfoArray[ANYSIZE_ARRAY];
+} PROVIDER_FILTER_INFO, *PPROVIDER_FILTER_INFO;
+#endif /*(_WIN32_WINNT >= 0x0601)*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*(_WIN32_WINNT >= 0x0600)*/
+#endif /*_INC_TDH*/
diff --git a/src/win32ctl/include/tdhmsg.h b/src/win32ctl/include/tdhmsg.h
new file mode 100644
index 0000000..813f4d3
--- /dev/null
+++ b/src/win32ctl/include/tdhmsg.h
@@ -0,0 +1,39 @@
+#define ERROR_EVT_INVALID_CHANNEL_PATH 15000L
+#define ERROR_EVT_INVALID_QUERY 15001L
+#define ERROR_EVT_PUBLISHER_METADATA_NOT_FOUND 15002L
+#define ERROR_EVT_EVENT_TEMPLATE_NOT_FOUND 15003L
+#define ERROR_EVT_INVALID_PUBLISHER_NAME 15004L
+#define ERROR_EVT_INVALID_EVENT_DATA 15005L
+#define ERROR_EVT_CHANNEL_NOT_FOUND 15007L
+#define ERROR_EVT_MALFORMED_XML_TEXT 15008L
+#define ERROR_EVT_SUBSCRIPTION_TO_DIRECT_CHANNEL 15009L
+#define ERROR_EVT_CONFIGURATION_ERROR 15010L
+#define ERROR_EVT_QUERY_RESULT_STALE 15011L
+#define ERROR_EVT_QUERY_RESULT_INVALID_POSITION 15012L
+#define ERROR_EVT_NON_VALIDATING_MSXML 15013L
+#define ERROR_EVT_FILTER_ALREADYSCOPED 15014L
+#define ERROR_EVT_FILTER_NOTELTSET 15015L
+#define ERROR_EVT_FILTER_INVARG 15016L
+#define ERROR_EVT_FILTER_INVTEST 15017L
+#define ERROR_EVT_FILTER_INVTYPE 15018L
+#define ERROR_EVT_FILTER_PARSEERR 15019L
+#define ERROR_EVT_FILTER_UNSUPPORTEDOP 15020L
+#define ERROR_EVT_FILTER_UNEXPECTEDTOKEN 15021L
+#define ERROR_EVT_INVALID_OPERATION_OVER_ENABLED_DIRECT_CHANNEL 15022L
+#define ERROR_EVT_INVALID_CHANNEL_PROPERTY_VALUE 15023L
+#define ERROR_EVT_INVALID_PUBLISHER_PROPERTY_VALUE 15024L
+#define ERROR_EVT_CHANNEL_CANNOT_ACTIVATE 15025L
+#define ERROR_EVT_FILTER_TOO_COMPLEX 15026L
+#define ERROR_EVT_MESSAGE_NOT_FOUND 15027L
+#define ERROR_EVT_MESSAGE_ID_NOT_FOUND 15028L
+#define ERROR_EVT_UNRESOLVED_VALUE_INSERT 15029L
+#define ERROR_EVT_UNRESOLVED_PARAMETER_INSERT 15030L
+#define ERROR_EVT_MAX_INSERTS_REACHED 15031L
+#define ERROR_EVT_EVENT_DEFINITION_NOT_FOUND 15032L
+#define ERROR_EVT_MESSAGE_LOCALE_NOT_FOUND 15033L
+#define ERROR_EVT_VERSION_TOO_OLD 15034L
+#define ERROR_EVT_VERSION_TOO_NEW 15035L
+#define ERROR_EVT_CANNOT_OPEN_CHANNEL_OF_QUERY 15036L
+#define ERROR_EVT_PUBLISHER_DISABLED 15037L
+#define ERROR_EVT_FILTER_OUT_OF_RANGE 15038L
+
diff --git a/src/win32ctl/include/winevt.h b/src/win32ctl/include/winevt.h
new file mode 100644
index 0000000..0b5fdd5
--- /dev/null
+++ b/src/win32ctl/include/winevt.h
@@ -0,0 +1,758 @@
+#ifndef WINEVT_H
+#define WINEVT_H
+
+typedef HANDLE EVT_HANDLE, *PEVT_HANDLE;
+
+typedef enum _EVT_VARIANT_TYPE
+{
+ EvtVarTypeNull = 0,
+ EvtVarTypeString = 1,
+ EvtVarTypeAnsiString = 2,
+ EvtVarTypeSByte = 3,
+ EvtVarTypeByte = 4,
+ EvtVarTypeInt16 = 5,
+ EvtVarTypeUInt16 = 6,
+ EvtVarTypeInt32 = 7,
+ EvtVarTypeUInt32 = 8,
+ EvtVarTypeInt64 = 9,
+ EvtVarTypeUInt64 = 10,
+ EvtVarTypeSingle = 11,
+ EvtVarTypeDouble = 12,
+ EvtVarTypeBoolean = 13,
+ EvtVarTypeBinary = 14,
+ EvtVarTypeGuid = 15,
+ EvtVarTypeSizeT = 16,
+ EvtVarTypeFileTime = 17,
+ EvtVarTypeSysTime = 18,
+ EvtVarTypeSid = 19,
+ EvtVarTypeHexInt32 = 20,
+ EvtVarTypeHexInt64 = 21,
+
+ // these types used internally
+ EvtVarTypeEvtHandle = 32,
+ EvtVarTypeEvtXml = 35
+
+} EVT_VARIANT_TYPE;
+
+
+#define EVT_VARIANT_TYPE_MASK 0x7f
+#define EVT_VARIANT_TYPE_ARRAY 128
+
+
+typedef struct _EVT_VARIANT
+{
+ union
+ {
+ BOOL BooleanVal;
+ INT8 SByteVal;
+ INT16 Int16Val;
+ INT32 Int32Val;
+ INT64 Int64Val;
+ UINT8 ByteVal;
+ UINT16 UInt16Val;
+ UINT32 UInt32Val;
+ UINT64 UInt64Val;
+ float SingleVal;
+ double DoubleVal;
+ ULONGLONG FileTimeVal;
+ SYSTEMTIME* SysTimeVal;
+ GUID* GuidVal;
+ LPCWSTR StringVal;
+ LPCSTR AnsiStringVal;
+ PBYTE BinaryVal;
+ PSID SidVal;
+ size_t SizeTVal;
+
+ // array fields
+ BOOL* BooleanArr;
+ INT8* SByteArr;
+ INT16* Int16Arr;
+ INT32* Int32Arr;
+ INT64* Int64Arr;
+ UINT8* ByteArr;
+ UINT16* UInt16Arr;
+ UINT32* UInt32Arr;
+ UINT64* UInt64Arr;
+ float* SingleArr;
+ double* DoubleArr;
+ FILETIME* FileTimeArr;
+ SYSTEMTIME* SysTimeArr;
+ GUID* GuidArr;
+ LPWSTR* StringArr;
+ LPSTR* AnsiStringArr;
+ PSID* SidArr;
+ size_t* SizeTArr;
+
+ // internal fields
+ EVT_HANDLE EvtHandleVal;
+ LPCWSTR XmlVal;
+ LPCWSTR* XmlValArr;
+ };
+
+ DWORD Count; // number of elements (not length) in bytes.
+ DWORD Type;
+
+} EVT_VARIANT, *PEVT_VARIANT;
+
+#if 0
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Sessions
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_LOGIN_CLASS
+{
+ EvtRpcLogin = 1
+
+} EVT_LOGIN_CLASS;
+
+typedef enum _EVT_RPC_LOGIN_FLAGS
+{
+ EvtRpcLoginAuthDefault = 0,
+ EvtRpcLoginAuthNegotiate,
+ EvtRpcLoginAuthKerberos,
+ EvtRpcLoginAuthNTLM
+
+} EVT_RPC_LOGIN_FLAGS;
+
+typedef struct _EVT_RPC_LOGIN
+{
+ // all str params are optional
+ LPWSTR Server;
+ LPWSTR User;
+ LPWSTR Domain;
+ LPWSTR Password;
+ DWORD Flags; // EVT_RPC_LOGIN_FLAGS
+
+} EVT_RPC_LOGIN;
+
+EVT_HANDLE WINAPI EvtOpenSession(
+ EVT_LOGIN_CLASS LoginClass,
+ PVOID Login,
+ __reserved DWORD Timeout, // currently must be 0
+ __reserved DWORD Flags // currently must be 0
+ );
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// General Purpose Functions
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+BOOL WINAPI EvtClose(
+ EVT_HANDLE Object
+ );
+
+#if 0
+
+BOOL WINAPI EvtCancel(
+ EVT_HANDLE Object
+ );
+
+DWORD WINAPI EvtGetExtendedStatus(
+ DWORD BufferSize,
+ __out_ecount_part_opt(BufferSize, *BufferUsed) LPWSTR Buffer,
+ __out PDWORD BufferUsed
+ );
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Queries
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+typedef enum _EVT_QUERY_FLAGS
+{
+ EvtQueryChannelPath = 0x1,
+ EvtQueryFilePath = 0x2,
+
+ EvtQueryForwardDirection = 0x100,
+ EvtQueryReverseDirection = 0x200,
+
+ EvtQueryTolerateQueryErrors = 0x1000
+
+} EVT_QUERY_FLAGS;
+
+EVT_HANDLE WINAPI EvtQuery(
+ EVT_HANDLE Session,
+ LPCWSTR Path,
+ LPCWSTR Query,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtNext(
+ EVT_HANDLE ResultSet,
+ DWORD EventsSize,
+ PEVT_HANDLE Events,
+ DWORD Timeout,
+ DWORD Flags,
+ PDWORD Returned
+ );
+
+#if 0
+
+typedef enum _EVT_SEEK_FLAGS
+{
+ EvtSeekRelativeToFirst = 1,
+ EvtSeekRelativeToLast = 2,
+ EvtSeekRelativeToCurrent = 3,
+ EvtSeekRelativeToBookmark = 4,
+ EvtSeekOriginMask = 7,
+
+ EvtSeekStrict = 0x10000,
+
+} EVT_SEEK_FLAGS;
+
+
+
+BOOL WINAPI EvtSeek(
+ EVT_HANDLE ResultSet,
+ LONGLONG Position,
+ EVT_HANDLE Bookmark,
+ __reserved DWORD Timeout, // currently must be 0
+ DWORD Flags
+ );
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Subscriptions
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_SUBSCRIBE_FLAGS
+{
+ EvtSubscribeToFutureEvents = 1,
+ EvtSubscribeStartAtOldestRecord = 2,
+ EvtSubscribeStartAfterBookmark = 3,
+ EvtSubscribeOriginMask = 3,
+
+ EvtSubscribeTolerateQueryErrors = 0x1000,
+
+ EvtSubscribeStrict = 0x10000,
+
+} EVT_SUBSCRIBE_FLAGS;
+
+typedef enum _EVT_SUBSCRIBE_NOTIFY_ACTION
+{
+ EvtSubscribeActionError = 0,
+ EvtSubscribeActionDeliver
+
+} EVT_SUBSCRIBE_NOTIFY_ACTION;
+
+typedef DWORD (WINAPI *EVT_SUBSCRIBE_CALLBACK)(
+ EVT_SUBSCRIBE_NOTIFY_ACTION Action,
+ PVOID UserContext,
+ EVT_HANDLE Event );
+
+EVT_HANDLE WINAPI EvtSubscribe(
+ EVT_HANDLE Session,
+ HANDLE SignalEvent,
+ LPCWSTR ChannelPath,
+ LPCWSTR Query,
+ EVT_HANDLE Bookmark,
+ PVOID context,
+ EVT_SUBSCRIBE_CALLBACK Callback,
+ DWORD Flags
+ );
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Rendering
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_SYSTEM_PROPERTY_ID
+{
+ EvtSystemProviderName = 0, // EvtVarTypeString
+ EvtSystemProviderGuid, // EvtVarTypeGuid
+ EvtSystemEventID, // EvtVarTypeUInt16
+ EvtSystemQualifiers, // EvtVarTypeUInt16
+ EvtSystemLevel, // EvtVarTypeUInt8
+ EvtSystemTask, // EvtVarTypeUInt16
+ EvtSystemOpcode, // EvtVarTypeUInt8
+ EvtSystemKeywords, // EvtVarTypeHexInt64
+ EvtSystemTimeCreated, // EvtVarTypeFileTime
+ EvtSystemEventRecordId, // EvtVarTypeUInt64
+ EvtSystemActivityID, // EvtVarTypeGuid
+ EvtSystemRelatedActivityID, // EvtVarTypeGuid
+ EvtSystemProcessID, // EvtVarTypeUInt32
+ EvtSystemThreadID, // EvtVarTypeUInt32
+ EvtSystemChannel, // EvtVarTypeString
+ EvtSystemComputer, // EvtVarTypeString
+ EvtSystemUserID, // EvtVarTypeSid
+ EvtSystemVersion, // EvtVarTypeUInt8
+ EvtSystemPropertyIdEND
+
+} EVT_SYSTEM_PROPERTY_ID;
+
+typedef enum _EVT_RENDER_CONTEXT_FLAGS
+{
+ EvtRenderContextValues = 0, // Render specific properties
+ EvtRenderContextSystem, // Render all system properties (System)
+ EvtRenderContextUser // Render all user properties (User/EventData)
+} EVT_RENDER_CONTEXT_FLAGS;
+
+typedef enum _EVT_RENDER_FLAGS
+{
+ EvtRenderEventValues = 0, // Variants
+ EvtRenderEventXml, // XML
+ EvtRenderBookmark // Bookmark
+} EVT_RENDER_FLAGS;
+
+EVT_HANDLE WINAPI EvtCreateRenderContext(
+ DWORD ValuePathsCount,
+ LPCWSTR* ValuePaths,
+ DWORD Flags // EVT_RENDER_CONTEXT_FLAGS
+ );
+
+BOOL WINAPI EvtRender(
+ EVT_HANDLE Context,
+ EVT_HANDLE Fragment,
+ DWORD Flags, // EVT_RENDER_FLAGS
+ DWORD BufferSize,
+ PVOID Buffer,
+ PDWORD BufferUsed,
+ PDWORD PropertyCount
+ );
+
+typedef enum _EVT_FORMAT_MESSAGE_FLAGS
+{
+ EvtFormatMessageEvent = 1,
+ EvtFormatMessageLevel,
+ EvtFormatMessageTask,
+ EvtFormatMessageOpcode,
+ EvtFormatMessageKeyword,
+ EvtFormatMessageChannel,
+ EvtFormatMessageProvider,
+ EvtFormatMessageId,
+ EvtFormatMessageXml,
+
+} EVT_FORMAT_MESSAGE_FLAGS;
+
+BOOL WINAPI EvtFormatMessage(
+ EVT_HANDLE PublisherMetadata, // Except for forwarded events
+ EVT_HANDLE Event,
+ DWORD MessageId,
+ DWORD ValueCount,
+ PEVT_VARIANT Values,
+ DWORD Flags,
+ DWORD BufferSize,
+ LPWSTR Buffer,
+ PDWORD BufferUsed
+ );
+
+
+#if 0
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Log Maintenace and Information
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_OPEN_LOG_FLAGS
+{
+ EvtOpenChannelPath = 0x1,
+ EvtOpenFilePath = 0x2
+
+} EVT_OPEN_LOG_FLAGS;
+
+typedef enum _EVT_LOG_PROPERTY_ID
+{
+ EvtLogCreationTime = 0, // EvtVarTypeFileTime
+ EvtLogLastAccessTime, // EvtVarTypeFileTime
+ EvtLogLastWriteTime, // EvtVarTypeFileTime
+ EvtLogFileSize, // EvtVarTypeUInt64
+ EvtLogAttributes, // EvtVarTypeUInt32
+ EvtLogNumberOfLogRecords, // EvtVarTypeUInt64
+ EvtLogOldestRecordNumber, // EvtVarTypeUInt64
+ EvtLogFull, // EvtVarTypeBoolean
+
+} EVT_LOG_PROPERTY_ID;
+
+EVT_HANDLE WINAPI EvtOpenLog(
+ EVT_HANDLE Session,
+ LPCWSTR Path,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtGetLogInfo(
+ EVT_HANDLE Log,
+ EVT_LOG_PROPERTY_ID PropertyId,
+ DWORD PropertyValueBufferSize,
+ PEVT_VARIANT PropertyValueBuffer,
+ __out PDWORD PropertyValueBufferUsed
+ );
+
+BOOL WINAPI EvtClearLog(
+ EVT_HANDLE Session,
+ LPCWSTR ChannelPath,
+ LPCWSTR TargetFilePath,
+ DWORD Flags
+ );
+
+typedef enum _EVT_EXPORTLOG_FLAGS
+{
+ EvtExportLogChannelPath = 0x1,
+ EvtExportLogFilePath = 0x2,
+ EvtExportLogTolerateQueryErrors = 0x1000
+
+} EVT_EXPORTLOG_FLAGS;
+
+BOOL WINAPI EvtExportLog(
+ EVT_HANDLE Session,
+ LPCWSTR Path,
+ LPCWSTR Query,
+ LPCWSTR TargetFilePath,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtArchiveExportedLog(
+ EVT_HANDLE Session,
+ LPCWSTR LogFilePath,
+ LCID Locale,
+ DWORD Flags
+ );
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Channel Configuration
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+typedef enum _EVT_CHANNEL_CONFIG_PROPERTY_ID
+{
+ EvtChannelConfigEnabled = 0, // EvtVarTypeBoolean
+ EvtChannelConfigIsolation, // EvtVarTypeUInt32, EVT_CHANNEL_ISOLATION_TYPE
+ EvtChannelConfigType, // EvtVarTypeUInt32, EVT_CHANNEL_TYPE
+ EvtChannelConfigOwningPublisher, // EvtVarTypeString
+ EvtChannelConfigClassicEventlog, // EvtVarTypeBoolean
+ EvtChannelConfigAccess, // EvtVarTypeString
+ EvtChannelLoggingConfigRetention, // EvtVarTypeBoolean
+ EvtChannelLoggingConfigAutoBackup, // EvtVarTypeBoolean
+ EvtChannelLoggingConfigMaxSize, // EvtVarTypeUInt64
+ EvtChannelLoggingConfigLogFilePath, // EvtVarTypeString
+ EvtChannelPublishingConfigLevel, // EvtVarTypeUInt32
+ EvtChannelPublishingConfigKeywords, // EvtVarTypeUInt64
+ EvtChannelPublishingConfigControlGuid, // EvtVarTypeGuid
+ EvtChannelPublishingConfigBufferSize, // EvtVarTypeUInt32
+ EvtChannelPublishingConfigMinBuffers, // EvtVarTypeUInt32
+ EvtChannelPublishingConfigMaxBuffers, // EvtVarTypeUInt32
+ EvtChannelPublishingConfigLatency, // EvtVarTypeUInt32
+ EvtChannelPublishingConfigClockType, // EvtVarTypeUInt32, EVT_CHANNEL_CLOCK_TYPE
+ EvtChannelPublishingConfigSidType, // EvtVarTypeUInt32, EVT_CHANNEL_SID_TYPE
+ EvtChannelPublisherList, // EvtVarTypeString | EVT_VARIANT_TYPE_ARRAY
+ EvtChannelConfigPropertyIdEND
+
+} EVT_CHANNEL_CONFIG_PROPERTY_ID;
+
+typedef enum _EVT_CHANNEL_TYPE
+{
+ EvtChannelTypeAdmin = 0,
+ EvtChannelTypeOperational,
+ EvtChannelTypeAnalytic,
+ EvtChannelTypeDebug
+
+} EVT_CHANNEL_TYPE;
+
+typedef enum _EVT_CHANNEL_ISOLATION_TYPE
+{
+ EvtChannelIsolationTypeApplication = 0,
+ EvtChannelIsolationTypeSystem,
+ EvtChannelIsolationTypeCustom
+
+} EVT_CHANNEL_ISOLATION_TYPE;
+
+typedef enum _EVT_CHANNEL_CLOCK_TYPE
+{
+ EvtChannelClockTypeSystemTime = 0, // System time
+ EvtChannelClockTypeQPC // Query performance counter
+
+} EVT_CHANNEL_CLOCK_TYPE;
+
+typedef enum _EVT_CHANNEL_SID_TYPE
+{
+ EvtChannelSidTypeNone = 0,
+ EvtChannelSidTypePublishing
+
+} EVT_CHANNEL_SID_TYPE;
+
+EVT_HANDLE WINAPI EvtOpenChannelEnum(
+ EVT_HANDLE Session,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtNextChannelPath(
+ EVT_HANDLE ChannelEnum,
+ DWORD ChannelPathBufferSize,
+ __out_ecount_part_opt(ChannelPathBufferSize, *ChannelPathBufferUsed)
+ LPWSTR ChannelPathBuffer,
+ __out PDWORD ChannelPathBufferUsed
+ );
+
+EVT_HANDLE WINAPI EvtOpenChannelConfig(
+ EVT_HANDLE Session,
+ LPCWSTR ChannelPath,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtSaveChannelConfig(
+ EVT_HANDLE ChannelConfig,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtSetChannelConfigProperty(
+ EVT_HANDLE ChannelConfig,
+ EVT_CHANNEL_CONFIG_PROPERTY_ID PropertyId,
+ DWORD Flags,
+ PEVT_VARIANT PropertyValue
+ );
+
+BOOL WINAPI EvtGetChannelConfigProperty(
+ EVT_HANDLE ChannelConfig,
+ EVT_CHANNEL_CONFIG_PROPERTY_ID PropertyId,
+ DWORD Flags,
+ DWORD PropertyValueBufferSize,
+ PEVT_VARIANT PropertyValueBuffer,
+ __out PDWORD PropertyValueBufferUsed
+ );
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Publisher Metadata
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_CHANNEL_REFERENCE_FLAGS
+{
+ EvtChannelReferenceImported = 0x1,
+
+} EVT_CHANNEL_REFERENCE_FLAGS;
+
+typedef enum _EVT_PUBLISHER_METADATA_PROPERTY_ID
+{
+ EvtPublisherMetadataPublisherGuid = 0, // EvtVarTypeGuid
+ EvtPublisherMetadataResourceFilePath, // EvtVarTypeString
+ EvtPublisherMetadataParameterFilePath, // EvtVarTypeString
+ EvtPublisherMetadataMessageFilePath, // EvtVarTypeString
+ EvtPublisherMetadataHelpLink, // EvtVarTypeString
+ EvtPublisherMetadataPublisherMessageID, // EvtVarTypeUInt32
+
+ EvtPublisherMetadataChannelReferences, // EvtVarTypeEvtHandle, ObjectArray
+ EvtPublisherMetadataChannelReferencePath, // EvtVarTypeString
+ EvtPublisherMetadataChannelReferenceIndex, // EvtVarTypeUInt32
+ EvtPublisherMetadataChannelReferenceID, // EvtVarTypeUInt32
+ EvtPublisherMetadataChannelReferenceFlags, // EvtVarTypeUInt32
+ EvtPublisherMetadataChannelReferenceMessageID, // EvtVarTypeUInt32
+
+ EvtPublisherMetadataLevels, // EvtVarTypeEvtHandle, ObjectArray
+ EvtPublisherMetadataLevelName, // EvtVarTypeString
+ EvtPublisherMetadataLevelValue, // EvtVarTypeUInt32
+ EvtPublisherMetadataLevelMessageID, // EvtVarTypeUInt32
+
+ EvtPublisherMetadataTasks, // EvtVarTypeEvtHandle, ObjectArray
+ EvtPublisherMetadataTaskName, // EvtVarTypeString
+ EvtPublisherMetadataTaskEventGuid, // EvtVarTypeGuid
+ EvtPublisherMetadataTaskValue, // EvtVarTypeUInt32
+ EvtPublisherMetadataTaskMessageID, // EvtVarTypeUInt32
+
+ EvtPublisherMetadataOpcodes, // EvtVarTypeEvtHandle, ObjectArray
+ EvtPublisherMetadataOpcodeName, // EvtVarTypeString
+ EvtPublisherMetadataOpcodeValue, // EvtVarTypeUInt32
+ EvtPublisherMetadataOpcodeMessageID, // EvtVarTypeUInt32
+
+ EvtPublisherMetadataKeywords, // EvtVarTypeEvtHandle, ObjectArray
+ EvtPublisherMetadataKeywordName, // EvtVarTypeString
+ EvtPublisherMetadataKeywordValue, // EvtVarTypeUInt64
+ EvtPublisherMetadataKeywordMessageID, // EvtVarTypeUInt32
+
+
+ EvtPublisherMetadataPropertyIdEND
+
+} EVT_PUBLISHER_METADATA_PROPERTY_ID;
+
+EVT_HANDLE WINAPI EvtOpenPublisherEnum(
+ EVT_HANDLE Session,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtNextPublisherId(
+ EVT_HANDLE PublisherEnum,
+ DWORD PublisherIdBufferSize,
+ __out_ecount_part_opt(PublisherIdBufferSize, *PublisherIdBufferUsed)
+ LPWSTR PublisherIdBuffer,
+ __out PDWORD PublisherIdBufferUsed
+ );
+
+#endif
+
+EVT_HANDLE WINAPI EvtOpenPublisherMetadata(
+ EVT_HANDLE Session,
+ LPCWSTR PublisherId,
+ LPCWSTR LogFilePath,
+ LCID Locale,
+ DWORD Flags
+ );
+
+#if 0
+
+BOOL WINAPI EvtGetPublisherMetadataProperty(
+ EVT_HANDLE PublisherMetadata,
+ EVT_PUBLISHER_METADATA_PROPERTY_ID PropertyId,
+ DWORD Flags,
+ DWORD PublisherMetadataPropertyBufferSize,
+ PEVT_VARIANT PublisherMetadataPropertyBuffer,
+ __out PDWORD PublisherMetadataPropertyBufferUsed
+ );
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Event Metadata Configuratin
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_EVENT_METADATA_PROPERTY_ID
+{
+ EventMetadataEventID, // EvtVarTypeUInt32
+ EventMetadataEventVersion, // EvtVarTypeUInt32
+ EventMetadataEventChannel, // EvtVarTypeUInt32
+ EventMetadataEventLevel, // EvtVarTypeUInt32
+ EventMetadataEventOpcode, // EvtVarTypeUInt32
+ EventMetadataEventTask, // EvtVarTypeUInt32
+ EventMetadataEventKeyword, // EvtVarTypeUInt64
+ EventMetadataEventMessageID,// EvtVarTypeUInt32
+ EventMetadataEventTemplate, // EvtVarTypeString
+ EvtEventMetadataPropertyIdEND
+
+} EVT_EVENT_METADATA_PROPERTY_ID;
+
+EVT_HANDLE WINAPI EvtOpenEventMetadataEnum(
+ EVT_HANDLE PublisherMetadata,
+ DWORD Flags
+ );
+
+EVT_HANDLE WINAPI EvtNextEventMetadata(
+ EVT_HANDLE EventMetadataEnum,
+ DWORD Flags
+ );
+
+BOOL WINAPI EvtGetEventMetadataProperty(
+ EVT_HANDLE EventMetadata,
+ EVT_EVENT_METADATA_PROPERTY_ID PropertyId,
+ DWORD Flags,
+ DWORD EventMetadataPropertyBufferSize,
+ PEVT_VARIANT EventMetadataPropertyBuffer,
+ __out PDWORD EventMetadataPropertyBufferUsed
+ );
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Array Access
+//
+////////////////////////////////////////////////////////////////////////////////
+
+typedef HANDLE EVT_OBJECT_ARRAY_PROPERTY_HANDLE;
+
+BOOL WINAPI EvtGetObjectArraySize(
+ EVT_OBJECT_ARRAY_PROPERTY_HANDLE ObjectArray,
+ __out PDWORD ObjectArraySize
+ );
+
+BOOL WINAPI EvtGetObjectArrayProperty(
+ EVT_OBJECT_ARRAY_PROPERTY_HANDLE ObjectArray,
+ DWORD PropertyId,
+ DWORD ArrayIndex,
+ DWORD Flags,
+ DWORD PropertyValueBufferSize,
+ PEVT_VARIANT PropertyValueBuffer,
+ __out PDWORD PropertyValueBufferUsed
+ );
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Misc Event Consumer Functions
+//
+////////////////////////////////////////////////////////////////////////////
+
+typedef enum _EVT_QUERY_PROPERTY_ID
+{
+ //
+ // list of channels or logfiles indentified in the query. Variant will be
+ // array of EvtVarTypeString.
+ //
+ EvtQueryNames,
+
+ //
+ // Array of EvtVarTypeUInt32, indicating creation status ( Win32 error
+ // code ) for the list of names returned by the EvtQueryNames
+ // property.
+ //
+ EvtQueryStatuses,
+
+ EvtQueryPropertyIdEND
+
+} EVT_QUERY_PROPERTY_ID;
+
+typedef enum _EVT_EVENT_PROPERTY_ID
+{
+ EvtEventQueryIDs = 0,
+ EvtEventPath,
+ EvtEventPropertyIdEND
+
+} EVT_EVENT_PROPERTY_ID;
+
+
+BOOL WINAPI EvtGetQueryInfo(
+ EVT_HANDLE QueryOrSubscription,
+ EVT_QUERY_PROPERTY_ID PropertyId,
+ DWORD PropertyValueBufferSize,
+ PEVT_VARIANT PropertyValueBuffer,
+ __out PDWORD PropertyValueBufferUsed
+ );
+
+EVT_HANDLE WINAPI EvtCreateBookmark(
+ __in_opt LPCWSTR BookmarkXml
+ );
+
+BOOL WINAPI EvtUpdateBookmark(
+ EVT_HANDLE Bookmark,
+ EVT_HANDLE Event
+ );
+
+BOOL WINAPI EvtGetEventInfo(
+ EVT_HANDLE Event,
+ EVT_EVENT_PROPERTY_ID PropertyId,
+ DWORD PropertyValueBufferSize,
+ PEVT_VARIANT PropertyValueBuffer,
+ __out PDWORD PropertyValueBufferUsed
+ );
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Access Control Permissions
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#define EVT_READ_ACCESS 0x1
+#define EVT_WRITE_ACCESS 0x2
+#define EVT_CLEAR_ACCESS 0x4
+#define EVT_ALL_ACCESS 0x7
+
+#endif
+
+#endif // __WINEVT_H__
diff --git a/src/win32ctl/include/winmeta.h b/src/win32ctl/include/winmeta.h
new file mode 100644
index 0000000..dce52e0
--- /dev/null
+++ b/src/win32ctl/include/winmeta.h
@@ -0,0 +1,3 @@
+
+#define WINEVENT_KEYWORD_AUDIT_FAILURE 0x10000000000000LL
+
diff --git a/src/win32ctl/include/winperf.h b/src/win32ctl/include/winperf.h
new file mode 100644
index 0000000..e5dd86d
--- /dev/null
+++ b/src/win32ctl/include/winperf.h
@@ -0,0 +1,193 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _WINPERF_
+#define _WINPERF_
+
+#include <pshpack8.h>
+
+#define PERF_DATA_VERSION 1
+#define PERF_DATA_REVISION 1
+
+typedef struct _PERF_DATA_BLOCK {
+ WCHAR Signature[4];
+ DWORD LittleEndian;
+ DWORD Version;
+ DWORD Revision;
+ DWORD TotalByteLength;
+ DWORD HeaderLength;
+ DWORD NumObjectTypes;
+ LONG DefaultObject;
+ SYSTEMTIME SystemTime;
+ LARGE_INTEGER PerfTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER PerfTime100nSec;
+ DWORD SystemNameLength;
+ DWORD SystemNameOffset;
+} PERF_DATA_BLOCK,*PPERF_DATA_BLOCK;
+
+typedef struct _PERF_OBJECT_TYPE {
+ DWORD TotalByteLength;
+ DWORD DefinitionLength;
+ DWORD HeaderLength;
+ DWORD ObjectNameTitleIndex;
+#ifdef _WIN64
+ DWORD ObjectNameTitle;
+#else
+ LPWSTR ObjectNameTitle;
+#endif
+ DWORD ObjectHelpTitleIndex;
+#ifdef _WIN64
+ DWORD ObjectHelpTitle;
+#else
+ LPWSTR ObjectHelpTitle;
+#endif
+ DWORD DetailLevel;
+ DWORD NumCounters;
+ LONG DefaultCounter;
+ LONG NumInstances;
+ DWORD CodePage;
+ LARGE_INTEGER PerfTime;
+ LARGE_INTEGER PerfFreq;
+} PERF_OBJECT_TYPE,*PPERF_OBJECT_TYPE;
+
+#define PERF_NO_INSTANCES -1
+#define PERF_SIZE_DWORD 0x00000000
+#define PERF_SIZE_LARGE 0x00000100
+#define PERF_SIZE_ZERO 0x00000200
+#define PERF_SIZE_VARIABLE_LEN 0x00000300
+#define PERF_TYPE_NUMBER 0x00000000
+#define PERF_TYPE_COUNTER 0x00000400
+#define PERF_TYPE_TEXT 0x00000800
+#define PERF_TYPE_ZERO 0x00000C00
+#define PERF_NUMBER_HEX 0x00000000
+#define PERF_NUMBER_DECIMAL 0x00010000
+#define PERF_NUMBER_DEC_1000 0x00020000
+#define PERF_COUNTER_VALUE 0x00000000
+#define PERF_COUNTER_RATE 0x00010000
+#define PERF_COUNTER_FRACTION 0x00020000
+#define PERF_COUNTER_BASE 0x00030000
+#define PERF_COUNTER_ELAPSED 0x00040000
+#define PERF_COUNTER_QUEUELEN 0x00050000
+#define PERF_COUNTER_HISTOGRAM 0x00060000
+#define PERF_COUNTER_PRECISION 0x00070000
+#define PERF_TEXT_UNICODE 0x00000000
+#define PERF_TEXT_ASCII 0x00010000
+#define PERF_TIMER_TICK 0x00000000
+#define PERF_TIMER_100NS 0x00100000
+#define PERF_OBJECT_TIMER 0x00200000
+#define PERF_DELTA_COUNTER 0x00400000
+#define PERF_DELTA_BASE 0x00800000
+#define PERF_INVERSE_COUNTER 0x01000000
+#define PERF_MULTI_COUNTER 0x02000000
+
+#define PERF_DISPLAY_NO_SUFFIX 0x00000000
+#define PERF_DISPLAY_PER_SEC 0x10000000
+#define PERF_DISPLAY_PERCENT 0x20000000
+#define PERF_DISPLAY_SECONDS 0x30000000
+#define PERF_DISPLAY_NOSHOW 0x40000000
+
+#define PERF_COUNTER_COUNTER (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)
+#define PERF_COUNTER_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_QUEUELEN_TYPE (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_QUEUELEN_TYPE (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_100NS_QUEUELEN_TYPE (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_BULK_COUNT (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)
+#define PERF_COUNTER_TEXT (PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_RAWCOUNT (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_RAWCOUNT (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_RAWCOUNT_HEX (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_RAWCOUNT_HEX (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_SAMPLE_FRACTION (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT)
+#define PERF_SAMPLE_COUNTER (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_NODATA (PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW)
+#define PERF_COUNTER_TIMER_INV (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_SAMPLE_BASE (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000001)
+#define PERF_AVERAGE_TIMER (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_SECONDS)
+#define PERF_AVERAGE_BASE (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000002)
+#define PERF_AVERAGE_BULK (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_NOSHOW)
+#define PERF_OBJ_TIME_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_100NSEC_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_100NSEC_TIMER_INV (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_TIMER_INV (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_BASE (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW)
+#define PERF_100NSEC_MULTI_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_100NSEC_MULTI_TIMER_INV (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_RAW_FRACTION (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)
+#define PERF_LARGE_RAW_FRACTION (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)
+#define PERF_RAW_BASE (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000003)
+#define PERF_LARGE_RAW_BASE (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW)
+#define PERF_ELAPSED_TIME (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED | PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS)
+#define PERF_COUNTER_HISTOGRAM_TYPE 0x80000000
+#define PERF_COUNTER_DELTA (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_DELTA (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
+#define PERF_PRECISION_SYSTEM_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_PRECISION_100NS_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+#define PERF_PRECISION_OBJECT_TIMER (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
+
+#define PERF_PRECISION_TIMESTAMP PERF_LARGE_RAW_BASE
+
+#define PERF_DETAIL_NOVICE 100
+#define PERF_DETAIL_ADVANCED 200
+#define PERF_DETAIL_EXPERT 300
+#define PERF_DETAIL_WIZARD 400
+
+typedef struct _PERF_COUNTER_DEFINITION {
+ DWORD ByteLength;
+ DWORD CounterNameTitleIndex;
+#ifdef _WIN64
+ DWORD CounterNameTitle;
+#else
+ LPWSTR CounterNameTitle;
+#endif
+ DWORD CounterHelpTitleIndex;
+#ifdef _WIN64
+ DWORD CounterHelpTitle;
+#else
+ LPWSTR CounterHelpTitle;
+#endif
+ LONG DefaultScale;
+ DWORD DetailLevel;
+ DWORD CounterType;
+ DWORD CounterSize;
+ DWORD CounterOffset;
+} PERF_COUNTER_DEFINITION,*PPERF_COUNTER_DEFINITION;
+
+#define PERF_NO_UNIQUE_ID -1
+
+typedef struct _PERF_INSTANCE_DEFINITION {
+ DWORD ByteLength;
+ DWORD ParentObjectTitleIndex;
+ DWORD ParentObjectInstance;
+ LONG UniqueID;
+ DWORD NameOffset;
+ DWORD NameLength;
+} PERF_INSTANCE_DEFINITION,*PPERF_INSTANCE_DEFINITION;
+
+typedef struct _PERF_COUNTER_BLOCK {
+ DWORD ByteLength;
+
+} PERF_COUNTER_BLOCK,*PPERF_COUNTER_BLOCK;
+
+#define PERF_QUERY_OBJECTS ((LONG)0x80000000)
+#define PERF_QUERY_GLOBAL ((LONG)0x80000001)
+#define PERF_QUERY_COSTLY ((LONG)0x80000002)
+
+typedef DWORD (WINAPI PM_OPEN_PROC)(LPWSTR);
+typedef DWORD (WINAPI PM_COLLECT_PROC)(LPWSTR,LPVOID *,LPDWORD,LPDWORD);
+typedef DWORD (WINAPI PM_CLOSE_PROC)(void);
+typedef DWORD (WINAPI PM_QUERY_PROC)(LPDWORD,LPVOID *,LPDWORD,LPDWORD);
+
+#define MAX_PERF_OBJECTS_IN_QUERY_FUNCTION (64L)
+
+#define WINPERF_LOG_NONE 0
+#define WINPERF_LOG_USER 1
+#define WINPERF_LOG_DEBUG 2
+#define WINPERF_LOG_VERBOSE 3
+
+#include <poppack.h>
+#endif
diff --git a/src/win32ctl/include/wmistr.h b/src/win32ctl/include/wmistr.h
new file mode 100644
index 0000000..5fceb2f
--- /dev/null
+++ b/src/win32ctl/include/wmistr.h
@@ -0,0 +1,198 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _WMISTR_
+#define _WMISTR_
+
+/* --- start added by kenj */
+#undef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+
+#ifndef __C89_NAMELESS
+#define __C89_NAMELESS __MINGW_EXTENSION
+
+#define __C89_NAMELESSSTRUCTNAME
+#define __C89_NAMELESSUNIONNAME
+#endif
+/* --- end added by kenj */
+
+typedef struct _WNODE_HEADER {
+ ULONG BufferSize;
+ ULONG ProviderId;
+ __C89_NAMELESS union {
+ ULONG64 HistoricalContext;
+ __C89_NAMELESS struct {
+ ULONG Version;
+ ULONG Linkage;
+ };
+ };
+ __C89_NAMELESS union {
+ ULONG CountLost;
+ HANDLE KernelHandle;
+ LARGE_INTEGER TimeStamp;
+ };
+ GUID Guid;
+ ULONG ClientContext;
+ ULONG Flags;
+} WNODE_HEADER,*PWNODE_HEADER;
+
+#define WNODE_FLAG_ALL_DATA 0x00000001
+#define WNODE_FLAG_SINGLE_INSTANCE 0x00000002
+#define WNODE_FLAG_SINGLE_ITEM 0x00000004
+#define WNODE_FLAG_EVENT_ITEM 0x00000008
+#define WNODE_FLAG_FIXED_INSTANCE_SIZE 0x00000010
+#define WNODE_FLAG_TOO_SMALL 0x00000020
+#define WNODE_FLAG_INSTANCES_SAME 0x00000040
+#define WNODE_FLAG_STATIC_INSTANCE_NAMES 0x00000080
+#define WNODE_FLAG_INTERNAL 0x00000100
+#define WNODE_FLAG_USE_TIMESTAMP 0x00000200
+#define WNODE_FLAG_PERSIST_EVENT 0x00000400
+#define WNODE_FLAG_EVENT_REFERENCE 0x00002000
+#define WNODE_FLAG_ANSI_INSTANCENAMES 0x00004000
+#define WNODE_FLAG_METHOD_ITEM 0x00008000
+#define WNODE_FLAG_PDO_INSTANCE_NAMES 0x00010000
+#define WNODE_FLAG_TRACED_GUID 0x00020000
+#define WNODE_FLAG_LOG_WNODE 0x00040000
+#define WNODE_FLAG_USE_GUID_PTR 0x00080000
+#define WNODE_FLAG_USE_MOF_PTR 0x00100000
+#define WNODE_FLAG_NO_HEADER 0x00200000
+#define WNODE_FLAG_SEVERITY_MASK 0xff000000
+
+typedef struct {
+ ULONG OffsetInstanceData;
+ ULONG LengthInstanceData;
+} OFFSETINSTANCEDATAANDLENGTH,*POFFSETINSTANCEDATAANDLENGTH;
+
+typedef struct tagWNODE_ALL_DATA {
+ struct _WNODE_HEADER WnodeHeader;
+ ULONG DataBlockOffset;
+ ULONG InstanceCount;
+ ULONG OffsetInstanceNameOffsets;
+ __C89_NAMELESS union {
+ ULONG FixedInstanceSize;
+ OFFSETINSTANCEDATAANDLENGTH OffsetInstanceDataAndLength[1];
+ };
+} WNODE_ALL_DATA,*PWNODE_ALL_DATA;
+
+typedef struct tagWNODE_SINGLE_INSTANCE {
+ struct _WNODE_HEADER WnodeHeader;
+ ULONG OffsetInstanceName;
+ ULONG InstanceIndex;
+ ULONG DataBlockOffset;
+ ULONG SizeDataBlock;
+ UCHAR VariableData[];
+} WNODE_SINGLE_INSTANCE,*PWNODE_SINGLE_INSTANCE;
+
+typedef struct tagWNODE_SINGLE_ITEM {
+ struct _WNODE_HEADER WnodeHeader;
+ ULONG OffsetInstanceName;
+ ULONG InstanceIndex;
+ ULONG ItemId;
+ ULONG DataBlockOffset;
+ ULONG SizeDataItem;
+ UCHAR VariableData[];
+} WNODE_SINGLE_ITEM,*PWNODE_SINGLE_ITEM;
+
+typedef struct tagWNODE_METHOD_ITEM {
+ struct _WNODE_HEADER WnodeHeader;
+ ULONG OffsetInstanceName;
+ ULONG InstanceIndex;
+ ULONG MethodId;
+ ULONG DataBlockOffset;
+ ULONG SizeDataBlock;
+ UCHAR VariableData[];
+} WNODE_METHOD_ITEM,*PWNODE_METHOD_ITEM;
+
+typedef struct tagWNODE_EVENT_ITEM {
+ struct _WNODE_HEADER WnodeHeader;
+} WNODE_EVENT_ITEM,*PWNODE_EVENT_ITEM;
+
+typedef struct tagWNODE_EVENT_REFERENCE {
+ struct _WNODE_HEADER WnodeHeader;
+ GUID TargetGuid;
+ ULONG TargetDataBlockSize;
+ __C89_NAMELESS union {
+ ULONG TargetInstanceIndex;
+ WCHAR TargetInstanceName[1];
+ };
+} WNODE_EVENT_REFERENCE,*PWNODE_EVENT_REFERENCE;
+
+typedef struct tagWNODE_TOO_SMALL {
+ struct _WNODE_HEADER WnodeHeader;
+ ULONG SizeNeeded;
+} WNODE_TOO_SMALL,*PWNODE_TOO_SMALL;
+
+typedef struct {
+ GUID Guid;
+ ULONG Flags;
+ ULONG InstanceCount;
+ __C89_NAMELESS union {
+ ULONG InstanceNameList;
+ ULONG BaseNameOffset;
+ ULONG_PTR Pdo;
+ ULONG_PTR InstanceInfo;
+ };
+} WMIREGGUIDW,*PWMIREGGUIDW;
+
+typedef WMIREGGUIDW WMIREGGUID;
+typedef PWMIREGGUIDW PWMIREGGUID;
+
+#define WMIREG_FLAG_EXPENSIVE 0x00000001
+#define WMIREG_FLAG_INSTANCE_LIST 0x00000004
+#define WMIREG_FLAG_INSTANCE_BASENAME 0x00000008
+#define WMIREG_FLAG_INSTANCE_PDO 0x00000020
+#define WMIREG_FLAG_REMOVE_GUID 0x00010000
+#define WMIREG_FLAG_RESERVED1 0x00020000
+#define WMIREG_FLAG_RESERVED2 0x00040000
+#define WMIREG_FLAG_TRACED_GUID 0x00080000
+#define WMIREG_FLAG_TRACE_CONTROL_GUID 0x00001000
+#define WMIREG_FLAG_EVENT_ONLY_GUID 0x00000040
+
+typedef struct {
+ ULONG BufferSize;
+ ULONG NextWmiRegInfo;
+ ULONG RegistryPath;
+ ULONG MofResourceName;
+ ULONG GuidCount;
+ WMIREGGUIDW WmiRegGuid[];
+} WMIREGINFOW,*PWMIREGINFOW;
+
+typedef WMIREGINFOW WMIREGINFO;
+typedef PWMIREGINFOW PWMIREGINFO;
+
+typedef enum {
+ WMI_GET_ALL_DATA = 0,WMI_GET_SINGLE_INSTANCE = 1,WMI_SET_SINGLE_INSTANCE = 2,WMI_SET_SINGLE_ITEM = 3,WMI_ENABLE_EVENTS = 4,WMI_DISABLE_EVENTS = 5,
+ WMI_ENABLE_COLLECTION = 6,WMI_DISABLE_COLLECTION = 7,WMI_REGINFO = 8,WMI_EXECUTE_METHOD = 9
+} WMIDPREQUESTCODE;
+
+#if defined(_WINNT_) || defined(WINNT)
+
+#define WMI_GUIDTYPE_TRACECONTROL 0
+#define WMI_GUIDTYPE_TRACE 1
+#define WMI_GUIDTYPE_DATA 2
+#define WMI_GUIDTYPE_EVENT 3
+
+#define WMIGUID_QUERY 0x0001
+#define WMIGUID_SET 0x0002
+#define WMIGUID_NOTIFICATION 0x0004
+#define WMIGUID_READ_DESCRIPTION 0x0008
+#define WMIGUID_EXECUTE 0x0010
+#define TRACELOG_CREATE_REALTIME 0x0020
+#define TRACELOG_CREATE_ONDISK 0x0040
+#define TRACELOG_GUID_ENABLE 0x0080
+#define TRACELOG_ACCESS_KERNEL_LOGGER 0x0100
+#define TRACELOG_CREATE_INPROC 0x0200
+#define TRACELOG_ACCESS_REALTIME 0x0400
+#define TRACELOG_REGISTER_GUIDS 0x0800
+
+#define WMIGUID_ALL_ACCESS (STANDARD_RIGHTS_READ | SYNCHRONIZE | WMIGUID_QUERY | WMIGUID_SET | WMIGUID_NOTIFICATION | WMIGUID_READ_DESCRIPTION | WMIGUID_EXECUTE | TRACELOG_CREATE_REALTIME | TRACELOG_CREATE_ONDISK | TRACELOG_GUID_ENABLE | TRACELOG_ACCESS_KERNEL_LOGGER | TRACELOG_CREATE_INPROC | TRACELOG_ACCESS_REALTIME | TRACELOG_REGISTER_GUIDS)
+
+#define WMI_GLOBAL_LOGGER_ID 0x0001
+#endif
+#endif
diff --git a/src/win32ctl/lib/GNUmakefile b/src/win32ctl/lib/GNUmakefile
new file mode 100755
index 0000000..7782434
--- /dev/null
+++ b/src/win32ctl/lib/GNUmakefile
@@ -0,0 +1,42 @@
+#!gmake
+#
+# Copyright (c) 2010-2011 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../../..
+include $(TOPDIR)/src/include/builddefs
+
+ifeq "$(TARGET_OS)" "mingw"
+STATICLIBS = libpcp_pdh.a libpcp_tdh.a
+endif
+STATICDEFS = libpcp_pdh.def libpcp_tdh.def
+MKWIN32LIB = sh -c "$(DLLTOOL) -d $< -k -l $@"
+
+LSRCFILES = $(STATICDEFS)
+LDIRT = $(STATICLIBS)
+
+default: $(STATICLIBS)
+
+include $(BUILDRULES)
+
+libpcp_pdh.a: libpcp_pdh.def
+ $(MKWIN32LIB)
+
+libpcp_tdh.a: libpcp_tdh.def
+ $(MKWIN32LIB)
+
+default_pcp: default
+
+install: default
+
+install_pcp: install
diff --git a/src/win32ctl/lib/libpcp_pdh.def b/src/win32ctl/lib/libpcp_pdh.def
new file mode 100644
index 0000000..4155414
--- /dev/null
+++ b/src/win32ctl/lib/libpcp_pdh.def
@@ -0,0 +1,12 @@
+LIBRARY pdh.dll
+EXPORTS
+DllInstall
+PdhAddCounterA@16
+PdhRemoveCounter@4
+PdhCollectQueryData@4
+PdhExpandCounterPathA@12
+PdhGetCounterInfoA@16
+PdhGetRawCounterValue@12
+PdhGetFormattedCounterValue@16
+PdhOpenQueryA@12
+PdhCloseQuery@4
diff --git a/src/win32ctl/lib/libpcp_tdh.def b/src/win32ctl/lib/libpcp_tdh.def
new file mode 100644
index 0000000..7563764
--- /dev/null
+++ b/src/win32ctl/lib/libpcp_tdh.def
@@ -0,0 +1,10 @@
+LIBRARY tdh.dll
+EXPORTS
+DllInstall
+TdhGetProperty@28
+TdhGetPropertySize@24
+TdhGetEventMapInformation@16
+TdhQueryProviderFieldInformation@24
+TdhGetEventInformation@20
+TdhEnumerateProviderFieldInformation@16
+TdhEnumerateProviders@8
diff --git a/src/win32ctl/mkaf.bat b/src/win32ctl/mkaf.bat
new file mode 100755
index 0000000..7c78626
--- /dev/null
+++ b/src/win32ctl/mkaf.bat
@@ -0,0 +1,10 @@
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+%PCP_DIR%\bin\sh.exe mkaf.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofbash
+:WinNT
+%PCP_DIR%\bin\sh.exe mkaf.sh %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofbash
+if %errorlevel% == 9009 echo You do not have sh.exe in your PCP_DIR.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+:endofbash
diff --git a/src/win32ctl/pcp.bat b/src/win32ctl/pcp.bat
new file mode 100755
index 0000000..81f72be
--- /dev/null
+++ b/src/win32ctl/pcp.bat
@@ -0,0 +1,10 @@
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+%PCP_DIR%\bin\sh.exe pcp.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofbash
+:WinNT
+%PCP_DIR%\bin\sh.exe pcp.sh %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofbash
+if %errorlevel% == 9009 echo You do not have sh.exe in your PCP_DIR.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+:endofbash
diff --git a/src/win32ctl/pmafm.bat b/src/win32ctl/pmafm.bat
new file mode 100755
index 0000000..91e96b7
--- /dev/null
+++ b/src/win32ctl/pmafm.bat
@@ -0,0 +1,10 @@
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+%PCP_DIR%\bin\sh.exe pmafm.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofbash
+:WinNT
+%PCP_DIR%\bin\sh.exe pmafm.sh %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofbash
+if %errorlevel% == 9009 echo You do not have sh.exe in your PCP_DIR.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+:endofbash
diff --git a/src/win32ctl/pmsignal.bat b/src/win32ctl/pmsignal.bat
new file mode 100755
index 0000000..6bbcef2
--- /dev/null
+++ b/src/win32ctl/pmsignal.bat
@@ -0,0 +1,10 @@
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+%PCP_DIR%\bin\sh.exe pmsignal.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofbash
+:WinNT
+%PCP_DIR%\bin\sh.exe pmsignal.sh %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofbash
+if %errorlevel% == 9009 echo You do not have sh.exe in your PCP_DIR.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+:endofbash
diff --git a/src/win32ctl/services/GNUmakefile b/src/win32ctl/services/GNUmakefile
new file mode 100644
index 0000000..b7eaa33
--- /dev/null
+++ b/src/win32ctl/services/GNUmakefile
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2008-2009 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../../..
+include $(TOPDIR)/src/include/builddefs
+
+CFILES = pcp-services.c
+CMDTARGET = pcp-services.exe
+LLDLIBS = $(PCPLIB)
+LSRCFILES = $(WRAPPERS)
+
+default: build-me
+
+include $(BUILDRULES)
+
+ifeq "$(TARGET_OS)" "mingw"
+build-me: $(CMDTARGET)
+install: default
+ $(INSTALL) -m 755 $(CMDTARGET) $(PCP_BIN_DIR)/$(CMDTARGET)
+else
+build-me:
+install:
+endif
+
+default_pcp: default
+
+install_pcp: install
diff --git a/src/win32ctl/services/pcp-services.c b/src/win32ctl/services/pcp-services.c
new file mode 100644
index 0000000..7164fde
--- /dev/null
+++ b/src/win32ctl/services/pcp-services.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2008-2009 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include "pmapi.h"
+#include "impl.h"
+#include <wtypes.h>
+#include <winnt.h>
+#include <winsvc.h>
+#include <winuser.h>
+
+typedef enum {
+ PCP_SERVICE_COLLECTORS = 0,
+ PCP_SERVICE_INFERENCE = 1,
+ PCP_SERVICE_PROXY = 2,
+ NUM_SERVICES
+} PCPSERVICE;
+
+VOID WINAPI pcpCollectorsSetup(DWORD, LPTSTR *);
+VOID WINAPI pcpInferenceSetup(DWORD, LPTSTR *);
+VOID WINAPI pcpProxySetup(DWORD, LPTSTR *);
+DWORD WINAPI pcpCollectorsDispatch(DWORD, DWORD, LPVOID, LPVOID);
+DWORD WINAPI pcpInferenceDispatch(DWORD, DWORD, LPVOID, LPVOID);
+DWORD WINAPI pcpProxyDispatch(DWORD, DWORD, LPVOID, LPVOID);
+
+typedef VOID WINAPI (*SETUPFUNC)(DWORD, LPTSTR *);
+typedef DWORD WINAPI (*DISPATCHFUNC)(DWORD, DWORD, LPVOID, LPVOID);
+
+struct {
+ TCHAR * name;
+ TCHAR * script;
+ HANDLE stopEvent;
+ SERVICE_STATUS status;
+ SERVICE_STATUS_HANDLE statusHandle;
+ SETUPFUNC setup;
+ DISPATCHFUNC dispatch;
+} services[3] = {
+ { .name = "PCP Collector Processes",
+ .script = "pcp",
+ .setup = pcpCollectorsSetup,
+ .dispatch = pcpCollectorsDispatch,
+ },
+ { .name = "PCP Inference Engines",
+ .script = "pmie",
+ .setup = pcpInferenceSetup,
+ .dispatch = pcpInferenceDispatch,
+ },
+ { .name = "PCP Collector Proxy",
+ .script = "pmproxy",
+ .setup = pcpProxySetup,
+ .dispatch = pcpProxyDispatch,
+ },
+};
+
+static char pcpdir[MAXPATHLEN+16]; /* PCP_DIR environment variable */
+static char pcpconf[MAXPATHLEN+16]; /* PCP_CONF string for putenv */
+static char pcpdirenv[MAXPATHLEN+16]; /* PCP_DIR string for putenv */
+
+int
+pcpScript(const char *name, const char *action)
+{
+ char s[MAXPATHLEN];
+ snprintf(s, sizeof(s), "%s\\bin\\sh.exe /etc/%s %s", pcpdir, name, action);
+ return system(s);
+}
+
+VOID
+pcpSetServiceState(PCPSERVICE s, DWORD state, DWORD code, DWORD waitHint)
+{
+ services[s].status.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
+ services[s].status.dwCurrentState = state;
+ services[s].status.dwWin32ExitCode = code;
+ services[s].status.dwWaitHint = waitHint;
+
+ if (state == SERVICE_START_PENDING)
+ services[s].status.dwControlsAccepted = 0;
+ else
+ services[s].status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+
+ if ((state == SERVICE_RUNNING) || (state == SERVICE_STOPPED))
+ services[s].status.dwCheckPoint = 0;
+ else
+ services[s].status.dwCheckPoint++;
+
+ /* Report the status of the service to the SCM. */
+ SetServiceStatus(services[s].statusHandle, &services[s].status);
+}
+
+VOID
+pcpServiceMain(DWORD argc, LPTSTR *argv, PCPSERVICE s)
+{
+ char *default_basedirs[] = { "C:\\Glider", "C:\\MSYS" };
+ char *default_service = "pcp";
+ char *service = NULL, *basedir = NULL;
+ int i;
+
+ if (argc > 1) { /* first argument is service name */
+ service = argv[1];
+ for (i = 0; i < NUM_SERVICES; i++)
+ if (strcmp(service, services[i].name) == 0)
+ break;
+ if (i == NUM_SERVICES)
+ return; /* unknown service requested - bail out */
+ }
+ if (service == NULL)
+ service = default_service;
+
+ if (argc > 2) /* second argument is PCP_DIR */
+ basedir = argv[2];
+ else if ((basedir = getenv("PCP_DIR")) == NULL) {
+ for (i = 0; i < 3; i++)
+ if (access(default_basedirs[i], R_OK) == 0) {
+ basedir = default_basedirs[i];
+ break;
+ }
+ }
+ if (!basedir || access(basedir, R_OK) != 0)
+ return; /* stuffed up if we have no PCP_DIR - bail out */
+
+ snprintf(pcpdir, sizeof(pcpdir), "%s", basedir);
+ snprintf(pcpconf, sizeof(pcpconf), "PCP_CONF=%s\\etc\\pcp.conf", pcpdir);
+ snprintf(pcpdirenv, sizeof(pcpdirenv), "PCP_DIR=%s", pcpdir);
+ putenv(pcpconf);
+ putenv(pcpdirenv);
+
+ services[s].statusHandle = RegisterServiceCtrlHandlerEx(
+ services[s].name, services[s].dispatch, NULL);
+ if (!services[s].statusHandle)
+ return;
+
+ pcpSetServiceState(s, SERVICE_START_PENDING, NO_ERROR, 0);
+
+ /*
+ * Create an event. The control handler function signals
+ * this event when it receives the stop control code.
+ */
+ services[s].stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (!services[s].stopEvent) {
+ pcpSetServiceState(s, SERVICE_STOPPED, NO_ERROR, 0);
+ return;
+ }
+
+ /*
+ * Go, go, go... run the start script for this service.
+ */
+ if (pcpScript(services[s].script, "start") != 0) {
+ pcpSetServiceState(s, SERVICE_STOPPED, NO_ERROR, 0);
+ return;
+ }
+
+ pcpSetServiceState(s, SERVICE_RUNNING, NO_ERROR, 0);
+
+ /* Check whether to stop the service. */
+ WaitForSingleObject(services[s].stopEvent, INFINITE);
+
+ /* ServiceState already set to SERVICE_STOP_PENDING */
+ pcpScript(services[s].script, "stop");
+
+ pcpSetServiceState(s, SERVICE_STOPPED, NO_ERROR, 0);
+}
+
+VOID WINAPI
+pcpCollectorsSetup(DWORD argc, LPTSTR *argv)
+{
+ pcpServiceMain(argc, argv, PCP_SERVICE_COLLECTORS);
+}
+
+VOID WINAPI
+pcpInferenceSetup(DWORD argc, LPTSTR *argv)
+{
+ pcpServiceMain(argc, argv, PCP_SERVICE_INFERENCE);
+}
+
+VOID WINAPI
+pcpProxySetup(DWORD argc, LPTSTR *argv)
+{
+ pcpServiceMain(argc, argv, PCP_SERVICE_PROXY);
+}
+
+DWORD
+pcpServiceHandler(DWORD dwControl, DWORD dwEventType,
+ LPVOID lpEventData, LPVOID lpContext, PCPSERVICE s)
+{
+ switch(dwControl) {
+ case SERVICE_CONTROL_STOP:
+ services[s].status.dwCurrentState = SERVICE_STOP_PENDING;
+ SetServiceStatus(services[s].statusHandle, &services[s].status);
+ SetEvent(services[s].stopEvent);
+ return NO_ERROR;
+
+ default:
+ break;
+ }
+
+ /* Send current status (done for most request types) */
+ SetServiceStatus(services[s].statusHandle, &services[s].status);
+ return NO_ERROR;
+}
+
+DWORD WINAPI
+pcpCollectorsDispatch(DWORD ctrl, DWORD type, LPVOID data, LPVOID ctxt)
+{
+ return pcpServiceHandler(ctrl, type, data, ctxt, PCP_SERVICE_COLLECTORS);
+}
+
+DWORD WINAPI
+pcpInferenceDispatch(DWORD ctrl, DWORD type, LPVOID data, LPVOID ctxt)
+{
+ return pcpServiceHandler(ctrl, type, data, ctxt, PCP_SERVICE_INFERENCE);
+}
+
+DWORD WINAPI
+pcpProxyDispatch(DWORD ctrl, DWORD type, LPVOID data, LPVOID ctxt)
+{
+ return pcpServiceHandler(ctrl, type, data, ctxt, PCP_SERVICE_PROXY);
+}
+
+int
+main(int argc, char **argv)
+{
+ SERVICE_TABLE_ENTRY dispatchTable[2];
+
+ __pmSetProgname(argv[0]);
+
+ /* setup dispatch table and sentinel */
+ dispatchTable[0].lpServiceName = services[0].name;
+ dispatchTable[0].lpServiceProc = services[0].setup;
+ dispatchTable[1].lpServiceName = NULL;
+ dispatchTable[1].lpServiceProc = NULL;
+
+ if (!StartServiceCtrlDispatcher(dispatchTable)) {
+ DWORD c = GetLastError();
+ fprintf(stderr, "%s: cannot dispatch services (%ld)\n", pmProgname, c);
+ if (c == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
+ fprintf(stderr, "%s: run as service, not on console\n", pmProgname);
+ return 1;
+ }
+ return 0;
+}
diff --git a/src/win32ctl/setevent/GNUmakefile b/src/win32ctl/setevent/GNUmakefile
new file mode 100644
index 0000000..d00af4f
--- /dev/null
+++ b/src/win32ctl/setevent/GNUmakefile
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2008-2009 Aconex. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+TOPDIR = ../../..
+include $(TOPDIR)/src/include/builddefs
+
+CFILES = pcp-setevent.c
+CMDTARGET = pcp-setevent.exe
+LLDLIBS = $(PCPLIB)
+LSRCFILES = $(WRAPPERS)
+
+default: build-me
+
+include $(BUILDRULES)
+
+ifeq "$(TARGET_OS)" "mingw"
+build-me: $(CMDTARGET)
+install: default
+ $(INSTALL) -m 755 $(CMDTARGET) $(PCP_BIN_DIR)/$(CMDTARGET)
+else
+build-me:
+install:
+endif
+
+default_pcp: default
+
+install_pcp: install
diff --git a/src/win32ctl/setevent/pcp-setevent.c b/src/win32ctl/setevent/pcp-setevent.c
new file mode 100644
index 0000000..dc6ad68
--- /dev/null
+++ b/src/win32ctl/setevent/pcp-setevent.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2009 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include "pmapi.h"
+#include "impl.h"
+
+enum {
+ PCP_SIGHUP = 1,
+ PCP_SIGUSR1 = 2,
+ PCP_SIGTERM = 3,
+ PCP_SIGKILL = 4,
+};
+
+int
+atosig(const char *sig)
+{
+ if (strcmp(sig, "HUP") == 0)
+ return PCP_SIGHUP;
+ if (strcmp(sig, "USR1") == 0)
+ return PCP_SIGUSR1;
+ if (strcmp(sig, "TERM") == 0)
+ return PCP_SIGTERM;
+ if (strcmp(sig, "KILL") == 0)
+ return PCP_SIGKILL;
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ pid_t pid;
+ char name[64];
+ int sig, error = 0;
+
+ __pmSetProgname(argv[0]);
+
+ if (argc != 3)
+ error++;
+ else if ((sig = atosig(argv[1])) < 1)
+ error++;
+ else if ((pid = (pid_t)atoi(argv[2])) < 1)
+ error++;
+
+ if (error) {
+ fprintf(stderr, "Usage: %s <HUP|USR1|TERM|KILL> <PID>\n", pmProgname);
+ return 2;
+ }
+
+ if (sig == PCP_SIGKILL) {
+ __pmProcessTerminate(pid, 1);
+ return 0;
+ }
+
+ if (!__pmProcessExists(pid)) {
+ fprintf(stderr, "%s: OpenEvent(%s) failed on PID %" FMT_PID " (%ld)\n",
+ pmProgname, name, pid, GetLastError());
+ return 1;
+ }
+
+ snprintf(name, sizeof(name), "PCP/%" FMT_PID "/SIG%s", pid, argv[1]);
+ HANDLE h = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT(name));
+ if (!h) {
+ fprintf(stderr, "%s: OpenEvent(%s) failed on PID %" FMT_PID " (%ld)\n",
+ pmProgname, name, pid, GetLastError());
+ return 1;
+ }
+ if (!SetEvent(h)) {
+ fprintf(stderr, "%s: SetEvent(%s) failed on PID %" FMT_PID " (%ld)\n",
+ pmProgname, name, pid, GetLastError());
+ return 1;
+ }
+
+ return 0;
+}