winevt_c 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/example/eventlog.rb +5 -1
 - data/example/tailing.rb +7 -1
 - data/ext/winevt/winevt.c +3 -0
 - data/ext/winevt/winevt_c.h +18 -1
 - data/ext/winevt/winevt_query.c +41 -9
 - data/ext/winevt/winevt_session.c +425 -0
 - data/ext/winevt/winevt_subscribe.c +36 -10
 - data/ext/winevt/winevt_utils.cpp +24 -2
 - data/lib/winevt.rb +1 -0
 - data/lib/winevt/session.rb +15 -0
 - data/lib/winevt/subscribe.rb +5 -2
 - data/lib/winevt/version.rb +1 -1
 - metadata +4 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: fd29b4664130c80249811fb66df434aaa9219d6d375bcdaa7adfdd3fe72dd25e
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2a1e3ec7cb528269ebb65f4b1df72d6045f882d865956fb85def8bcb925d6944
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 0f80978e4268c233d2e309c0e9556f38386b35300381c04f4d84226ce239a85ccb48b20a2c2a3c59c3d0557347e95ff11e0ca11945eaa128ba2c78c67ebc9250
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: a8ff4fae4995b41910352186898d54c929a918f86a6a4efe29c0a5c93433d9c95d91be5c9f81fdb52ff5f2307cbb2e2e61790a22fe076b7221ba03c89aed48d5
         
     | 
    
        data/example/eventlog.rb
    CHANGED
    
    | 
         @@ -1,6 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'winevt'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            @ 
     | 
| 
      
 3 
     | 
    
         
            +
            @session = Winevt::EventLog::Session.new("127.0.0.1") # Or remote box ip
         
     | 
| 
      
 4 
     | 
    
         
            +
            # @session.domain = "<EXAMPLEGROUP>"
         
     | 
| 
      
 5 
     | 
    
         
            +
            # @session.username = "<username>"
         
     | 
| 
      
 6 
     | 
    
         
            +
            # @session.password = "<password>"
         
     | 
| 
      
 7 
     | 
    
         
            +
            @query = Winevt::EventLog::Query.new("Application", "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]", @session)
         
     | 
| 
       4 
8 
     | 
    
         | 
| 
       5 
9 
     | 
    
         
             
            @query.render_as_xml = true
         
     | 
| 
       6 
10 
     | 
    
         
             
            @query.preserve_qualifiers = true
         
     | 
    
        data/example/tailing.rb
    CHANGED
    
    | 
         @@ -1,11 +1,17 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'winevt'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            @session = Winevt::EventLog::Session.new("127.0.0.1") # Or remote box ip
         
     | 
| 
      
 4 
     | 
    
         
            +
            # @session.domain = "<EXAMPLEGROUP>"
         
     | 
| 
      
 5 
     | 
    
         
            +
            # @session.username = "<username>"
         
     | 
| 
      
 6 
     | 
    
         
            +
            # @session.password = "<password>"
         
     | 
| 
      
 7 
     | 
    
         
            +
            @bookmark = Winevt::EventLog::Bookmark.new
         
     | 
| 
       3 
8 
     | 
    
         
             
            @subscribe = Winevt::EventLog::Subscribe.new
         
     | 
| 
       4 
9 
     | 
    
         
             
            @subscribe.read_existing_events = true
         
     | 
| 
       5 
10 
     | 
    
         
             
            @subscribe.preserve_qualifiers = true
         
     | 
| 
       6 
11 
     | 
    
         
             
            @subscribe.render_as_xml = true
         
     | 
| 
       7 
12 
     | 
    
         
             
            @subscribe.subscribe(
         
     | 
| 
       8 
     | 
    
         
            -
              "Security", "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
         
     | 
| 
      
 13 
     | 
    
         
            +
              "Security", "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
         
     | 
| 
      
 14 
     | 
    
         
            +
              @bookmark, @session
         
     | 
| 
       9 
15 
     | 
    
         
             
            )
         
     | 
| 
       10 
16 
     | 
    
         
             
            while true do
         
     | 
| 
       11 
17 
     | 
    
         
             
              @subscribe.each do |eventlog, message, string_inserts|
         
     | 
    
        data/ext/winevt/winevt.c
    CHANGED
    
    | 
         @@ -5,6 +5,7 @@ VALUE rb_cQuery; 
     | 
|
| 
       5 
5 
     | 
    
         
             
            VALUE rb_cEventLog;
         
     | 
| 
       6 
6 
     | 
    
         
             
            VALUE rb_cSubscribe;
         
     | 
| 
       7 
7 
     | 
    
         
             
            VALUE rb_eWinevtQueryError;
         
     | 
| 
      
 8 
     | 
    
         
            +
            VALUE rb_eRemoteHandlerError;
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
            static ID id_call;
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
         @@ -16,12 +17,14 @@ Init_winevt(void) 
     | 
|
| 
       16 
17 
     | 
    
         
             
              rb_cQuery = rb_define_class_under(rb_cEventLog, "Query", rb_cObject);
         
     | 
| 
       17 
18 
     | 
    
         
             
              rb_cSubscribe = rb_define_class_under(rb_cEventLog, "Subscribe", rb_cObject);
         
     | 
| 
       18 
19 
     | 
    
         
             
              rb_eWinevtQueryError = rb_define_class_under(rb_cQuery, "Error", rb_eStandardError);
         
     | 
| 
      
 20 
     | 
    
         
            +
              rb_eRemoteHandlerError = rb_define_class_under(rb_cSubscribe, "RemoteHandlerError", rb_eRuntimeError);
         
     | 
| 
       19 
21 
     | 
    
         | 
| 
       20 
22 
     | 
    
         
             
              Init_winevt_channel(rb_cEventLog);
         
     | 
| 
       21 
23 
     | 
    
         
             
              Init_winevt_bookmark(rb_cEventLog);
         
     | 
| 
       22 
24 
     | 
    
         
             
              Init_winevt_query(rb_cEventLog);
         
     | 
| 
       23 
25 
     | 
    
         
             
              Init_winevt_subscribe(rb_cEventLog);
         
     | 
| 
       24 
26 
     | 
    
         
             
              Init_winevt_locale(rb_cEventLog);
         
     | 
| 
      
 27 
     | 
    
         
            +
              Init_winevt_session(rb_cEventLog);
         
     | 
| 
       25 
28 
     | 
    
         | 
| 
       26 
29 
     | 
    
         
             
              id_call = rb_intern("call");
         
     | 
| 
       27 
30 
     | 
    
         
             
            }
         
     | 
    
        data/ext/winevt/winevt_c.h
    CHANGED
    
    | 
         @@ -21,6 +21,7 @@ 
     | 
|
| 
       21 
21 
     | 
    
         
             
            #define EventQuery(object) ((struct WinevtQuery*)DATA_PTR(object))
         
     | 
| 
       22 
22 
     | 
    
         
             
            #define EventBookMark(object) ((struct WinevtBookmark*)DATA_PTR(object))
         
     | 
| 
       23 
23 
     | 
    
         
             
            #define EventChannel(object) ((struct WinevtChannel*)DATA_PTR(object))
         
     | 
| 
      
 24 
     | 
    
         
            +
            #define EventSession(object) ((struct WinevtSession*)DATA_PTR(object))
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
26 
     | 
    
         
             
            typedef struct {
         
     | 
| 
       26 
27 
     | 
    
         
             
              LANGID langID;
         
     | 
| 
         @@ -38,7 +39,10 @@ VALUE wstr_to_rb_str(UINT cp, const WCHAR* wstr, int clen); 
     | 
|
| 
       38 
39 
     | 
    
         
             
            #endif /* __cplusplus */
         
     | 
| 
       39 
40 
     | 
    
         
             
            void  raise_system_error(VALUE error, DWORD errorCode);
         
     | 
| 
       40 
41 
     | 
    
         
             
            VALUE render_to_rb_str(EVT_HANDLE handle, DWORD flags);
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 42 
     | 
    
         
            +
            EVT_HANDLE connect_to_remote(LPWSTR computerName, LPWSTR domain,
         
     | 
| 
      
 43 
     | 
    
         
            +
                                         LPWSTR username, LPWSTR password,
         
     | 
| 
      
 44 
     | 
    
         
            +
                                         EVT_RPC_LOGIN_FLAGS flags);
         
     | 
| 
      
 45 
     | 
    
         
            +
            WCHAR* get_description(EVT_HANDLE handle, LANGID langID, EVT_HANDLE hRemote);
         
     | 
| 
       42 
46 
     | 
    
         
             
            VALUE get_values(EVT_HANDLE handle);
         
     | 
| 
       43 
47 
     | 
    
         
             
            VALUE render_system_event(EVT_HANDLE handle, BOOL preserve_qualifiers);
         
     | 
| 
       44 
48 
     | 
    
         
             
            LocaleInfo* get_locale_info_from_rb_str(VALUE rb_locale_str);
         
     | 
| 
         @@ -53,7 +57,17 @@ extern VALUE rb_cChannel; 
     | 
|
| 
       53 
57 
     | 
    
         
             
            extern VALUE rb_cBookmark;
         
     | 
| 
       54 
58 
     | 
    
         
             
            extern VALUE rb_cSubscribe;
         
     | 
| 
       55 
59 
     | 
    
         
             
            extern VALUE rb_eWinevtQueryError;
         
     | 
| 
      
 60 
     | 
    
         
            +
            extern VALUE rb_eRemoteHandlerError;
         
     | 
| 
       56 
61 
     | 
    
         
             
            extern VALUE rb_cLocale;
         
     | 
| 
      
 62 
     | 
    
         
            +
            extern VALUE rb_cSession;
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            struct WinevtSession {
         
     | 
| 
      
 65 
     | 
    
         
            +
              LPWSTR server;
         
     | 
| 
      
 66 
     | 
    
         
            +
              LPWSTR domain;
         
     | 
| 
      
 67 
     | 
    
         
            +
              LPWSTR username;
         
     | 
| 
      
 68 
     | 
    
         
            +
              LPWSTR password;
         
     | 
| 
      
 69 
     | 
    
         
            +
              EVT_RPC_LOGIN_FLAGS flags;
         
     | 
| 
      
 70 
     | 
    
         
            +
            };
         
     | 
| 
       57 
71 
     | 
    
         | 
| 
       58 
72 
     | 
    
         
             
            extern LocaleInfo localeInfoTable[];
         
     | 
| 
       59 
73 
     | 
    
         
             
            extern LocaleInfo default_locale;
         
     | 
| 
         @@ -84,6 +98,7 @@ struct WinevtQuery 
     | 
|
| 
       84 
98 
     | 
    
         
             
              BOOL renderAsXML;
         
     | 
| 
       85 
99 
     | 
    
         
             
              BOOL preserveQualifiers;
         
     | 
| 
       86 
100 
     | 
    
         
             
              LocaleInfo *localeInfo;
         
     | 
| 
      
 101 
     | 
    
         
            +
              EVT_HANDLE remoteHandle;
         
     | 
| 
       87 
102 
     | 
    
         
             
            };
         
     | 
