Skip to content

Commit 61752ef

Browse files
committed
Refactor sys_call to windows_event_api
1 parent 2836691 commit 61752ef

2 files changed

Lines changed: 154 additions & 194 deletions

File tree

plugins/inputs/windows_event_log/wineventlog/sys_call.go

Lines changed: 0 additions & 177 deletions
This file was deleted.

plugins/inputs/windows_event_log/wineventlog/windows_event_api.go

Lines changed: 154 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55

66
package wineventlog
77

8-
import "syscall"
8+
import (
9+
"syscall"
10+
"unsafe"
11+
)
912

1013
// WindowsEventAPI defines the interface for Windows Event Log API operations
1114
// This allows us to mock the Windows API calls for testing
@@ -20,41 +23,175 @@ type WindowsEventAPI interface {
2023
EvtOpenPublisherMetadata(session EvtHandle, publisherId *uint16, logFilePath *uint16, locale uint32, flags uint32) (EvtHandle, error)
2124
}
2225

26+
// EvtHandle is a handle to the event log.
27+
type EvtHandle uintptr
28+
29+
// EvtSubscribeFlag defines the possible values that specify when to start subscribing to events.
30+
type EvtSubscribeFlag uint32
31+
32+
const (
33+
EvtSubscribeStartAfterBookmark EvtSubscribeFlag = 3
34+
)
35+
36+
// EvtQueryFlag defines the values that specify how to return the query results and whether you are query against a channel or log file.
37+
// https://learn.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtquery
38+
type EvtQueryFlag uint32
39+
40+
const (
41+
EvtQueryChannelPath EvtQueryFlag = 1
42+
)
43+
44+
// EvtRenderFlag defines the values that specify what to render.
45+
type EvtRenderFlag uint32
46+
47+
// EVT_RENDER_FLAGS enumeration
48+
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa385563(v=vs.85).aspx
49+
const (
50+
EvtRenderEventXml EvtRenderFlag = 1
51+
)
52+
53+
// EvtRenderContextFlag defines the values that specify the type of information
54+
// to access from the event.
55+
type EvtRenderContextFlag uint32
56+
57+
// EvtFormatMessageFlag defines the values that specify the message string from
58+
// the event to format.
59+
type EvtFormatMessageFlag uint32
60+
61+
const (
62+
EvtFormatMessageXml EvtFormatMessageFlag = 9
63+
)
64+
65+
var (
66+
// For Windows versions newer than 2003
67+
modwevtapi = syscall.NewLazyDLL("wevtapi.dll")
68+
procEvtSubscribe = modwevtapi.NewProc("EvtSubscribe")
69+
procEvtQuery = modwevtapi.NewProc("EvtQuery")
70+
procEvtCreateBookmark = modwevtapi.NewProc("EvtCreateBookmark")
71+
procEvtCreateRenderContext = modwevtapi.NewProc("EvtCreateRenderContext")
72+
procEvtRender = modwevtapi.NewProc("EvtRender")
73+
procEvtClose = modwevtapi.NewProc("EvtClose")
74+
procEvtNext = modwevtapi.NewProc("EvtNext")
75+
procEvtFormatMessage = modwevtapi.NewProc("EvtFormatMessage")
76+
procEvtOpenPublisherMetadata = modwevtapi.NewProc("EvtOpenPublisherMetadata")
77+
)
78+
2379
// windowsEventAPI implements the interface using actual Windows API calls
2480
type windowsEventAPI struct{}
2581

2682
func NewWindowsEventAPI() WindowsEventAPI {
2783
return &windowsEventAPI{}
2884
}
2985

30-
func (r *windowsEventAPI) EvtSubscribe(session EvtHandle, signalEvent uintptr, channelPath *uint16, query *uint16, bookmark EvtHandle, context uintptr, callback syscall.Handle, flags EvtSubscribeFlag) (handle EvtHandle, err error) {
31-
return EvtSubscribe(session, signalEvent, channelPath, query, bookmark, context, callback, flags)
86+
func (w *windowsEventAPI) EvtSubscribe(session EvtHandle, signalEvent uintptr, channelPath *uint16, query *uint16, bookmark EvtHandle, context uintptr, callback syscall.Handle, flags EvtSubscribeFlag) (handle EvtHandle, err error) {
87+
r0, _, e1 := syscall.Syscall9(procEvtSubscribe.Addr(), 8, uintptr(session), uintptr(signalEvent), uintptr(unsafe.Pointer(channelPath)), uintptr(unsafe.Pointer(query)), uintptr(bookmark), uintptr(context), uintptr(callback), uintptr(flags), 0)
88+
handle = EvtHandle(r0)
89+
if handle == 0 {
90+
if e1 != 0 {
91+
err = error(e1)
92+
} else {
93+
err = syscall.EINVAL
94+
}
95+
}
96+
return
97+
}
98+
99+
func (w *windowsEventAPI) EvtQuery(session EvtHandle, path *uint16, query *uint16, flags EvtQueryFlag) (handle EvtHandle, err error) {
100+
r0, _, e1 := syscall.Syscall6(procEvtQuery.Addr(), 4, uintptr(session), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(query)), uintptr(flags), 0, 0)
101+
handle = EvtHandle(r0)
102+
if handle == 0 {
103+
if e1 != 0 {
104+
err = error(e1)
105+
} else {
106+
err = syscall.EINVAL
107+
}
108+
}
109+
return
32110
}
33111

