55
66package 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
2480type windowsEventAPI struct {}
2581
2682func 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