| 
       88 
103 
     | 
    
         | 
| 
       89 
104 
     | 
    
         
             
            #define SUBSCRIBE_ARRAY_SIZE 10
         
     | 
| 
         @@ -104,6 +119,7 @@ struct WinevtSubscribe 
     | 
|
| 
       104 
119 
     | 
    
         
             
              BOOL renderAsXML;
         
     | 
| 
       105 
120 
     | 
    
         
             
              BOOL preserveQualifiers;
         
     | 
| 
       106 
121 
     | 
    
         
             
              LocaleInfo* localeInfo;
         
     | 
| 
      
 122 
     | 
    
         
            +
              EVT_HANDLE remoteHandle;
         
     | 
| 
       107 
123 
     | 
    
         
             
            };
         
     | 
| 
       108 
124 
     | 
    
         | 
| 
       109 
125 
     | 
    
         
             
            void Init_winevt_query(VALUE rb_cEventLog);
         
     | 
| 
         @@ -111,5 +127,6 @@ void Init_winevt_channel(VALUE rb_cEventLog); 
     | 
|
| 
       111 
127 
     | 
    
         
             
            void Init_winevt_bookmark(VALUE rb_cEventLog);
         
     | 
| 
       112 
128 
     | 
    
         
             
            void Init_winevt_subscribe(VALUE rb_cEventLog);
         
     | 
| 
       113 
129 
     | 
    
         
             
            void Init_winevt_locale(VALUE rb_cEventLog);
         
     | 
| 
      
 130 
     | 
    
         
            +
            void Init_winevt_session(VALUE rb_cEventLog);
         
     | 
| 
       114 
131 
     | 
    
         | 
| 
       115 
132 
     | 
    
         
             
            #endif // _WINEVT_C_H
         
     | 
    
        data/ext/winevt/winevt_query.c
    CHANGED
    
    | 
         @@ -42,6 +42,10 @@ query_free(void* ptr) 
     | 
|
| 
       42 
42 
     | 
    
         
             
                if (winevtQuery->hEvents[i])
         
     | 
| 
       43 
43 
     | 
    
         
             
                  EvtClose(winevtQuery->hEvents[i]);
         
     | 
| 
       44 
44 
     | 
    
         
             
              }
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              if (winevtQuery->remoteHandle)
         
     | 
| 
      
 47 
     | 
    
         
            +
                EvtClose(winevtQuery->remoteHandle);
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
       45 
49 
     | 
    
         
             
              xfree(ptr);
         
     | 
| 
       46 
50 
     | 
    
         
             
            }
         
     | 
| 
       47 
51 
     | 
    
         | 
| 
         @@ -58,22 +62,44 @@ rb_winevt_query_alloc(VALUE klass) 
     | 
|
| 
       58 
62 
     | 
    
         
             
            /*
         
     | 
| 
       59 
63 
     | 
    
         
             
             * Initalize Query class.
         
     | 
| 
       60 
64 
     | 
    
         
             
             *
         
     | 
| 
       61 
     | 
    
         
            -
             * @ 
     | 
| 
       62 
     | 
    
         
            -
             * 
     | 
| 
      
 65 
     | 
    
         
            +
             * @overload initialize(channel, xpath, session=nil)
         
     | 
| 
      
 66 
     | 
    
         
            +
             *   @param channel [String] Querying EventLog channel.
         
     | 
| 
      
 67 
     | 
    
         
            +
             *   @param xpath [String] Querying XPath.
         
     | 
| 
      
 68 
     | 
    
         
            +
             *   @param session [Session] Session information for remoting access.
         
     | 
| 
       63 
69 
     | 
    
         
             
             * @return [Query]
         
     | 
| 
       64 
70 
     | 
    
         
             
             *
         
     | 
| 
       65 
71 
     | 
    
         
             
             */
         
     | 
| 
       66 
72 
     | 
    
         
             
            static VALUE
         
     | 
| 
       67 
     | 
    
         
            -
            rb_winevt_query_initialize(VALUE  
     | 
| 
      
 73 
     | 
    
         
            +
            rb_winevt_query_initialize(VALUE argc, VALUE *argv, VALUE self)
         
     | 
| 
       68 
74 
     | 
    
         
             
            {
         
     | 
| 
       69 
75 
     | 
    
         
             
              PWSTR evtChannel, evtXPath;
         
     | 
| 
      
 76 
     | 
    
         
            +
              VALUE channel, xpath, session;
         
     | 
| 
       70 
77 
     | 
    
         
             
              struct WinevtQuery* winevtQuery;
         
     | 
| 
      
 78 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 79 
     | 
    
         
            +
              EVT_HANDLE hRemoteHandle = NULL;
         
     | 
| 
       71 
80 
     | 
    
         
             
              DWORD len;
         
     | 
| 
       72 
81 
     | 
    
         
             
              VALUE wchannelBuf, wpathBuf;
         
     | 
| 
      
 82 
     | 
    
         
            +
              DWORD err;
         
     | 
| 
       73 
83 
     | 
    
         | 
| 
      
 84 
     | 
    
         
            +
              rb_scan_args(argc, argv, "21", &channel, &xpath, &session);
         
     | 
| 
       74 
85 
     | 
    
         
             
              Check_Type(channel, T_STRING);
         
     | 
| 
       75 
86 
     | 
    
         
             
              Check_Type(xpath, T_STRING);
         
     | 
| 
       76 
87 
     | 
    
         | 
| 
      
 88 
     | 
    
         
            +
              if (rb_obj_is_kind_of(session, rb_cSession)) {
         
     | 
| 
      
 89 
     | 
    
         
            +
                winevtSession = EventSession(session);
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                hRemoteHandle = connect_to_remote(winevtSession->server,
         
     | 
| 
      
 92 
     | 
    
         
            +
                                                  winevtSession->domain,
         
     | 
| 
      
 93 
     | 
    
         
            +
                                                  winevtSession->username,
         
     | 
| 
      
 94 
     | 
    
         
            +
                                                  winevtSession->password,
         
     | 
| 
      
 95 
     | 
    
         
            +
                                                  winevtSession->flags);
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                err = GetLastError();
         
     | 
| 
      
 98 
     | 
    
         
            +
                if (err != ERROR_SUCCESS) {
         
     | 
| 
      
 99 
     | 
    
         
            +
                  raise_system_error(rb_eRuntimeError, err);
         
     | 
| 
      
 100 
     | 
    
         
            +
                }
         
     | 
| 
      
 101 
     | 
    
         
            +
              }
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
       77 
103 
     | 
    
         
             
              // channel : To wide char
         
     | 
| 
       78 
104 
     | 
    
         
             
              len =
         
     | 
| 
       79 
105 
     | 
    
         
             
                MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(channel), RSTRING_LEN(channel), NULL, 0);
         
     | 
| 
         @@ -91,12 +117,17 @@ rb_winevt_query_initialize(VALUE self, VALUE channel, VALUE xpath) 
     | 
|
| 
       91 
117 
     | 
    
         
             
              TypedData_Get_Struct(self, struct WinevtQuery, &rb_winevt_query_type, winevtQuery);
         
     | 
| 
       92 
118 
     | 
    
         | 
| 
       93 
119 
     | 
    
         
             
              winevtQuery->query = EvtQuery(
         
     | 
| 
       94 
     | 
    
         
            -
                 
     | 
| 
      
 120 
     | 
    
         
            +
                hRemoteHandle, evtChannel, evtXPath, EvtQueryChannelPath | EvtQueryTolerateQueryErrors);
         
     | 
| 
      
 121 
     | 
    
         
            +
              err = GetLastError();
         
     | 
| 
      
 122 
     | 
    
         
            +
              if (err != ERROR_SUCCESS) {
         
     | 
| 
      
 123 
     | 
    
         
            +
                raise_system_error(rb_eRuntimeError, err);
         
     | 
| 
      
 124 
     | 
    
         
            +
              }
         
     | 
| 
       95 
125 
     | 
    
         
             
              winevtQuery->offset = 0L;
         
     | 
| 
       96 
126 
     | 
    
         
             
              winevtQuery->timeout = 0L;
         
     | 
| 
       97 
127 
     | 
    
         
             
              winevtQuery->renderAsXML = TRUE;
         
     | 
| 
       98 
128 
     | 
    
         
             
              winevtQuery->preserveQualifiers = FALSE;
         
     | 
| 
       99 
129 
     | 
    
         
             
              winevtQuery->localeInfo = &default_locale;
         
     | 
| 
      
 130 
     | 
    
         
            +
              winevtQuery->remoteHandle = hRemoteHandle;
         
     | 
| 
       100 
131 
     | 
    
         | 
| 
       101 
132 
     | 
    
         
             
              ALLOCV_END(wchannelBuf);
         
     | 
| 
       102 
133 
     | 
    
         
             
              ALLOCV_END(wpathBuf);
         
     | 
| 
         @@ -220,12 +251,12 @@ rb_winevt_query_render(VALUE self, EVT_HANDLE event) 
     | 
|
| 
       220 
251 
     | 
    
         
             
            }
         
     | 