34-
func (r *windowsEventAPI) EvtQuery(session EvtHandle, path *uint16, query *uint16, flags EvtQueryFlag) (handle EvtHandle, err error) {
35-
return EvtQuery(session, path, query, flags)
112+
func (w *windowsEventAPI) EvtCreateBookmark(bookmarkXML *uint16) (handle EvtHandle, err error) {
113+
r0, _, e1 := syscall.Syscall(procEvtCreateBookmark.Addr(), 1, uintptr(unsafe.Pointer(bookmarkXML)), 0, 0)
114+
handle = EvtHandle(r0)
115+
if handle == 0 {
116+
if e1 != 0 {
117+
err = error(e1)
118+
} else {
119+
err = syscall.EINVAL
120+
}
121+
}
122+
return
36123
}
37124

38-
func (r *windowsEventAPI) EvtNext(resultSet EvtHandle, eventArraySize uint32, eventArray *EvtHandle, timeout uint32, flags uint32, numReturned *uint32) error {
39-
return EvtNext(resultSet, eventArraySize, eventArray, timeout, flags, numReturned)
125+
func (w *windowsEventAPI) EvtCreateRenderContext(ValuePathsCount uint32, valuePaths uintptr, flags EvtRenderContextFlag) (handle EvtHandle, err error) {
126+
r0, _, e1 := syscall.Syscall(procEvtCreateRenderContext.Addr(), 3, uintptr(ValuePathsCount), uintptr(valuePaths), uintptr(flags))
127+
handle = EvtHandle(r0)
128+
if handle == 0 {
129+
if e1 != 0 {
130+
err = error(e1)
131+
} else {
132+
err = syscall.EINVAL
133+
}
134+
}
135+
return
40136
}
41137

42-
func (r *windowsEventAPI) EvtClose(handle EvtHandle) error {
43-
return EvtClose(handle)
138+
func (w *windowsEventAPI) EvtRender(context EvtHandle, fragment EvtHandle, flags EvtRenderFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32, propertyCount *uint32) (err error) {
139+
r1, _, e1 := syscall.Syscall9(procEvtRender.Addr(), 7, uintptr(context), uintptr(fragment), uintptr(flags), uintptr(bufferSize), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(bufferUsed)), uintptr(unsafe.Pointer(propertyCount)), 0, 0)
140+
if r1 == 0 {
141+
if e1 != 0 {
142+
err = error(e1)
143+
} else {
144+
err = syscall.EINVAL
145+
}
146+
}
147+
return
44148
}
45149

46-
func (r *windowsEventAPI) EvtRender(context EvtHandle, fragment EvtHandle, flags EvtRenderFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32, propertyCount *uint32) error {
47-
return EvtRender(context, fragment, flags, bufferSize, buffer, bufferUsed, propertyCount)
150+
func (w *windowsEventAPI) EvtClose(object EvtHandle) (err error) {
151+
r1, _, e1 := syscall.Syscall(procEvtClose.Addr(), 1, uintptr(object), 0, 0)
152+
if r1 == 0 {
153+
if e1 != 0 {
154+
err = error(e1)
155+
} else {
156+
err = syscall.EINVAL
157+
}
158+
}
159+
return
48160
}
49161

50-
func (r *windowsEventAPI) EvtCreateBookmark(bookmarkXML *uint16) (handle EvtHandle, err error) {
51-
return EvtCreateBookmark(bookmarkXML)
162+
func (w *windowsEventAPI) EvtNext(resultSet EvtHandle, eventArraySize uint32, eventArray *EvtHandle, timeout uint32, flags uint32, numReturned *uint32) (err error) {
163+
r1, _, e1 := syscall.Syscall6(procEvtNext.Addr(), 6, uintptr(resultSet), uintptr(eventArraySize), uintptr(unsafe.Pointer(eventArray)), uintptr(timeout), uintptr(flags), uintptr(unsafe.Pointer(numReturned)))
164+
if r1 == 0 {
165+
if e1 != 0 {
166+
err = error(e1)
167+
} else {
168+
err = syscall.EINVAL
169+
}
170+
}
171+
return
52172
}
53173

54-
func (r *windowsEventAPI) EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageId uint32, valueCount uint32, values uintptr, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) error {
55-
return EvtFormatMessage(publisherMetadata, event, messageId, valueCount, values, flags, bufferSize, buffer, bufferUsed)
174+
func (w *windowsEventAPI) EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageID uint32, valueCount uint32, values uintptr, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) (err error) {
175+
r1, _, e1 := syscall.Syscall9(procEvtFormatMessage.Addr(), 9, uintptr(publisherMetadata), uintptr(event), uintptr(messageID), uintptr(valueCount), uintptr(values), uintptr(flags), uintptr(bufferSize), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(bufferUsed)))
176+
if r1 == 0 {
177+
if e1 != 0 {
178+
err = error(e1)
179+
} else {
180+
err = syscall.EINVAL
181+
}
182+
}
183+
return
56184
}
57185

58-
func (r *windowsEventAPI) EvtOpenPublisherMetadata(session EvtHandle, publisherId *uint16, logFilePath *uint16, locale uint32, flags uint32) (EvtHandle, error) {
59-
return EvtOpenPublisherMetadata(session, publisherId, logFilePath, locale, flags)
186+
func (w *windowsEventAPI) EvtOpenPublisherMetadata(session EvtHandle, publisherIdentity *uint16, logFilePath *uint16, locale uint32, flags uint32) (handle EvtHandle, err error) {
187+
r0, _, e1 := syscall.Syscall6(procEvtOpenPublisherMetadata.Addr(), 5, uintptr(session), uintptr(unsafe.Pointer(publisherIdentity)), uintptr(unsafe.Pointer(logFilePath)), uintptr(locale), uintptr(flags), 0)
188+
handle = EvtHandle(r0)
189+
if handle == 0 {
190+
if e1 != 0 {
191+
err = error(e1)
192+
} else {
193+
err = syscall.EINVAL
194+
}
195+
}
196+
return
60197
}

0 commit comments

Comments
 (0)