From 3f4ded7db8e9eb4062d557499bec5242516cd7e8 Mon Sep 17 00:00:00 2001 From: Saveliy Tretiakov Date: Sat, 4 Mar 2006 17:04:42 +0000 Subject: [PATCH] Don't create files when booting from CD Implement EventLogOpenA (wrapper over unimplemented EventLogOpenW) svn path=/trunk/; revision=21224 --- reactos/base/services/eventlog/eventlog.c | 49 +++++++++---- reactos/base/services/eventlog/eventlog.h | 43 ++++++++---- reactos/base/services/eventlog/file.c | 30 ++++++-- reactos/base/services/eventlog/logport.c | 10 +-- reactos/base/services/eventlog/rpc.c | 85 +++++++++++++++++------ 5 files changed, 159 insertions(+), 58 deletions(-) diff --git a/reactos/base/services/eventlog/eventlog.c b/reactos/base/services/eventlog/eventlog.c index ec16837c316..4c5cb6ca2ee 100644 --- a/reactos/base/services/eventlog/eventlog.c +++ b/reactos/base/services/eventlog/eventlog.c @@ -1,10 +1,10 @@ /* - * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory * FILE: services/eventlog/eventlog.c * PURPOSE: Event logging service - * PROGRAMMERS: Saveliy Tretiakov (saveliyt@mail.ru) - * Eric Kohl + * COPYRIGHT: Copyright 2002 Eric Kohl + * Copyright 2005 Saveliy Tretiakov */ @@ -18,8 +18,11 @@ SERVICE_TABLE_ENTRY ServiceTable[2] = {NULL, NULL} }; +/* GLOBAL VARIABLES */ HANDLE MyHeap = NULL; PLOGFILE SystemLog = NULL; +PLOGFILE ApplicationLog = NULL; +BOOL onLiveCD = FALSE; // On livecd events will go to debug output only VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv) { @@ -51,7 +54,7 @@ VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv) int main(int argc, char *argv[]) { - WCHAR SysLogPath[MAX_PATH]; + WCHAR LogPath[MAX_PATH]; MyHeap = HeapCreate(0, 1024*256, 0); if(MyHeap==NULL) @@ -64,16 +67,36 @@ int main(int argc, char *argv[]) This will be fixed in near future */ - GetWindowsDirectory(SysLogPath, MAX_PATH); - lstrcat(SysLogPath, L"\\system32\\config\\SysEvent.evt"); - - SystemLog = LogfCreate(L"System", SysLogPath); - - if(SystemLog == NULL) + GetWindowsDirectory(LogPath, MAX_PATH); + if(GetDriveType(LogPath) == DRIVE_CDROM) { - DbgPrint("EventLog: FATAL ERROR, can't create %S\n", SysLogPath); - HeapDestroy(MyHeap); - return 1; + DPRINT("LiveCD detected\n"); + onLiveCD = TRUE; + } + else + { + lstrcat(LogPath, L"\\system32\\config\\SysEvent.evt"); + + SystemLog = LogfCreate(L"System", LogPath); + + if(SystemLog == NULL) + { + DbgPrint("EventLog: FATAL ERROR, can't create %S\n", LogPath); + HeapDestroy(MyHeap); + return 1; + } + + GetWindowsDirectory(LogPath, MAX_PATH); + lstrcat(LogPath, L"\\system32\\config\\AppEvent.evt"); + + ApplicationLog = LogfCreate(L"Application", LogPath); + + if(ApplicationLog == NULL) + { + DbgPrint("EventLog: FATAL ERROR, can't create %S\n", LogPath); + HeapDestroy(MyHeap); + return 1; + } } StartServiceCtrlDispatcher(ServiceTable); diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index e51bb0aaf75..5370b41d86f 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -1,11 +1,12 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS - * FILE: eventlog.h - * PURPOSE: Event logging service - * PROGRAMMER: Saveliy Tretiakov (saveliyt@mail.ru) + * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: services/eventlog/eventlog.h + * PURPOSE: Event logging service + * COPYRIGHT: Copyright 2005 Saveliy Tretiakov */ + #ifndef __EVENTLOG_H__ #define __EVENTLOG_H__ @@ -17,16 +18,18 @@ #include #include #include +#include #include "eventlogrpc_s.h" + typedef struct _IO_ERROR_LPC { PORT_MESSAGE Header; IO_ERROR_LOG_MESSAGE Message; } IO_ERROR_LPC, *PIO_ERROR_LPC; -#define LOGHANDLE unsigned char* -#define PLOGHANDLE int* +#define LOGHANDLE unsigned int +#define PLOGHANDLE unsigned int* #define MAJORVER 1 #define MINORVER 1 @@ -102,6 +105,8 @@ PLOGFILE LogfListItemByIndex(INT Index); PLOGFILE LogfListItemByName(WCHAR *Name); +INT LogfListItemIndexByName(WCHAR *Name); + VOID LogfListAddItem(PLOGFILE Item); VOID LogfListRemoveItem(PLOGFILE Item); @@ -199,7 +204,8 @@ NTSTATUS EventLogGetOldestRec( LOGHANDLE Handle, unsigned long *OldestRecNumber); -NTSTATUS Unknown6(handle_t BindingHandle); +NTSTATUS EventLogChangeNotify( + handle_t BindingHandle); NTSTATUS EventLogOpenW( handle_t BindingHandle, @@ -250,7 +256,9 @@ NTSTATUS EventLogReportEventW( unsigned char *SID, wchar_t *Strings, unsigned char *Data, - unsigned short Flags); + unsigned short Flags, + unsigned long * unknown1, + unsigned long * unknown2); NTSTATUS EventLogClearA( handle_t BindingHandle, @@ -311,13 +319,18 @@ NTSTATUS EventLogReportEventA( unsigned char *SID, char* Strings, unsigned char *Data, - unsigned short Flags); + unsigned short Flags, + unsigned long * unknown1, + unsigned long * unknown2); -NTSTATUS Unknown19(handle_t BindingHandle); +NTSTATUS EventLogRegisterClusterSvc( + handle_t BindingHandle); + +NTSTATUS EventLogDeregisterClusterSvc( + handle_t BindingHandle); -NTSTATUS Unknown20(handle_t BindingHandle); - -NTSTATUS Unknown21(handle_t BindingHandle); +NTSTATUS EventLogWriteClusterEvents( + handle_t BindingHandle); NTSTATUS EventLogGetInfo( handle_t BindingHandle, @@ -327,6 +340,8 @@ NTSTATUS EventLogGetInfo( unsigned long BufSize, unsigned long *BytesNeeded); +NTSTATUS EventLogFlush( + handle_t BindingHandle); #endif /* __EVENTLOG_H__ */ diff --git a/reactos/base/services/eventlog/file.c b/reactos/base/services/eventlog/file.c index 351291c72ae..80a24e4eb3f 100644 --- a/reactos/base/services/eventlog/file.c +++ b/reactos/base/services/eventlog/file.c @@ -1,9 +1,9 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS + * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory * FILE: services/eventlog/file.c * PURPOSE: Event logging service - * PROGRAMMER: Saveliy Tretiakov (saveliyt@mail.ru) + * COPYRIGHT: Copyright 2005 Saveliy Tretiakov */ #include "eventlog.h" @@ -204,7 +204,7 @@ PLOGFILE LogfCreate(WCHAR *LogName, if(LogFile->hFile == INVALID_HANDLE_VALUE) { - DbgPrint("EventLog: Can't open file %S.\n", FileName); + DPRINT("Can't create file %S.\n", FileName); HeapFree(MyHeap, 0, LogFile); return NULL; } @@ -310,9 +310,29 @@ PLOGFILE LogfListItemByName(WCHAR *Name) return NULL; } +/* index starting from 1 */ +INT LogfListItemIndexByName(WCHAR *Name) +{ + PLOGFILE Item; + INT i = 1; + + Item = LogfListHead(); + + while(Item) + { + if(Item->LogName && lstrcmpW(Item->LogName, Name)==0) + return i; + Item = (PLOGFILE)Item->Next; + i++; + } + + return 0; +} + +/* index starting from 1 */ PLOGFILE LogfListItemByIndex(INT Index) { - INT i = 0; + INT i = 1; PLOGFILE Item; Item = LogfListHead(); while(Item) diff --git a/reactos/base/services/eventlog/logport.c b/reactos/base/services/eventlog/logport.c index b80abb251ee..819f9f27db7 100644 --- a/reactos/base/services/eventlog/logport.c +++ b/reactos/base/services/eventlog/logport.c @@ -1,10 +1,10 @@ /* - * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory * FILE: services/eventlog/logport.c * PURPOSE: Event logging service - * PROGRAMMER: Eric Kohl - * Saveliy Tretiakov (saveliyt@mail.ru) + * COPYRIGHT: Copyright 2002 Eric Kohl + * Copyright 2005 Saveliy Tretiakov */ /* INCLUDES *****************************************************************/ @@ -17,7 +17,7 @@ HANDLE ConnectPortHandle = NULL; HANDLE MessagePortHandle = NULL; extern PLOGFILE SystemLog; extern HANDLE MyHeap; - +extern BOOL onLiveCD; /* FUNCTIONS ****************************************************************/ @@ -205,7 +205,7 @@ NTSTATUS ProcessPortMessage(VOID) PRINT_RECORD(pRec); DPRINT("\n"); - if(SystemLog) + if(!onLiveCD && SystemLog) { if(!LogfWriteData(SystemLog, ulRecSize, (PBYTE)pRec)) DPRINT("LogfWriteData failed!\n"); diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index 89ebc2d2e88..061afbc4d0a 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -1,9 +1,9 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS + * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory * FILE: services/eventlog/rpc.c * PURPOSE: Event logging service - * PROGRAMMER: Saveliy Tretiakov (savelity@mail.ru) + * COPYRIGHT: Copyright 2005 Saveliy Tretiakov */ #include "eventlog.h" @@ -104,10 +104,11 @@ NTSTATUS EventLogGetOldestRec( } -/* FIXME */ -NTSTATUS Unknown6(handle_t BindingHandle) +/* Function 6 */ +NTSTATUS EventLogChangeNotify( + handle_t BindingHandle) { - DPRINT("Unknown6() called\n"); + DPRINT("EventLogChangeNotify UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; } @@ -116,7 +117,7 @@ NTSTATUS Unknown6(handle_t BindingHandle) NTSTATUS EventLogOpenW( handle_t BindingHandle, LPWSTR ServerName, - wchar_t *FileName, + wchar_t *LogName, wchar_t *NullStr, unsigned long MajorVer, unsigned long MinorVer, @@ -186,7 +187,9 @@ NTSTATUS EventLogReportEventW( unsigned char *SID, wchar_t *Strings, unsigned char *Data, - unsigned short Flags) + unsigned short Flags, + unsigned long * unknown1, + unsigned long * unknown2) { DPRINT("EventLogReportEventW UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; @@ -225,8 +228,33 @@ NTSTATUS EventLogOpenA( unsigned long MinorVer, PLOGHANDLE Handle) { - DPRINT("EventLogOpenA UNIMPLEMENTED\n"); - return STATUS_NOT_IMPLEMENTED; + UNICODE_STRING logname = {0}, servername={0}; + NTSTATUS status; + + if(LogName && !RtlCreateUnicodeStringFromAsciiz(&logname, LogName)) + { + return STATUS_NO_MEMORY; + } + + if(ServerName && + !RtlCreateUnicodeStringFromAsciiz(&servername, ServerName)) + { + RtlFreeUnicodeString(&servername); + return STATUS_NO_MEMORY; + } + + status = EventLogOpenW(BindingHandle, + servername.Buffer, + logname.Buffer, + L"", + MajorVer, + MinorVer, + Handle); + + RtlFreeUnicodeString(&servername); + RtlFreeUnicodeString(&logname); + + return status; } @@ -289,33 +317,38 @@ NTSTATUS EventLogReportEventA( unsigned char *SID, char* Strings, unsigned char *Data, - unsigned short Flags) + unsigned short Flags, + unsigned long * unknown1, + unsigned long * unknown2) { DPRINT("EventLogReportEventA UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; } -/* FIXME */ -NTSTATUS Unknown19(handle_t BindingHandle) +/* Function 19 */ +NTSTATUS EventLogRegisterClusterSvc( + handle_t BindingHandle) { - DPRINT("Unknown19 called\n"); + DPRINT("EventLogRegisterClusterSvc UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; } + - -/* FIXME */ -NTSTATUS Unknown20(handle_t BindingHandle) +/* Function 20 */ +NTSTATUS EventLogDeregisterClusterSvc( + handle_t BindingHandle) { - DPRINT("Unknown20 called\n"); + DPRINT("EventLogDeregisterClusterSvc UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; } -/* FIXME */ -NTSTATUS Unknown21(handle_t BindingHandle) +/* Function 21 */ +NTSTATUS EventLogWriteClusterEvents( + handle_t BindingHandle) { - DPRINT("Unknown21 called\n"); + DPRINT("EventLogWriteClusterEvents UNIMPLEMENTED\n"); return STATUS_NOT_IMPLEMENTED; } @@ -334,6 +367,16 @@ NTSTATUS EventLogGetInfo( } +/* Function 23 */ +NTSTATUS EventLogFlush( + handle_t BindingHandle) +{ + DbgPrint("EventLogFlush UNIMPLEMENTED\n"); + return STATUS_NOT_IMPLEMENTED; +} + + + void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);