| 
       221 
252 
     | 
    
         | 
| 
       222 
253 
     | 
    
         
             
            static VALUE
         
     | 
| 
       223 
     | 
    
         
            -
            rb_winevt_query_message(EVT_HANDLE event, LocaleInfo* localeInfo)
         
     | 
| 
      
 254 
     | 
    
         
            +
            rb_winevt_query_message(EVT_HANDLE event, LocaleInfo* localeInfo, EVT_HANDLE hRemote)
         
     | 
| 
       224 
255 
     | 
    
         
             
            {
         
     | 
| 
       225 
256 
     | 
    
         
             
              WCHAR* wResult;
         
     | 
| 
       226 
257 
     | 
    
         
             
              VALUE utf8str;
         
     | 
| 
       227 
258 
     | 
    
         | 
| 
       228 
     | 
    
         
            -
              wResult = get_description(event, localeInfo->langID);
         
     | 
| 
      
 259 
     | 
    
         
            +
              wResult = get_description(event, localeInfo->langID, hRemote);
         
     | 
| 
       229 
260 
     | 
    
         
             
              utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
         
     | 
| 
       230 
261 
     | 
    
         
             
              free(wResult);
         
     | 
| 
       231 
262 
     | 
    
         | 
| 
         @@ -337,7 +368,8 @@ rb_winevt_query_each_yield(VALUE self) 
     | 
|
| 
       337 
368 
     | 
    
         
             
              for (int i = 0; i < winevtQuery->count; i++) {
         
     | 
| 
       338 
369 
     | 
    
         
             
                rb_yield_values(3,
         
     | 
| 
       339 
370 
     | 
    
         
             
                                rb_winevt_query_render(self, winevtQuery->hEvents[i]),
         
     | 
| 
       340 
     | 
    
         
            -
                                rb_winevt_query_message(winevtQuery->hEvents[i], winevtQuery->localeInfo 
     | 
| 
      
 371 
     | 
    
         
            +
                                rb_winevt_query_message(winevtQuery->hEvents[i], winevtQuery->localeInfo,
         
     | 
| 
      
 372 
     | 
    
         
            +
                                                        winevtQuery->remoteHandle),
         
     | 
| 
       341 
373 
     | 
    
         
             
                                rb_winevt_query_string_inserts(winevtQuery->hEvents[i]));
         
     | 
| 
       342 
374 
     | 
    
         
             
              }
         
     | 
| 
       343 
375 
     | 
    
         
             
              return Qnil;
         
     | 
| 
         @@ -401,7 +433,7 @@ rb_winevt_query_set_render_as_xml(VALUE self, VALUE rb_render_as_xml) 
     | 
|
| 
       401 
433 
     | 
    
         
             
             * This method specifies whether preserving qualifiers key or not.
         
     | 
| 
       402 
434 
     | 
    
         
             
             *
         
     | 
| 
       403 
435 
     | 
    
         
             
             * @since 0.7.3
         
     | 
| 
       404 
     | 
    
         
            -
             * @param  
     | 
| 
      
 436 
     | 
    
         
            +
             * @param rb_preserve_qualifiers [Boolean]
         
     | 
| 
       405 
437 
     | 
    
         
             
             */
         
     | 
| 
       406 
438 
     | 
    
         
             
            static VALUE
         
     | 
| 
       407 
439 
     | 
    
         
             
            rb_winevt_query_set_preserve_qualifiers(VALUE self, VALUE rb_preserve_qualifiers)
         
     | 
| 
         @@ -522,7 +554,7 @@ Init_winevt_query(VALUE rb_cEventLog) 
     | 
|
| 
       522 
554 
     | 
    
         
             
              rb_define_const(rb_cFlag, "Strict", LONG2NUM(EvtSeekStrict));
         
     | 
| 
       523 
555 
     | 
    
         
             
              /* clang-format on */
         
     | 
| 
       524 
556 
     | 
    
         | 
| 
       525 
     | 
    
         
            -
              rb_define_method(rb_cQuery, "initialize", rb_winevt_query_initialize,  
     | 
| 
      
 557 
     | 
    
         
            +
              rb_define_method(rb_cQuery, "initialize", rb_winevt_query_initialize, -1);
         
     | 
| 
       526 
558 
     | 
    
         
             
              rb_define_method(rb_cQuery, "next", rb_winevt_query_next, 0);
         
     | 
| 
       527 
559 
     | 
    
         
             
              rb_define_method(rb_cQuery, "seek", rb_winevt_query_seek, 1);
         
     | 
| 
       528 
560 
     | 
    
         
             
              rb_define_method(rb_cQuery, "offset", rb_winevt_query_get_offset, 0);
         
     | 
| 
         @@ -0,0 +1,425 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <winevt_c.h>
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            /* clang-format off */
         
     | 
| 
      
 4 
     | 
    
         
            +
            /*
         
     | 
| 
      
 5 
     | 
    
         
            +
             * Document-class: Winevt::EventLog::Session
         
     | 
| 
      
 6 
     | 
    
         
            +
             *
         
     | 
| 
      
 7 
     | 
    
         
            +
             * Manage Session information for Windows EventLog.
         
     | 
| 
      
 8 
     | 
    
         
            +
             *
         
     | 
| 
      
 9 
     | 
    
         
            +
             * @example
         
     | 
| 
      
 10 
     | 
    
         
            +
             *  require 'winevt'
         
     | 
| 
      
 11 
     | 
    
         
            +
             *
         
     | 
| 
      
 12 
     | 
    
         
            +
             *  @session = Winevt::EventLog::Session.new("127.0.0.1")
         
     | 
| 
      
 13 
     | 
    
         
            +
             *
         
     | 
| 
      
 14 
     | 
    
         
            +
             *  @session.domain = "<EXAMPLEGROUP>"
         
     | 
| 
      
 15 
     | 
    
         
            +
             *  @session.username = "<username>"
         
     | 
| 
      
 16 
     | 
    
         
            +
             *  @session.password = "<password>"
         
     | 
| 
      
 17 
     | 
    
         
            +
             *  # Then pass @session veriable into Winevt::EventLog::Query or
         
     | 
| 
      
 18 
     | 
    
         
            +
             *  # Winevt::EventLog::Subscribe#subscribe
         
     | 
| 
      
 19 
     | 
    
         
            +
             *  @query = Winevt::EventLog::Query.new(
         
     | 
| 
      
 20 
     | 
    
         
            +
             *    "Application",
         
     | 
| 
      
 21 
     | 
    
         
            +
             *    "*[System[(Level <= 3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
         
     | 
| 
      
 22 
     | 
    
         
            +
             *    @session
         
     | 
| 
      
 23 
     | 
    
         
            +
             *  )
         
     | 
| 
      
 24 
     | 
    
         
            +
             *  # some stuff.
         
     | 
| 
      
 25 
     | 
    
         
            +
             *
         
     | 
| 
      
 26 
     | 
    
         
            +
             *  @subscribe = Winevt::EventLog::Subscribe.new
         
     | 
| 
      
 27 
     | 
    
         
            +
             *  @subscribe.subscribe(
         
     | 
| 
      
 28 
     | 
    
         
            +
             *    "Application",
         
     | 
| 
      
 29 
     | 
    
         
            +
             *    "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
         
     | 
| 
      
 30 
     | 
    
         
            +
             *    @session
         
     | 
| 
      
 31 
     | 
    
         
            +
             *  )
         
     | 
| 
      
 32 
     | 
    
         
            +
             *  # And some stuff.
         
     | 
| 
      
 33 
     | 
    
         
            +
             * @since v0.9.0
         
     | 
| 
      
 34 
     | 
    
         
            +
             */
         
     | 
| 
      
 35 
     | 
    
         
            +
            /* clang-format on */
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            VALUE rb_cSession;
         
     | 
| 
      
 38 
     | 
    
         
            +
            VALUE rb_cRpcLoginFlag;
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            static void session_free(void* ptr);
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            static const rb_data_type_t rb_winevt_session_type = { "winevt/session",
         
     | 
| 
      
 43 
     | 
    
         
            +
                                                                   {
         
     | 
| 
      
 44 
     | 
    
         
            +
                                                                     0,
         
     | 
| 
      
 45 
     | 
    
         
            +
                                                                     session_free,
         
     | 
| 
      
 46 
     | 
    
         
            +
                                                                     0,
         
     | 
| 
      
 47 
     | 
    
         
            +
                                                                   },
         
     | 
| 
      
 48 
     | 
    
         
            +
                                                                   NULL,
         
     | 
| 
      
 49 
     | 
    
         
            +
                                                                   NULL,
         
     | 
| 
      
 50 
     | 
    
         
            +
                                                                   RUBY_TYPED_FREE_IMMEDIATELY };
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            static void
         
     | 
| 
      
 53 
     | 
    
         
            +
            session_free(void* ptr)
         
     | 
| 
      
 54 
     | 
    
         
            +
            {
         
     | 
| 
      
 55 
     | 
    
         
            +
              struct WinevtSession* winevtSession = (struct WinevtSession*)ptr;
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
              if (winevtSession->server)
         
     | 
| 
      
 58 
     | 
    
         
            +
                free(winevtSession->server);
         
     | 
| 
      
 59 
     | 
    
         
            +
              if (winevtSession->domain)
         
     | 
| 
      
 60 
     | 
    
         
            +
                free(winevtSession->domain);
         
     | 
| 
      
 61 
     | 
    
         
            +
              if (winevtSession->username)
         
     | 
| 
      
 62 
     | 
    
         
            +
                free(winevtSession->username);
         
     | 
| 
      
 63 
     | 
    
         
            +
              if (winevtSession->password)
         
     | 
| 
      
 64 
     | 
    
         
            +
                free(winevtSession->password);
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              xfree(ptr);
         
     | 
| 
      
 67 
     | 
    
         
            +
            }
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 70 
     | 
    
         
            +
            rb_winevt_session_alloc(VALUE klass)
         
     | 
| 
      
 71 
     | 
    
         
            +
            {
         
     | 
| 
      
 72 
     | 
    
         
            +
              VALUE obj;
         
     | 
| 
      
 73 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 74 
     | 
    
         
            +
              obj = TypedData_Make_Struct(
         
     | 
| 
      
 75 
     | 
    
         
            +
                klass, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 76 
     | 
    
         
            +
              return obj;
         
     | 
| 
      
 77 
     | 
    
         
            +
            }
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            /*
         
     | 
| 
      
 80 
     | 
    
         
            +
             * Initalize Session class.
         
     | 
| 
      
 81 
     | 
    
         
            +
             *
         
     | 
| 
      
 82 
     | 
    
         
            +
             * @overload initialize(server, domain=nil, username=nil, password=nil, flags=Winevt::EventLog::Session::RpcLoginFlag::AuthDefault)
         
     | 
| 
      
 83 
     | 
    
         
            +
             *   @param server [String] Server ip address or fqdn.
         
     | 
| 
      
 84 
     | 
    
         
            +
             *   @param domain [String] Domain name.
         
     | 
| 
      
 85 
     | 
    
         
            +
             *   @param username [String] username on remote server.
         
     | 
| 
      
 86 
     | 
    
         
            +
             *   @param password [String] Remote server user password.
         
     | 
| 
      
 87 
     | 
    
         
            +
             *   @param flags [Integer] Flags for authentication method choices.
         
     | 
| 
      
 88 
     | 
    
         
            +
             * @return [Session]
         
     | 
| 
      
 89 
     | 
    
         
            +
             *
         
     | 
| 
      
 90 
     | 
    
         
            +
             */
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 93 
     | 
    
         
            +
            rb_winevt_session_initialize(VALUE self)
         
     | 
| 
      
 94 
     | 
    
         
            +
            {
         
     | 
| 
      
 95 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              TypedData_Get_Struct(
         
     | 
| 
      
 98 
     | 
    
         
            +
                  self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
              winevtSession->server = NULL;
         
     | 
| 
      
 101 
     | 
    
         
            +
              winevtSession->domain = NULL;
         
     | 
| 
      
 102 
     | 
    
         
            +
              winevtSession->username = NULL;
         
     | 
| 
      
 103 
     | 
    
         
            +
              winevtSession->password = NULL;
         
     | 
| 
      
 104 
     | 
    
         
            +
              winevtSession->flags = EvtRpcLoginAuthDefault;
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 107 
     | 
    
         
            +
            }
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            /*
         
     | 
| 
      
 110 
     | 
    
         
            +
             * This method returns server for remoting access.
         
     | 
| 
      
 111 
     | 
    
         
            +
             *
         
     | 
| 
      
 112 
     | 
    
         
            +
             * @return [String]
         
     | 
| 
      
 113 
     | 
    
         
            +
             */
         
     | 
| 
      
 114 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 115 
     | 
    
         
            +
            rb_winevt_session_get_server(VALUE self)
         
     | 
| 
      
 116 
     | 
    
         
            +
            {
         
     | 
| 
      
 117 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
              if (winevtSession->server) {
         
     | 
| 
      
 122 
     | 
    
         
            +
                return wstr_to_rb_str(CP_UTF8, winevtSession->server, -1);
         
     | 
| 
      
 123 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 124 
     | 
    
         
            +
                return rb_str_new2("(NULL)");
         
     | 
| 
      
 125 
     | 
    
         
            +
              }
         
     | 
| 
      
 126 
     | 
    
         
            +
            }
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
            /*
         
     | 
| 
      
 129 
     | 
    
         
            +
             * This method specifies server for remoting access.
         
     | 
| 
      
 130 
     | 
    
         
            +
             *
         
     | 
| 
      
 131 
     | 
    
         
            +
             * @param rb_server [String] server
         
     | 
| 
      
 132 
     | 
    
         
            +
             */
         
     | 
| 
      
 133 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 134 
     | 
    
         
            +
            rb_winevt_session_set_server(VALUE self, VALUE rb_server)
         
     | 
| 
      
 135 
     | 
    
         
            +
            {
         
     | 
| 
      
 136 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 137 
     | 
    
         
            +
              DWORD len;
         
     | 
| 
      
 138 
     | 
    
         
            +
              VALUE vserverBuf;
         
     | 
| 
      
 139 
     | 
    
         
            +
              PWSTR wServer;
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
              Check_Type(rb_server, T_STRING);
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
              len =
         
     | 
| 
      
 146 
     | 
    
         
            +
                MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 147 
     | 
    
         
            +
                                    RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
         
     | 
| 
      
 148 
     | 
    
         
            +
                                    NULL, 0);
         
     | 
| 
      
 149 
     | 
    
         
            +
              wServer = ALLOCV_N(WCHAR, vserverBuf, len + 1);
         
     | 
| 
      
 150 
     | 
    
         
            +
              MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 151 
     | 
    
         
            +
                                  RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
         
     | 
| 
      
 152 
     | 
    
         
            +
                                  wServer, len);
         
     | 
| 
      
 153 
     | 
    
         
            +
              winevtSession->server = _wcsdup(wServer);
         
     | 
| 
      
 154 
     | 
    
         
            +
              wServer[len] = L'\0';
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
              ALLOCV_END(vserverBuf);
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 159 
     | 
    
         
            +
            }
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
            /*
         
     | 
| 
      
 162 
     | 
    
         
            +
             * This method returns domain for remoting access.
         
     | 
| 
      
 163 
     | 
    
         
            +
             *
         
     | 
| 
      
 164 
     | 
    
         
            +
             * @return [String]
         
     | 
| 
      
 165 
     | 
    
         
            +
             */
         
     | 
| 
      
 166 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 167 
     | 
    
         
            +
            rb_winevt_session_get_domain(VALUE self)
         
     | 
| 
      
 168 
     | 
    
         
            +
            {
         
     | 
| 
      
 169 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
              if (winevtSession->domain) {
         
     | 
| 
      
 174 
     | 
    
         
            +
                return wstr_to_rb_str(CP_UTF8, winevtSession->domain, -1);
         
     | 
| 
      
 175 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 176 
     | 
    
         
            +
                return rb_str_new2("(NULL)");
         
     | 
| 
      
 177 
     | 
    
         
            +
              }
         
     | 
| 
      
 178 
     | 
    
         
            +
            }
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
            /*
         
     | 
| 
      
 181 
     | 
    
         
            +
             * This method specifies domain for remoting access.
         
     | 
| 
      
 182 
     | 
    
         
            +
             *
         
     | 
| 
      
 183 
     | 
    
         
            +
             * @param rb_domain [String] domain
         
     | 
| 
      
 184 
     | 
    
         
            +
             */
         
     | 
| 
      
 185 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 186 
     | 
    
         
            +
            rb_winevt_session_set_domain(VALUE self, VALUE rb_domain)
         
     | 
| 
      
 187 
     | 
    
         
            +
            {
         
     | 
| 
      
 188 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 189 
     | 
    
         
            +
              DWORD len;
         
     | 
| 
      
 190 
     | 
    
         
            +
              VALUE vdomainBuf;
         
     | 
| 
      
 191 
     | 
    
         
            +
              PWSTR wDomain;
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
              Check_Type(rb_domain, T_STRING);
         
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
              len =
         
     | 
| 
      
 198 
     | 
    
         
            +
                MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 199 
     | 
    
         
            +
                                    RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
         
     | 
| 
      
 200 
     | 
    
         
            +
                                    NULL, 0);
         
     | 
| 
      
 201 
     | 
    
         
            +
              wDomain = ALLOCV_N(WCHAR, vdomainBuf, len + 1);
         
     | 
| 
      
 202 
     | 
    
         
            +
              MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 203 
     | 
    
         
            +
                                  RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
         
     | 
| 
      
 204 
     | 
    
         
            +
                                  wDomain, len);
         
     | 
| 
      
 205 
     | 
    
         
            +
              wDomain[len] = L'\0';
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
              winevtSession->domain = _wcsdup(wDomain);
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
              ALLOCV_END(vdomainBuf);
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 212 
     | 
    
         
            +
            }
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
            /*
         
     | 
| 
      
 215 
     | 
    
         
            +
             * This method returns username for remoting access.
         
     | 
| 
      
 216 
     | 
    
         
            +
             *
         
     | 
| 
      
 217 
     | 
    
         
            +
             * @return [String]
         
     | 
| 
      
 218 
     | 
    
         
            +
             */
         
     | 
| 
      
 219 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 220 
     | 
    
         
            +
            rb_winevt_session_get_username(VALUE self)
         
     | 
| 
      
 221 
     | 
    
         
            +
            {
         
     | 
| 
      
 222 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
      
 226 
     | 
    
         
            +
              if (winevtSession->username) {
         
     | 
| 
      
 227 
     | 
    
         
            +
                return wstr_to_rb_str(CP_UTF8, winevtSession->username, -1);
         
     | 
| 
      
 228 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 229 
     | 
    
         
            +
                return rb_str_new2("(NULL)");
         
     | 
| 
      
 230 
     | 
    
         
            +
              }
         
     | 
| 
      
 231 
     | 
    
         
            +
            }
         
     | 
| 
      
 232 
     | 
    
         
            +
             
     | 
| 
      
 233 
     | 
    
         
            +
            /*
         
     | 
| 
      
 234 
     | 
    
         
            +
             * This method specifies username for remoting access.
         
     | 
| 
      
 235 
     | 
    
         
            +
             *
         
     | 
| 
      
 236 
     | 
    
         
            +
             * @param rb_username [String] username
         
     | 
| 
      
 237 
     | 
    
         
            +
             */
         
     | 
| 
      
 238 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 239 
     | 
    
         
            +
            rb_winevt_session_set_username(VALUE self, VALUE rb_username)
         
     | 
| 
      
 240 
     | 
    
         
            +
            {
         
     | 
| 
      
 241 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 242 
     | 
    
         
            +
              DWORD len;
         
     | 
| 
      
 243 
     | 
    
         
            +
              VALUE vusernameBuf;
         
     | 
| 
      
 244 
     | 
    
         
            +
              PWSTR wUsername;
         
     | 
| 
      
 245 
     | 
    
         
            +
             
     | 
| 
      
 246 
     | 
    
         
            +
              Check_Type(rb_username, T_STRING);
         
     | 
| 
      
 247 
     | 
    
         
            +
             
     | 
| 
      
 248 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 249 
     | 
    
         
            +
             
     | 
| 
      
 250 
     | 
    
         
            +
              len =
         
     | 
| 
      
 251 
     | 
    
         
            +
                MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 252 
     | 
    
         
            +
                                    RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
         
     | 
| 
      
 253 
     | 
    
         
            +
                                    NULL, 0);
         
     | 
| 
      
 254 
     | 
    
         
            +
              wUsername = ALLOCV_N(WCHAR, vusernameBuf, len + 1);
         
     | 
| 
      
 255 
     | 
    
         
            +
              MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 256 
     | 
    
         
            +
                                  RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
         
     | 
| 
      
 257 
     | 
    
         
            +
                                  wUsername, len);
         
     | 
