2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Marcin Krzysztof Porwit 2005,
5 * Copyright (C) Brian Moran 2005,
6 * Copyright (C) Gerald (Jerry) Carter 2005.
7 * Copyright (C) Guenther Deschner 2009.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>.
24 #include "../librpc/gen_ndr/srv_eventlog.h"
25 #include "lib/eventlog/eventlog.h"
29 #define DBGC_CLASS DBGC_RPC_SRV
34 uint32 current_record
;
38 uint32 access_granted
;
41 /********************************************************************
42 ********************************************************************/
44 static int eventlog_info_destructor(EVENTLOG_INFO
*elog
)
47 elog_close_tdb(elog
->etdb
, false);
52 /********************************************************************
53 ********************************************************************/
55 static EVENTLOG_INFO
*find_eventlog_info_by_hnd( pipes_struct
* p
,
56 struct policy_handle
* handle
)
60 if ( !find_policy_by_hnd( p
, handle
, (void **)(void *)&info
) ) {
62 ( "find_eventlog_info_by_hnd: eventlog not found.\n" ) );
69 /********************************************************************
70 ********************************************************************/
72 static bool elog_check_access( EVENTLOG_INFO
*info
, NT_USER_TOKEN
*token
)
74 char *tdbname
= elog_tdbname(talloc_tos(), info
->logname
);
75 struct security_descriptor
*sec_desc
;
76 struct security_ace
*ace
;
82 /* get the security descriptor for the file */
84 sec_desc
= get_nt_acl_no_snum( info
, tdbname
);
85 TALLOC_FREE( tdbname
);
88 DEBUG(5,("elog_check_access: Unable to get NT ACL for %s\n",
93 ace
= talloc_zero(sec_desc
, struct security_ace
);
95 TALLOC_FREE(sec_desc
);
99 ace
->type
= SEC_ACE_TYPE_ACCESS_ALLOWED
;
101 ace
->access_mask
= REG_KEY_ALL
;
102 ace
->trustee
= global_sid_System
;
104 status
= security_descriptor_dacl_add(sec_desc
, ace
);
105 if (!NT_STATUS_IS_OK(status
)) {
106 TALLOC_FREE(sec_desc
);
112 if ( geteuid() == sec_initial_uid() ) {
113 DEBUG(5,("elog_check_access: running as root, using system token\n"));
114 token
= get_system_token();
117 /* run the check, try for the max allowed */
119 status
= se_access_check( sec_desc
, token
, MAXIMUM_ALLOWED_ACCESS
,
120 &info
->access_granted
);
122 TALLOC_FREE(sec_desc
);
124 if (!NT_STATUS_IS_OK(status
)) {
125 DEBUG(8,("elog_check_access: se_access_check() return %s\n",
130 /* we have to have READ permission for a successful open */
132 return ( info
->access_granted
& SEC_FILE_READ_DATA
);
135 /********************************************************************
136 ********************************************************************/
138 static bool elog_validate_logname( const char *name
)
141 const char **elogs
= lp_eventlog_list();
147 for ( i
=0; elogs
[i
]; i
++ ) {
148 if ( strequal( name
, elogs
[i
] ) )
155 /********************************************************************
156 ********************************************************************/
158 static bool get_num_records_hook( EVENTLOG_INFO
* info
)
164 DEBUG( 10, ( "No open tdb for %s\n", info
->logname
) );
168 /* lock the tdb since we have to get 2 records */
170 tdb_lock_bystring_with_timeout( ELOG_TDB_CTX(info
->etdb
), EVT_NEXT_RECORD
, 1 );
171 next_record
= tdb_fetch_int32( ELOG_TDB_CTX(info
->etdb
), EVT_NEXT_RECORD
);
172 oldest_record
= tdb_fetch_int32( ELOG_TDB_CTX(info
->etdb
), EVT_OLDEST_ENTRY
);
173 tdb_unlock_bystring( ELOG_TDB_CTX(info
->etdb
), EVT_NEXT_RECORD
);
176 ( "Oldest Record %d; Next Record %d\n", oldest_record
,
179 info
->num_records
= ( next_record
- oldest_record
);
180 info
->oldest_entry
= oldest_record
;
185 /********************************************************************
186 ********************************************************************/
188 static bool get_oldest_entry_hook( EVENTLOG_INFO
* info
)
190 /* it's the same thing */
191 return get_num_records_hook( info
);
194 /********************************************************************
195 ********************************************************************/
197 static NTSTATUS
elog_open( pipes_struct
* p
, const char *logname
, struct policy_handle
*hnd
)
201 /* first thing is to validate the eventlog name */
203 if ( !elog_validate_logname( logname
) )
204 return NT_STATUS_OBJECT_PATH_INVALID
;
206 if ( !(elog
= TALLOC_ZERO_P( NULL
, EVENTLOG_INFO
)) )
207 return NT_STATUS_NO_MEMORY
;
208 talloc_set_destructor(elog
, eventlog_info_destructor
);
210 elog
->logname
= talloc_strdup( elog
, logname
);
212 /* Open the tdb first (so that we can create any new tdbs if necessary).
213 We have to do this as root and then use an internal access check
214 on the file permissions since you can only have a tdb open once
215 in a single process */
218 elog
->etdb
= elog_open_tdb( elog
->logname
, False
, False
);
222 /* according to MSDN, if the logfile cannot be found, we should
223 default to the "Application" log */
225 if ( !strequal( logname
, ELOG_APPL
) ) {
227 TALLOC_FREE( elog
->logname
);
229 elog
->logname
= talloc_strdup( elog
, ELOG_APPL
);
231 /* do the access check */
232 if ( !elog_check_access( elog
, p
->server_info
->ptok
) ) {
234 return NT_STATUS_ACCESS_DENIED
;
238 elog
->etdb
= elog_open_tdb( elog
->logname
, False
, False
);
244 return NT_STATUS_ACCESS_DENIED
; /* ??? */
248 /* now do the access check. Close the tdb if we fail here */
250 if ( !elog_check_access( elog
, p
->server_info
->ptok
) ) {
252 return NT_STATUS_ACCESS_DENIED
;
255 /* create the policy handle */
257 if ( !create_policy_hnd( p
, hnd
, elog
) ) {
259 return NT_STATUS_NO_MEMORY
;
262 /* set the initial current_record pointer */
264 if ( !get_oldest_entry_hook( elog
) ) {
265 DEBUG(3,("elog_open: Successfully opened eventlog but can't "
266 "get any information on internal records!\n"));
269 elog
->current_record
= elog
->oldest_entry
;
274 /********************************************************************
275 ********************************************************************/
277 static NTSTATUS
elog_close( pipes_struct
*p
, struct policy_handle
*hnd
)
279 if ( !( close_policy_hnd( p
, hnd
) ) ) {
280 return NT_STATUS_INVALID_HANDLE
;
286 /*******************************************************************
287 *******************************************************************/
289 static int elog_size( EVENTLOG_INFO
*info
)
291 if ( !info
|| !info
->etdb
) {
292 DEBUG(0,("elog_size: Invalid info* structure!\n"));
296 return elog_tdb_size( ELOG_TDB_CTX(info
->etdb
), NULL
, NULL
);
299 /********************************************************************
300 note that this can only be called AFTER the table is constructed,
301 since it uses the table to find the tdb handle
302 ********************************************************************/
304 static bool sync_eventlog_params( EVENTLOG_INFO
*info
)
309 struct registry_key
*key
;
310 struct registry_value
*value
;
312 char *elogname
= info
->logname
;
313 TALLOC_CTX
*ctx
= talloc_stackframe();
316 DEBUG( 4, ( "sync_eventlog_params with %s\n", elogname
) );
319 DEBUG( 4, ( "No open tdb! (%s)\n", info
->logname
) );
322 /* set resonable defaults. 512Kb on size and 1 week on time */
325 uiRetention
= 604800;
327 /* the general idea is to internally open the registry
328 key and retrieve the values. That way we can continue
329 to use the same fetch/store api that we use in
332 path
= talloc_asprintf(ctx
, "%s/%s", KEY_EVENTLOG
, elogname
);
337 wresult
= reg_open_path(ctx
, path
, REG_KEY_READ
, get_system_token(),
340 if ( !W_ERROR_IS_OK( wresult
) ) {
342 ( "sync_eventlog_params: Failed to open key [%s] (%s)\n",
343 path
, win_errstr( wresult
) ) );
347 wresult
= reg_queryvalue(key
, key
, "Retention", &value
);
348 if (!W_ERROR_IS_OK(wresult
)) {
349 DEBUG(4, ("Failed to query value \"Retention\": %s\n",
350 win_errstr(wresult
)));
353 uiRetention
= value
->v
.dword
;
355 wresult
= reg_queryvalue(key
, key
, "MaxSize", &value
);
356 if (!W_ERROR_IS_OK(wresult
)) {
357 DEBUG(4, ("Failed to query value \"MaxSize\": %s\n",
358 win_errstr(wresult
)));
361 uiMaxSize
= value
->v
.dword
;
363 tdb_store_int32( ELOG_TDB_CTX(info
->etdb
), EVT_MAXSIZE
, uiMaxSize
);
364 tdb_store_int32( ELOG_TDB_CTX(info
->etdb
), EVT_RETENTION
, uiRetention
);
373 /********************************************************************
374 _eventlog_OpenEventLogW
375 ********************************************************************/
377 NTSTATUS
_eventlog_OpenEventLogW(pipes_struct
*p
,
378 struct eventlog_OpenEventLogW
*r
)
383 DEBUG( 10,("_eventlog_OpenEventLogW: Server [%s], Log [%s]\n",
384 r
->in
.servername
->string
, r
->in
.logname
->string
));
386 /* according to MSDN, if the logfile cannot be found, we should
387 default to the "Application" log */
389 if ( !NT_STATUS_IS_OK( result
= elog_open( p
, r
->in
.logname
->string
, r
->out
.handle
)) )
392 if ( !(info
= find_eventlog_info_by_hnd( p
, r
->out
.handle
)) ) {
393 DEBUG(0,("_eventlog_OpenEventLogW: eventlog (%s) opened but unable to find handle!\n",
394 r
->in
.logname
->string
));
395 elog_close( p
, r
->out
.handle
);
396 return NT_STATUS_INVALID_HANDLE
;
399 DEBUG(10,("_eventlog_OpenEventLogW: Size [%d]\n", elog_size( info
)));
401 sync_eventlog_params( info
);
402 prune_eventlog( ELOG_TDB_CTX(info
->etdb
) );
407 /********************************************************************
408 _eventlog_ClearEventLogW
409 This call still needs some work
410 ********************************************************************/
411 /** The windows client seems to be doing something funny with the file name
413 ClearEventLog(handle, "backup_file")
414 on the client side will result in the backup file name looking like this on the
416 \??\${CWD of client}\backup_file
417 If an absolute path gets specified, such as
418 ClearEventLog(handle, "C:\\temp\\backup_file")
419 then it is still mangled by the client into this:
420 \??\C:\temp\backup_file
421 when it is on the wire.
422 I'm not sure where the \?? is coming from, or why the ${CWD} of the client process
423 would be added in given that the backup file gets written on the server side. */
425 NTSTATUS
_eventlog_ClearEventLogW(pipes_struct
*p
,
426 struct eventlog_ClearEventLogW
*r
)
428 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd( p
, r
->in
.handle
);
431 return NT_STATUS_INVALID_HANDLE
;
433 if (r
->in
.backupfile
&& r
->in
.backupfile
->string
) {
435 DEBUG(8,( "_eventlog_ClearEventLogW: Using [%s] as the backup "
436 "file name for log [%s].",
437 r
->in
.backupfile
->string
, info
->logname
) );
440 /* check for WRITE access to the file */
442 if ( !(info
->access_granted
& SEC_FILE_WRITE_DATA
) )
443 return NT_STATUS_ACCESS_DENIED
;
445 /* Force a close and reopen */
447 elog_close_tdb( info
->etdb
, True
);
449 info
->etdb
= elog_open_tdb( info
->logname
, True
, False
);
453 return NT_STATUS_ACCESS_DENIED
;
458 /********************************************************************
459 _eventlog_CloseEventLog
460 ********************************************************************/
462 NTSTATUS
_eventlog_CloseEventLog(pipes_struct
* p
,
463 struct eventlog_CloseEventLog
*r
)
467 status
= elog_close( p
, r
->in
.handle
);
468 if (!NT_STATUS_IS_OK(status
)) {
472 ZERO_STRUCTP(r
->out
.handle
);
477 /********************************************************************
478 _eventlog_ReadEventLogW
479 ********************************************************************/
481 NTSTATUS
_eventlog_ReadEventLogW(pipes_struct
*p
,
482 struct eventlog_ReadEventLogW
*r
)
484 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd( p
, r
->in
.handle
);
485 uint32_t num_records_read
= 0;
486 int bytes_left
, record_number
;
487 uint32_t elog_read_type
, elog_read_dir
;
490 return NT_STATUS_INVALID_HANDLE
;
493 info
->flags
= r
->in
.flags
;
494 bytes_left
= r
->in
.number_of_bytes
;
497 return NT_STATUS_ACCESS_DENIED
;
500 /* check for valid flags. Can't use the sequential and seek flags together */
502 elog_read_type
= r
->in
.flags
& (EVENTLOG_SEQUENTIAL_READ
|EVENTLOG_SEEK_READ
);
503 elog_read_dir
= r
->in
.flags
& (EVENTLOG_FORWARDS_READ
|EVENTLOG_BACKWARDS_READ
);
505 if (r
->in
.flags
== 0 ||
506 elog_read_type
== (EVENTLOG_SEQUENTIAL_READ
|EVENTLOG_SEEK_READ
) ||
507 elog_read_dir
== (EVENTLOG_FORWARDS_READ
|EVENTLOG_BACKWARDS_READ
))
509 DEBUG(3,("_eventlog_ReadEventLogW: "
510 "Invalid flags [0x%08x] for ReadEventLog\n",
512 return NT_STATUS_INVALID_PARAMETER
;
515 /* a sequential read should ignore the offset */
517 if (elog_read_type
& EVENTLOG_SEQUENTIAL_READ
) {
518 record_number
= info
->current_record
;
520 record_number
= r
->in
.offset
;
523 if (r
->in
.number_of_bytes
== 0) {
524 struct EVENTLOGRECORD
*e
;
525 e
= evlog_pull_record(p
->mem_ctx
, ELOG_TDB_CTX(info
->etdb
),
528 return NT_STATUS_END_OF_FILE
;
530 *r
->out
.real_size
= e
->Length
;
531 return NT_STATUS_BUFFER_TOO_SMALL
;
534 while (bytes_left
> 0) {
537 enum ndr_err_code ndr_err
;
538 struct EVENTLOGRECORD
*e
;
540 e
= evlog_pull_record(p
->mem_ctx
, ELOG_TDB_CTX(info
->etdb
),
546 ndr_err
= ndr_push_struct_blob(&blob
, p
->mem_ctx
, e
,
547 (ndr_push_flags_fn_t
)ndr_push_EVENTLOGRECORD
);
548 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
549 return ndr_map_error2ntstatus(ndr_err
);
552 if (DEBUGLEVEL
>= 10) {
553 NDR_PRINT_DEBUG(EVENTLOGRECORD
, e
);
556 if (blob
.length
> r
->in
.number_of_bytes
) {
557 *r
->out
.real_size
= blob
.length
;
558 return NT_STATUS_BUFFER_TOO_SMALL
;
561 if (*r
->out
.sent_size
+ blob
.length
> r
->in
.number_of_bytes
) {
565 bytes_left
-= blob
.length
;
567 if (info
->flags
& EVENTLOG_FORWARDS_READ
) {
573 /* update the eventlog record pointer */
575 info
->current_record
= record_number
;
577 memcpy(&r
->out
.data
[*(r
->out
.sent_size
)],
578 blob
.data
, blob
.length
);
579 *(r
->out
.sent_size
) += blob
.length
;
584 if (r
->in
.offset
== 0 && record_number
== 0 && *r
->out
.sent_size
== 0) {
585 return NT_STATUS_END_OF_FILE
;
591 /********************************************************************
592 _eventlog_GetOldestRecord
593 ********************************************************************/
595 NTSTATUS
_eventlog_GetOldestRecord(pipes_struct
*p
,
596 struct eventlog_GetOldestRecord
*r
)
598 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd( p
, r
->in
.handle
);
601 return NT_STATUS_INVALID_HANDLE
;
604 if ( !( get_oldest_entry_hook( info
) ) )
605 return NT_STATUS_ACCESS_DENIED
;
607 *r
->out
.oldest_entry
= info
->oldest_entry
;
612 /********************************************************************
613 _eventlog_GetNumRecords
614 ********************************************************************/
616 NTSTATUS
_eventlog_GetNumRecords(pipes_struct
*p
,
617 struct eventlog_GetNumRecords
*r
)
619 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd( p
, r
->in
.handle
);
622 return NT_STATUS_INVALID_HANDLE
;
625 if ( !( get_num_records_hook( info
) ) )
626 return NT_STATUS_ACCESS_DENIED
;
628 *r
->out
.number
= info
->num_records
;
633 NTSTATUS
_eventlog_BackupEventLogW(pipes_struct
*p
, struct eventlog_BackupEventLogW
*r
)
635 p
->rng_fault_state
= True
;
636 return NT_STATUS_NOT_IMPLEMENTED
;
639 /********************************************************************
640 _eventlog_GetLogInformation
641 ********************************************************************/
643 NTSTATUS
_eventlog_GetLogInformation(pipes_struct
*p
,
644 struct eventlog_GetLogInformation
*r
)
646 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd(p
, r
->in
.handle
);
647 struct EVENTLOG_FULL_INFORMATION f
;
648 enum ndr_err_code ndr_err
;
652 return NT_STATUS_INVALID_HANDLE
;
655 if (r
->in
.level
!= 0) {
656 return NT_STATUS_INVALID_LEVEL
;
659 *r
->out
.bytes_needed
= 4;
661 if (r
->in
.buf_size
< 4) {
662 return NT_STATUS_BUFFER_TOO_SMALL
;
665 /* FIXME: this should be retrieved from the handle */
668 ndr_err
= ndr_push_struct_blob(&blob
, p
->mem_ctx
, &f
,
669 (ndr_push_flags_fn_t
)ndr_push_EVENTLOG_FULL_INFORMATION
);
670 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
671 return ndr_map_error2ntstatus(ndr_err
);
674 if (DEBUGLEVEL
>= 10) {
675 NDR_PRINT_DEBUG(EVENTLOG_FULL_INFORMATION
, &f
);
678 memcpy(r
->out
.buffer
, blob
.data
, 4);
683 /********************************************************************
684 _eventlog_FlushEventLog
685 ********************************************************************/
687 NTSTATUS
_eventlog_FlushEventLog(pipes_struct
*p
,
688 struct eventlog_FlushEventLog
*r
)
690 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd(p
, r
->in
.handle
);
692 return NT_STATUS_INVALID_HANDLE
;
695 return NT_STATUS_ACCESS_DENIED
;
698 /********************************************************************
699 ********************************************************************/
701 static NTSTATUS
evlog_report_to_record(TALLOC_CTX
*mem_ctx
,
702 const struct eventlog_ReportEventW
*r
,
704 struct EVENTLOGRECORD
*e
)
709 e
->TimeGenerated
= r
->in
.timestamp
;
710 e
->TimeWritten
= time(NULL
);
711 e
->EventID
= r
->in
.event_id
;
712 e
->EventType
= r
->in
.event_type
;
713 e
->NumStrings
= r
->in
.num_of_strings
;
714 e
->EventCategory
= r
->in
.event_category
;
715 e
->ReservedFlags
= r
->in
.flags
;
716 e
->DataLength
= r
->in
.data_size
;
717 e
->SourceName
= talloc_strdup(mem_ctx
, logname
);
718 NT_STATUS_HAVE_NO_MEMORY(e
->SourceName
);
719 if (r
->in
.servername
->string
) {
720 e
->Computername
= r
->in
.servername
->string
;
722 e
->Computername
= talloc_strdup(mem_ctx
, "");
723 NT_STATUS_HAVE_NO_MEMORY(e
->Computername
);
725 if (r
->in
.user_sid
) {
726 e
->UserSid
= *r
->in
.user_sid
;
728 e
->Strings
= talloc_array(mem_ctx
, const char *, e
->NumStrings
);
729 NT_STATUS_HAVE_NO_MEMORY(e
->Strings
);
731 for (i
=0; i
< e
->NumStrings
; i
++) {
732 e
->Strings
[i
] = talloc_strdup(e
->Strings
,
733 r
->in
.strings
[i
]->string
);
734 NT_STATUS_HAVE_NO_MEMORY(e
->Strings
[i
]);
736 e
->Data
= r
->in
.data
;
741 /********************************************************************
742 _eventlog_ReportEventW
743 ********************************************************************/
745 NTSTATUS
_eventlog_ReportEventW(pipes_struct
*p
,
746 struct eventlog_ReportEventW
*r
)
749 struct EVENTLOGRECORD record
;
751 EVENTLOG_INFO
*info
= find_eventlog_info_by_hnd(p
, r
->in
.handle
);
753 return NT_STATUS_INVALID_HANDLE
;
756 status
= evlog_report_to_record(p
->mem_ctx
, r
, info
->logname
, &record
);
757 if (!NT_STATUS_IS_OK(status
)) {
761 status
= evlog_push_record(p
->mem_ctx
,
762 ELOG_TDB_CTX(info
->etdb
),
764 r
->out
.record_number
);
765 if (!NT_STATUS_IS_OK(status
)) {
772 /********************************************************************
773 ********************************************************************/
775 NTSTATUS
_eventlog_DeregisterEventSource(pipes_struct
*p
, struct eventlog_DeregisterEventSource
*r
)
777 p
->rng_fault_state
= True
;
778 return NT_STATUS_NOT_IMPLEMENTED
;
781 NTSTATUS
_eventlog_ChangeNotify(pipes_struct
*p
, struct eventlog_ChangeNotify
*r
)
783 p
->rng_fault_state
= True
;
784 return NT_STATUS_NOT_IMPLEMENTED
;
787 NTSTATUS
_eventlog_RegisterEventSourceW(pipes_struct
*p
, struct eventlog_RegisterEventSourceW
*r
)
789 p
->rng_fault_state
= True
;
790 return NT_STATUS_NOT_IMPLEMENTED
;
793 NTSTATUS
_eventlog_OpenBackupEventLogW(pipes_struct
*p
, struct eventlog_OpenBackupEventLogW
*r
)
795 p
->rng_fault_state
= True
;
796 return NT_STATUS_NOT_IMPLEMENTED
;
799 NTSTATUS
_eventlog_ClearEventLogA(pipes_struct
*p
, struct eventlog_ClearEventLogA
*r
)
801 p
->rng_fault_state
= True
;
802 return NT_STATUS_NOT_IMPLEMENTED
;
805 NTSTATUS
_eventlog_BackupEventLogA(pipes_struct
*p
, struct eventlog_BackupEventLogA
*r
)
807 p
->rng_fault_state
= True
;
808 return NT_STATUS_NOT_IMPLEMENTED
;
811 NTSTATUS
_eventlog_OpenEventLogA(pipes_struct
*p
, struct eventlog_OpenEventLogA
*r
)
813 p
->rng_fault_state
= True
;
814 return NT_STATUS_NOT_IMPLEMENTED
;
817 NTSTATUS
_eventlog_RegisterEventSourceA(pipes_struct
*p
, struct eventlog_RegisterEventSourceA
*r
)
819 p
->rng_fault_state
= True
;
820 return NT_STATUS_NOT_IMPLEMENTED
;
823 NTSTATUS
_eventlog_OpenBackupEventLogA(pipes_struct
*p
, struct eventlog_OpenBackupEventLogA
*r
)
825 p
->rng_fault_state
= True
;
826 return NT_STATUS_NOT_IMPLEMENTED
;
829 NTSTATUS
_eventlog_ReadEventLogA(pipes_struct
*p
, struct eventlog_ReadEventLogA
*r
)
831 p
->rng_fault_state
= True
;
832 return NT_STATUS_NOT_IMPLEMENTED
;
835 NTSTATUS
_eventlog_ReportEventA(pipes_struct
*p
, struct eventlog_ReportEventA
*r
)
837 p
->rng_fault_state
= True
;
838 return NT_STATUS_NOT_IMPLEMENTED
;
841 NTSTATUS
_eventlog_RegisterClusterSvc(pipes_struct
*p
, struct eventlog_RegisterClusterSvc
*r
)
843 p
->rng_fault_state
= True
;
844 return NT_STATUS_NOT_IMPLEMENTED
;
847 NTSTATUS
_eventlog_DeregisterClusterSvc(pipes_struct
*p
, struct eventlog_DeregisterClusterSvc
*r
)
849 p
->rng_fault_state
= True
;
850 return NT_STATUS_NOT_IMPLEMENTED
;
853 NTSTATUS
_eventlog_WriteClusterEvents(pipes_struct
*p
, struct eventlog_WriteClusterEvents
*r
)
855 p
->rng_fault_state
= True
;
856 return NT_STATUS_NOT_IMPLEMENTED
;
859 NTSTATUS
_eventlog_ReportEventAndSourceW(pipes_struct
*p
, struct eventlog_ReportEventAndSourceW
*r
)
861 p
->rng_fault_state
= True
;
862 return NT_STATUS_NOT_IMPLEMENTED
;