| 
      
 258 
     | 
    
         
            +
              wUsername[len] = L'\0';
         
     | 
| 
      
 259 
     | 
    
         
            +
             
     | 
| 
      
 260 
     | 
    
         
            +
              winevtSession->username = _wcsdup(wUsername);
         
     | 
| 
      
 261 
     | 
    
         
            +
             
     | 
| 
      
 262 
     | 
    
         
            +
              ALLOCV_END(vusernameBuf);
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
      
 264 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 265 
     | 
    
         
            +
            }
         
     | 
| 
      
 266 
     | 
    
         
            +
             
     | 
| 
      
 267 
     | 
    
         
            +
            /*
         
     | 
| 
      
 268 
     | 
    
         
            +
             * This method returns password for remoting access.
         
     | 
| 
      
 269 
     | 
    
         
            +
             *
         
     | 
| 
      
 270 
     | 
    
         
            +
             * @return [String]
         
     | 
| 
      
 271 
     | 
    
         
            +
             */
         
     | 
| 
      
 272 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 273 
     | 
    
         
            +
            rb_winevt_session_get_password(VALUE self)
         
     | 
| 
      
 274 
     | 
    
         
            +
            {
         
     | 
| 
      
 275 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 276 
     | 
    
         
            +
             
     | 
| 
      
 277 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 278 
     | 
    
         
            +
             
     | 
| 
      
 279 
     | 
    
         
            +
              if (winevtSession->password) {
         
     | 
| 
      
 280 
     | 
    
         
            +
                return wstr_to_rb_str(CP_UTF8, winevtSession->password, -1);
         
     | 
| 
      
 281 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 282 
     | 
    
         
            +
                return rb_str_new2("(NULL)");
         
     | 
| 
      
 283 
     | 
    
         
            +
              }
         
     | 
| 
      
 284 
     | 
    
         
            +
            }
         
     | 
| 
      
 285 
     | 
    
         
            +
             
     | 
| 
      
 286 
     | 
    
         
            +
            /*
         
     | 
| 
      
 287 
     | 
    
         
            +
             * This method specifies password for remoting access.
         
     | 
| 
      
 288 
     | 
    
         
            +
             *
         
     | 
| 
      
 289 
     | 
    
         
            +
             * @param rb_password [String] password
         
     | 
| 
      
 290 
     | 
    
         
            +
             */
         
     | 
| 
      
 291 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 292 
     | 
    
         
            +
            rb_winevt_session_set_password(VALUE self, VALUE rb_password)
         
     | 
| 
      
 293 
     | 
    
         
            +
            {
         
     | 
| 
      
 294 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 295 
     | 
    
         
            +
              DWORD len;
         
     | 
| 
      
 296 
     | 
    
         
            +
              VALUE vpasswordBuf;
         
     | 
| 
      
 297 
     | 
    
         
            +
              PWSTR wPassword;
         
     | 
| 
      
 298 
     | 
    
         
            +
             
     | 
| 
      
 299 
     | 
    
         
            +
              Check_Type(rb_password, T_STRING);
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
      
 301 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 302 
     | 
    
         
            +
             
     | 
| 
      
 303 
     | 
    
         
            +
              len =
         
     | 
| 
      
 304 
     | 
    
         
            +
                MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 305 
     | 
    
         
            +
                                    RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
         
     | 
| 
      
 306 
     | 
    
         
            +
                                    NULL, 0);
         
     | 
| 
      
 307 
     | 
    
         
            +
              wPassword = ALLOCV_N(WCHAR, vpasswordBuf, len + 1);
         
     | 
| 
      
 308 
     | 
    
         
            +
              MultiByteToWideChar(CP_UTF8, 0,
         
     | 
| 
      
 309 
     | 
    
         
            +
                                  RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
         
     | 
| 
      
 310 
     | 
    
         
            +
                                  wPassword, len);
         
     | 
| 
      
 311 
     | 
    
         
            +
              wPassword[len] = L'\0';
         
     | 
| 
      
 312 
     | 
    
         
            +
             
     | 
| 
      
 313 
     | 
    
         
            +
              winevtSession->password = _wcsdup(wPassword);
         
     | 
| 
      
 314 
     | 
    
         
            +
             
     | 
| 
      
 315 
     | 
    
         
            +
              ALLOCV_END(vpasswordBuf);
         
     | 
| 
      
 316 
     | 
    
         
            +
             
     | 
| 
      
 317 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 318 
     | 
    
         
            +
            }
         
     | 
| 
      
 319 
     | 
    
         
            +
             
     | 
| 
      
 320 
     | 
    
         
            +
            /*
         
     | 
| 
      
 321 
     | 
    
         
            +
             * This method returns flags for remoting access.
         
     | 
| 
      
 322 
     | 
    
         
            +
             *
         
     | 
| 
      
 323 
     | 
    
         
            +
             * @return [Integer]
         
     | 
| 
      
 324 
     | 
    
         
            +
             */
         
     | 
| 
      
 325 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 326 
     | 
    
         
            +
            rb_winevt_session_get_flags(VALUE self)
         
     | 
| 
      
 327 
     | 
    
         
            +
            {
         
     | 
| 
      
 328 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 329 
     | 
    
         
            +
             
     | 
| 
      
 330 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 331 
     | 
    
         
            +
             
     | 
| 
      
 332 
     | 
    
         
            +
              return LONG2NUM(winevtSession->flags);
         
     | 
| 
      
 333 
     | 
    
         
            +
            }
         
     | 
| 
      
 334 
     | 
    
         
            +
             
     | 
| 
      
 335 
     | 
    
         
            +
            static DWORD
         
     | 
| 
      
 336 
     | 
    
         
            +
            get_session_rpc_login_flag_from_cstr(char* flag_str)
         
     | 
| 
      
 337 
     | 
    
         
            +
            {
         
     | 
| 
      
 338 
     | 
    
         
            +
              if (strcmp(flag_str, "default") == 0)
         
     | 
| 
      
 339 
     | 
    
         
            +
                return EvtRpcLoginAuthDefault;
         
     | 
| 
      
 340 
     | 
    
         
            +
              else if (strcmp(flag_str, "negociate") == 0)
         
     | 
| 
      
 341 
     | 
    
         
            +
                return EvtRpcLoginAuthNegotiate;
         
     | 
| 
      
 342 
     | 
    
         
            +
              else if (strcmp(flag_str, "kerberos") == 0)
         
     | 
| 
      
 343 
     | 
    
         
            +
                return EvtRpcLoginAuthKerberos;
         
     | 
| 
      
 344 
     | 
    
         
            +
              else if (strcmp(flag_str, "ntlm") == 0)
         
     | 
| 
      
 345 
     | 
    
         
            +
                return EvtRpcLoginAuthNTLM;
         
     | 
| 
      
 346 
     | 
    
         
            +
              else
         
     | 
| 
      
 347 
     | 
    
         
            +
                rb_raise(rb_eArgError, "Unknown rpc login flag: %s", flag_str);
         
     | 
| 
      
 348 
     | 
    
         
            +
             
     | 
| 
      
 349 
     | 
    
         
            +
              return 0;
         
     | 
| 
      
 350 
     | 
    
         
            +
            }
         
     | 
| 
      
 351 
     | 
    
         
            +
             
     | 
| 
      
 352 
     | 
    
         
            +
             
     | 
| 
      
 353 
     | 
    
         
            +
            /*
         
     | 
| 
      
 354 
     | 
    
         
            +
             * This method specifies flags for remoting access.
         
     | 
| 
      
 355 
     | 
    
         
            +
             *
         
     | 
| 
      
 356 
     | 
    
         
            +
             * @param rb_flags [Integer] flags
         
     | 
| 
      
 357 
     | 
    
         
            +
             */
         
     | 
| 
      
 358 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 359 
     | 
    
         
            +
            rb_winevt_session_set_flags(VALUE self, VALUE rb_flags)
         
     | 
| 
      
 360 
     | 
    
         
            +
            {
         
     | 
| 
      
 361 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
      
 362 
     | 
    
         
            +
              EVT_RPC_LOGIN_FLAGS flags = EvtRpcLoginAuthDefault;
         
     | 
| 
      
 363 
     | 
    
         
            +
             
     | 
| 
      
 364 
     | 
    
         
            +
              TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
         
     | 
| 
      
 365 
     | 
    
         
            +
             
     | 
| 
      
 366 
     | 
    
         
            +
              switch(TYPE(rb_flags)) {
         
     | 
| 
      
 367 
     | 
    
         
            +
                case T_SYMBOL:
         
     | 
| 
      
 368 
     | 
    
         
            +
                  flags = get_session_rpc_login_flag_from_cstr(RSTRING_PTR(rb_sym2str(rb_flags)));
         
     | 
| 
      
 369 
     | 
    
         
            +
                  break;
         
     | 
| 
      
 370 
     | 
    
         
            +
                case T_STRING:
         
     | 
| 
      
 371 
     | 
    
         
            +
                  flags = get_session_rpc_login_flag_from_cstr(StringValuePtr(rb_flags));
         
     | 
| 
      
 372 
     | 
    
         
            +
                  break;
         
     | 
| 
      
 373 
     | 
    
         
            +
                case T_FIXNUM:
         
     | 
| 
      
 374 
     | 
    
         
            +
                  flags = NUM2LONG(rb_flags);
         
     | 
| 
      
 375 
     | 
    
         
            +
                  break;
         
     | 
| 
      
 376 
     | 
    
         
            +
                default:
         
     | 
| 
      
 377 
     | 
    
         
            +
                  rb_raise(rb_eArgError, "Expected Symbol, String or Fixnum in flags");
         
     | 
| 
      
 378 
     | 
    
         
            +
              }
         
     | 
| 
      
 379 
     | 
    
         
            +
              winevtSession->flags = flags;
         
     | 
| 
      
 380 
     | 
    
         
            +
             
     | 
| 
      
 381 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 382 
     | 
    
         
            +
            }
         
     | 
| 
      
 383 
     | 
    
         
            +
             
     | 
| 
      
 384 
     | 
    
         
            +
            void
         
     | 
| 
      
 385 
     | 
    
         
            +
            Init_winevt_session(VALUE rb_cEventLog)
         
     | 
| 
      
 386 
     | 
    
         
            +
            {
         
     | 
| 
      
 387 
     | 
    
         
            +
              rb_cSession = rb_define_class_under(rb_cEventLog, "Session", rb_cObject);
         
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
      
 389 
     | 
    
         
            +
              rb_define_alloc_func(rb_cSession, rb_winevt_session_alloc);
         
     | 
| 
      
 390 
     | 
    
         
            +
             
     | 
| 
      
 391 
     | 
    
         
            +
              rb_cRpcLoginFlag = rb_define_module_under(rb_cSession, "RpcLoginFlag");
         
     | 
| 
      
 392 
     | 
    
         
            +
             
     | 
| 
      
 393 
     | 
    
         
            +
              rb_define_method(rb_cSession, "initialize", rb_winevt_session_initialize, 0);
         
     | 
| 
      
 394 
     | 
    
         
            +
              rb_define_method(rb_cSession, "server", rb_winevt_session_get_server, 0);
         
     | 
| 
      
 395 
     | 
    
         
            +
              rb_define_method(rb_cSession, "server=", rb_winevt_session_set_server, 1);
         
     | 
| 
      
 396 
     | 
    
         
            +
              rb_define_method(rb_cSession, "domain", rb_winevt_session_get_domain, 0);
         
     | 
| 
      
 397 
     | 
    
         
            +
              rb_define_method(rb_cSession, "domain=", rb_winevt_session_set_domain, 1);
         
     | 
| 
      
 398 
     | 
    
         
            +
              rb_define_method(rb_cSession, "username", rb_winevt_session_get_username, 0);
         
     | 
| 
      
 399 
     | 
    
         
            +
              rb_define_method(rb_cSession, "username=", rb_winevt_session_set_username, 1);
         
     | 
| 
      
 400 
     | 
    
         
            +
              rb_define_method(rb_cSession, "password", rb_winevt_session_get_password, 0);
         
     | 
| 
      
 401 
     | 
    
         
            +
              rb_define_method(rb_cSession, "password=", rb_winevt_session_set_password, 1);
         
     | 
| 
      
 402 
     | 
    
         
            +
              rb_define_method(rb_cSession, "flags", rb_winevt_session_get_flags, 0);
         
     | 
| 
      
 403 
     | 
    
         
            +
              rb_define_method(rb_cSession, "flags=", rb_winevt_session_set_flags, 1);
         
     | 
| 
      
 404 
     | 
    
         
            +
             
     | 
| 
      
 405 
     | 
    
         
            +
              /*
         
     | 
| 
      
 406 
     | 
    
         
            +
               * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthDefault
         
     | 
| 
      
 407 
     | 
    
         
            +
               * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
         
     | 
| 
      
 408 
     | 
    
         
            +
               */
         
     | 
| 
      
 409 
     | 
    
         
            +
              rb_define_const(rb_cRpcLoginFlag, "AuthDefault", LONG2NUM(EvtRpcLoginAuthDefault));
         
     | 
| 
      
 410 
     | 
    
         
            +
              /*
         
     | 
| 
      
 411 
     | 
    
         
            +
               * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNegociate
         
     | 
| 
      
 412 
     | 
    
         
            +
               * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
         
     | 
| 
      
 413 
     | 
    
         
            +
               */
         
     | 
| 
      
 414 
     | 
    
         
            +
              rb_define_const(rb_cRpcLoginFlag, "AuthNegociate", LONG2NUM(EvtRpcLoginAuthNegotiate));
         
     | 
| 
      
 415 
     | 
    
         
            +
              /*
         
     | 
| 
      
 416 
     | 
    
         
            +
               * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthKerberos
         
     | 
| 
      
 417 
     | 
    
         
            +
               * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
         
     | 
| 
      
 418 
     | 
    
         
            +
               */
         
     | 
| 
      
 419 
     | 
    
         
            +
              rb_define_const(rb_cRpcLoginFlag, "AuthKerberos", LONG2NUM(EvtRpcLoginAuthKerberos));
         
     | 
| 
      
 420 
     | 
    
         
            +
              /*
         
     | 
| 
      
 421 
     | 
    
         
            +
               * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNTLM
         
     | 
| 
      
 422 
     | 
    
         
            +
               * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
         
     | 
| 
      
 423 
     | 
    
         
            +
               */
         
     | 
| 
      
 424 
     | 
    
         
            +
              rb_define_const(rb_cRpcLoginFlag, "AuthNTLM", LONG2NUM(EvtRpcLoginAuthNTLM));
         
     | 
| 
      
 425 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -57,6 +57,9 @@ subscribe_free(void* ptr) 
     | 
|
| 
       57 
57 
     | 
    
         
             
                }
         
     | 
| 
       58 
58 
     | 
    
         
             
              }
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
              if (winevtSubscribe->remoteHandle)
         
     | 
| 
      
 61 
     | 
    
         
            +
                EvtClose(winevtSubscribe->remoteHandle);
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       60 
63 
     | 
    
         
             
              xfree(ptr);
         
     | 
| 
       61 
64 
     | 
    
         
             
            }
         
     | 
| 
       62 
65 
     | 
    
         | 
| 
         @@ -132,23 +135,27 @@ rb_winevt_subscribe_read_existing_events_p(VALUE self) 
     | 
|
| 
       132 
135 
     | 
    
         
             
            /*
         
     | 
| 
       133 
136 
     | 
    
         
             
             * Subscribe into a Windows EventLog channel.
         
     | 
| 
       134 
137 
     | 
    
         
             
             *
         
     | 
| 
       135 
     | 
    
         
            -
             * @overload subscribe(path, query,  
     | 
| 
      
 138 
     | 
    
         
            +
             * @overload subscribe(path, query, bookmark=nil, session=nil)
         
     | 
| 
       136 
139 
     | 
    
         
             
             *   @param path [String] Subscribe Channel
         
     | 
| 
       137 
140 
     | 
    
         
             
             *   @param query [String] Query string for channel
         
     | 
| 
       138 
     | 
    
         
            -
             *   @ 
     | 
| 
      
 141 
     | 
    
         
            +
             *   @param bookmark [Bookmark] bookmark Bookmark class instance.
         
     | 
| 
      
 142 
     | 
    
         
            +
             *   @param session [Session] Session information for remoting access.
         
     | 
| 
       139 
143 
     | 
    
         
             
             * @return [Boolean]
         
     | 
| 
       140 
144 
     | 
    
         
             
             *
         
     | 
| 
       141 
145 
     | 
    
         
             
             */
         
     | 
| 
       142 
146 
     | 
    
         
             
            static VALUE
         
     | 
| 
       143 
147 
     | 
    
         
             
            rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self)
         
     | 
| 
       144 
148 
     | 
    
         
             
            {
         
     | 
| 
       145 
     | 
    
         
            -
              VALUE rb_path, rb_query, rb_bookmark;
         
     | 
| 
      
 149 
     | 
    
         
            +
              VALUE rb_path, rb_query, rb_bookmark, rb_session;
         
     | 
| 
       146 
150 
     | 
    
         
             
              EVT_HANDLE hSubscription = NULL, hBookmark = NULL;
         
     | 
| 
       147 
151 
     | 
    
         
             
              HANDLE hSignalEvent;
         
     | 
| 
      
 152 
     | 
    
         
            +
              EVT_HANDLE hRemoteHandle = NULL;
         
     | 
| 
       148 
153 
     | 
    
         
             
              DWORD len, flags = 0L;
         
     | 
| 
      
 154 
     | 
    
         
            +
              DWORD err = ERROR_SUCCESS;
         
     | 
| 
       149 
155 
     | 
    
         
             
              VALUE wpathBuf, wqueryBuf, wBookmarkBuf;
         
     | 
| 
       150 
156 
     | 
    
         
             
              PWSTR path, query, bookmarkXml;
         
     | 
| 
       151 
157 
     | 
    
         
             
              DWORD status = ERROR_SUCCESS;
         
     | 
| 
      
 158 
     | 
    
         
            +
              struct WinevtSession* winevtSession;
         
     | 
| 
       152 
159 
     | 
    
         
             
              struct WinevtSubscribe* winevtSubscribe;
         
     | 
| 
       153 
160 
     | 
    
         | 
| 
       154 
161 
     | 
    
         
             
              hSignalEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
         
     | 
| 
         @@ -156,7 +163,7 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       156 
163 
     | 
    
         
             
              TypedData_Get_Struct(
         
     | 
| 
       157 
164 
     | 
    
         
             
                self, struct WinevtSubscribe, &rb_winevt_subscribe_type, winevtSubscribe);
         
     | 
| 
       158 
165 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
              rb_scan_args(argc, argv, " 
     | 
| 
      
 166 
     | 
    
         
            +
              rb_scan_args(argc, argv, "22", &rb_path, &rb_query, &rb_bookmark, &rb_session);
         
     | 
| 
       160 
167 
     | 
    
         
             
              Check_Type(rb_path, T_STRING);
         
     | 
| 
       161 
168 
     | 
    
         
             
              Check_Type(rb_query, T_STRING);
         
     | 
| 
       162 
169 
     | 
    
         | 
| 
         @@ -179,6 +186,19 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       179 
186 
     | 
    
         
             
                  raise_system_error(rb_eWinevtQueryError, status);
         
     | 
| 
       180 
187 
     | 
    
         
             
                }
         
     | 
| 
       181 
188 
     | 
    
         
             
              }
         
     | 
| 
      
 189 
     | 
    
         
            +
              if (rb_obj_is_kind_of(rb_session, rb_cSession)) {
         
     | 
| 
      
 190 
     | 
    
         
            +
                winevtSession = EventSession(rb_session);
         
     | 
| 
      
 191 
     | 
    
         
            +
                hRemoteHandle = connect_to_remote(winevtSession->server,
         
     | 
| 
      
 192 
     | 
    
         
            +
                                                  winevtSession->domain,
         
     | 
| 
      
 193 
     | 
    
         
            +
                                                  winevtSession->username,
         
     | 
| 
      
 194 
     | 
    
         
            +
                                                  winevtSession->password,
         
     | 
| 
      
 195 
     | 
    
         
            +
                                                  winevtSession->flags);
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                err = GetLastError();
         
     | 
| 
      
 198 
     | 
    
         
            +
                if (err != ERROR_SUCCESS) {
         
     | 
| 
      
 199 
     | 
    
         
            +
                  raise_system_error(rb_eRuntimeError, err);
         
     | 
| 
      
 200 
     | 
    
         
            +
                }
         
     | 
| 
      
 201 
     | 
    
         
            +
              }
         
     | 
| 
       182 
202 
     | 
    
         | 
| 
       183 
203 
     | 
    
         
             
              // path : To wide char
         
     | 
| 
       184 
204 
     | 
    
         
             
              len =
         
     | 
| 
         @@ -204,7 +224,7 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       204 
224 
     | 
    
         
             
              }
         
     | 
| 
       205 
225 
     | 
    
         | 
| 
       206 
226 
     | 
    
         
             
              hSubscription =
         
     | 
| 
       207 
     | 
    
         
            -
                EvtSubscribe( 
     | 
| 
      
 227 
     | 
    
         
            +
                EvtSubscribe(hRemoteHandle, hSignalEvent, path, query, hBookmark, NULL, NULL, flags);
         
     | 
| 
       208 
228 
     | 
    
         
             
              if (!hSubscription) {
         
     | 
| 
       209 
229 
     | 
    
         
             
                if (hBookmark != NULL) {
         
     | 
| 
       210 
230 
     | 
    
         
             
                  EvtClose(hBookmark);
         
     | 
| 
         @@ -213,7 +233,11 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       213 
233 
     | 
    
         
             
                  CloseHandle(hSignalEvent);
         
     | 
| 
       214 
234 
     | 
    
         
             
                }
         
     | 
| 
       215 
235 
     | 
    
         
             
                status = GetLastError();
         
     | 
| 
       216 
     | 
    
         
            -
                 
     | 
| 
      
 236 
     | 
    
         
            +
                if (rb_obj_is_kind_of(rb_session, rb_cSession)) {
         
     | 
| 
      
 237 
     | 
    
         
            +
                  rb_raise(rb_eRemoteHandlerError, "Remoting subscription is not working. errCode: %ld\n", status);
         
     | 
| 
      
 238 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 239 
     | 
    
         
            +
                  raise_system_error(rb_eWinevtQueryError, status);
         
     | 
| 
      
 240 
     | 
    
         
            +
                }
         
     | 
| 
       217 
241 
     | 
    
         
             
              }
         
     | 
| 
       218 
242 
     | 
    
         | 
| 
       219 
243 
     | 
    
         
             
              if (winevtSubscribe->subscription != NULL) {
         
     | 
| 
         @@ -226,6 +250,7 @@ rb_winevt_subscribe_subscribe(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       226 
250 
     | 
    
         | 
| 
       227 
251 
     | 
    
         
             
              winevtSubscribe->signalEvent = hSignalEvent;
         
     | 
| 
       228 
252 
     | 
    
         
             
              winevtSubscribe->subscription = hSubscription;
         
     | 
| 
      
 253 
     | 
    
         
            +
              winevtSubscribe->remoteHandle = hRemoteHandle;
         
     | 
| 
       229 
254 
     | 
    
         
             
              if (hBookmark) {
         
     | 
| 
       230 
255 
     | 
    
         
             
                winevtSubscribe->bookmark = hBookmark;
         
     | 
| 
       231 
256 
     | 
    
         
             
              } else {
         
     | 
| 
         @@ -346,12 +371,12 @@ rb_winevt_subscribe_render(VALUE self, EVT_HANDLE event) 
     | 
|
| 
       346 
371 
     | 
    
         
             
            }
         
     | 
| 
       347 
372 
     | 
    
         | 
| 
       348 
373 
     | 
    
         
             
            static VALUE
         
     | 
| 
       349 
     | 
    
         
            -
            rb_winevt_subscribe_message(EVT_HANDLE event, LocaleInfo* localeInfo)
         
     | 
| 
      
 374 
     | 
    
         
            +
            rb_winevt_subscribe_message(EVT_HANDLE event, LocaleInfo* localeInfo, EVT_HANDLE hRemote)
         
     | 
| 
       350 
375 
     | 
    
         
             
            {
         
     | 
| 
       351 
376 
     | 
    
         
             
              WCHAR* wResult;
         
     | 
| 
       352 
377 
     | 
    
         
             
              VALUE utf8str;
         
     | 
| 
       353 
378 
     | 
    
         | 
| 
       354 
     | 
    
         
            -
              wResult = get_description(event, localeInfo->langID);
         
     | 
| 
      
 379 
     | 
    
         
            +
              wResult = get_description(event, localeInfo->langID, hRemote);
         
     | 
| 
       355 
380 
     | 
    
         
             
              utf8str = wstr_to_rb_str(CP_UTF8, wResult, -1);
         
     | 
| 
       356 
381 
     | 
    
         
             
              free(wResult);
         
     | 
| 
       357 
382 
     | 
    
         | 
| 
         @@ -394,7 +419,8 @@ rb_winevt_subscribe_each_yield(VALUE self) 
     | 
|
| 
       394 
419 
     | 
    
         
             
              for (int i = 0; i < winevtSubscribe->count; i++) {
         
     | 
| 
       395 
420 
     | 
    
         
             
                rb_yield_values(3,
         
     | 
| 
       396 
421 
     | 
    
         
             
                                rb_winevt_subscribe_render(self, winevtSubscribe->hEvents[i]),
         
     | 
| 
       397 
     | 
    
         
            -
                                rb_winevt_subscribe_message(winevtSubscribe->hEvents[i], winevtSubscribe->localeInfo 
     | 
| 
      
 422 
     | 
    
         
            +
                                rb_winevt_subscribe_message(winevtSubscribe->hEvents[i], winevtSubscribe->localeInfo,
         
     | 
| 
      
 423 
     | 
    
         
            +
                                                            winevtSubscribe->remoteHandle),
         
     | 
| 
       398 
424 
     | 
    
         
             
                                rb_winevt_subscribe_string_inserts(winevtSubscribe->hEvents[i]));
         
     | 
| 
       399 
425 
     | 
    
         
             
              }
         
     | 
| 
       400 
426 
     | 
    
         | 
| 
         @@ -523,7 +549,7 @@ rb_winevt_subscribe_set_render_as_xml(VALUE self, VALUE rb_render_as_xml) 
     | 
|
| 
       523 
549 
     | 
    
         
             
             * This method specifies whether preserving qualifiers key or not.
         
     | 
| 
       524 
550 
     | 
    
         
             
             *
         
     | 
| 
       525 
551 
     | 
    
         
             
             * @since 0.7.3
         
     | 
| 
       526 
     | 
    
         
            -
             * @param  
     | 
| 
      
 552 
     | 
    
         
            +
             * @param rb_preserve_qualifiers [Boolean]
         
     | 
| 
       527 
553 
     | 
    
         
             
             */
         
     | 
| 
       528 
554 
     | 
    
         
             
            static VALUE
         
     | 
| 
       529 
555 
     | 
    
         
             
            rb_winevt_subscribe_set_preserve_qualifiers(VALUE self, VALUE rb_preserve_qualifiers)
         
     | 
    
        data/ext/winevt/winevt_utils.cpp
    CHANGED
    
    | 
         @@ -76,6 +76,28 @@ render_to_rb_str(EVT_HANDLE handle, DWORD flags) 
     | 
|
| 
       76 
76 
     | 
    
         
             
              return result;
         
     | 
| 
       77 
77 
     | 
    
         
             
            }
         
     | 
| 
       78 
78 
     | 
    
         | 
| 
      
 79 
     | 
    
         
            +
            EVT_HANDLE
         
     | 
| 
      
 80 
     | 
    
         
            +
            connect_to_remote(LPWSTR computerName, LPWSTR domain, LPWSTR username, LPWSTR password,
         
     | 
| 
      
 81 
     | 
    
         
            +
                              EVT_RPC_LOGIN_FLAGS flags)
         
     | 
| 
      
 82 
     | 
    
         
            +
            {
         
     | 
| 
      
 83 
     | 
    
         
            +
              EVT_HANDLE hRemote = NULL;
         
     | 
| 
      
 84 
     | 
    
         
            +
              EVT_RPC_LOGIN Credentials;
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
              RtlZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              Credentials.Server = computerName;
         
     | 
| 
      
 89 
     | 
    
         
            +
              Credentials.Domain = domain;
         
     | 
| 
      
 90 
     | 
    
         
            +
              Credentials.User = username;
         
     | 
| 
      
 91 
     | 
    
         
            +
              Credentials.Password = password;
         
     | 
| 
      
 92 
     | 
    
         
            +
              Credentials.Flags = flags;
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              hRemote = EvtOpenSession(EvtRpcLogin, &Credentials, 0, 0);
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
              SecureZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              return hRemote;
         
     | 
| 
      
 99 
     | 
    
         
            +
            }
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
       79 
101 
     | 
    
         
             
            static std::wstring
         
     | 
| 
       80 
102 
     | 
    
         
             
            guid_to_wstr(const GUID& guid)
         
     | 
| 
       81 
103 
     | 
    
         
             
            {
         
     | 
| 
         @@ -433,7 +455,7 @@ cleanup: 
     | 
|
| 
       433 
455 
     | 
    
         
             
            }
         
     | 
| 
       434 
456 
     | 
    
         | 
| 
       435 
457 
     | 
    
         
             
            WCHAR*
         
     | 
| 
       436 
     | 
    
         
            -
            get_description(EVT_HANDLE handle, LANGID langID)
         
     | 
| 
      
 458 
     | 
    
         
            +
            get_description(EVT_HANDLE handle, LANGID langID, EVT_HANDLE hRemote)
         
     | 
| 
       437 
459 
     | 
    
         
             
            {
         
     | 
| 
       438 
460 
     | 
    
         
             
            #define BUFSIZE 4096
         
     | 
| 
       439 
461 
     | 
    
         
             
              std::vector<WCHAR> buffer(BUFSIZE);
         
     | 
| 
         @@ -470,7 +492,7 @@ get_description(EVT_HANDLE handle, LANGID langID) 
     | 
|
| 
       470 
492 
     | 
    
         | 
| 
       471 
493 
     | 
    
         
             
              // Open publisher metadata
         
     | 
| 
       472 
494 
     | 
    
         
             
              hMetadata = EvtOpenPublisherMetadata(
         
     | 
| 
       473 
     | 
    
         
            -
                 
     | 
| 
      
 495 
     | 
    
         
            +
                hRemote,
         
     | 
| 
       474 
496 
     | 
    
         
             
                values[0].StringVal,
         
     | 
| 
       475 
497 
     | 
    
         
             
                nullptr,
         
     | 
| 
       476 
498 
     | 
    
         
             
                MAKELCID(langID, SORT_DEFAULT),
         
     | 
    
        data/lib/winevt.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Winevt
         
     | 
| 
      
 2 
     | 
    
         
            +
              class EventLog
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Session
         
     | 
| 
      
 4 
     | 
    
         
            +
                  alias_method :initialize_raw, :initialize
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  def initialize(server, domain = nil, username = nil, password = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    initialize_raw
         
     | 
| 
      
 8 
     | 
    
         
            +
                    self.server = server
         
     | 
| 
      
 9 
     | 
    
         
            +
                    self.domain = domain if domain.is_a?(String)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    self.username = username if username.is_a?(String)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    self.password = password if password.is_a?(String)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/winevt/subscribe.rb
    CHANGED
    
    | 
         @@ -3,8 +3,11 @@ module Winevt 
     | 
|
| 
       3 
3 
     | 
    
         
             
                class Subscribe
         
     | 
| 
       4 
4 
     | 
    
         
             
                  alias_method :subscribe_raw, :subscribe
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                  def subscribe(path, query, bookmark = nil)
         
     | 
| 
       7 
     | 
    
         
            -
                    if bookmark.is_a?(Winevt::EventLog::Bookmark)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def subscribe(path, query, bookmark = nil, session = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    if bookmark.is_a?(Winevt::EventLog::Bookmark) &&
         
     | 
| 
      
 8 
     | 
    
         
            +
                       session.is_a?(Winevt::EventLog::Session)
         
     | 
| 
      
 9 
     | 
    
         
            +
                      subscribe_raw(path, query, bookmark.render, session)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    elsif bookmark.is_a?(Winevt::EventLog::Bookmark)
         
     | 
| 
       8 
11 
     | 
    
         
             
                      subscribe_raw(path, query, bookmark.render)
         
     | 
| 
       9 
12 
     | 
    
         
             
                    else
         
     | 
| 
       10 
13 
     | 
    
         
             
                      subscribe_raw(path, query)
         
     | 
    
        data/lib/winevt/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: winevt_c
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.9.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Hiroshi Hatake
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-09-10 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -132,11 +132,13 @@ files: 
     | 
|
| 
       132 
132 
     | 
    
         
             
            - ext/winevt/winevt_locale.c
         
     | 
| 
       133 
133 
     | 
    
         
             
            - ext/winevt/winevt_locale_info.c
         
     | 
| 
       134 
134 
     | 
    
         
             
            - ext/winevt/winevt_query.c
         
     | 
| 
      
 135 
     | 
    
         
            +
            - ext/winevt/winevt_session.c
         
     | 
| 
       135 
136 
     | 
    
         
             
            - ext/winevt/winevt_subscribe.c
         
     | 
| 
       136 
137 
     | 
    
         
             
            - ext/winevt/winevt_utils.cpp
         
     | 
| 
       137 
138 
     | 
    
         
             
            - lib/winevt.rb
         
     | 
| 
       138 
139 
     | 
    
         
             
            - lib/winevt/bookmark.rb
         
     | 
| 
       139 
140 
     | 
    
         
             
            - lib/winevt/query.rb
         
     | 
| 
      
 141 
     | 
    
         
            +
            - lib/winevt/session.rb
         
     | 
| 
       140 
142 
     | 
    
         
             
            - lib/winevt/subscribe.rb
         
     | 
| 
       141 
143 
     | 
    
         
             
            - lib/winevt/version.rb
         
     | 
| 
       142 
144 
     | 
    
         
             
            - winevt_c.gemspec
         
     |