Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenrpc.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS kernel 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: services/eventlog/rpc.c 00005 * PURPOSE: Event logging service 00006 * COPYRIGHT: Copyright 2005 Saveliy Tretiakov 00007 * Copyright 2008 Michael Martin 00008 */ 00009 00010 /* INCLUDES *****************************************************************/ 00011 00012 #include "eventlog.h" 00013 00014 LIST_ENTRY LogHandleListHead; 00015 00016 /* FUNCTIONS ****************************************************************/ 00017 00018 DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter) 00019 { 00020 RPC_STATUS Status; 00021 00022 InitializeListHead(&LogHandleListHead); 00023 00024 Status = RpcServerUseProtseqEpW(L"ncacn_np", 20, L"\\pipe\\EventLog", NULL); 00025 if (Status != RPC_S_OK) 00026 { 00027 DPRINT("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status); 00028 return 0; 00029 } 00030 00031 Status = RpcServerRegisterIf(eventlog_v0_0_s_ifspec, NULL, NULL); 00032 if (Status != RPC_S_OK) 00033 { 00034 DPRINT("RpcServerRegisterIf() failed (Status %lx)\n", Status); 00035 return 0; 00036 } 00037 00038 Status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, FALSE); 00039 if (Status != RPC_S_OK) 00040 { 00041 DPRINT("RpcServerListen() failed (Status %lx)\n", Status); 00042 } 00043 00044 return 0; 00045 } 00046 00047 00048 static NTSTATUS 00049 ElfCreateEventLogHandle(PLOGHANDLE *LogHandle, 00050 LPCWSTR Name, 00051 BOOL Create) 00052 { 00053 PLOGHANDLE lpLogHandle; 00054 PLOGFILE currentLogFile = NULL; 00055 INT i, LogsActive; 00056 PEVENTSOURCE pEventSource; 00057 NTSTATUS Status = STATUS_SUCCESS; 00058 00059 DPRINT("ElfCreateEventLogHandle(Name: %S)\n", Name); 00060 00061 lpLogHandle = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE) 00062 + ((wcslen(Name) + 1) * sizeof(WCHAR))); 00063 if (!lpLogHandle) 00064 { 00065 DPRINT1("Failed to allocate Heap!\n"); 00066 return STATUS_NO_MEMORY; 00067 } 00068 00069 wcscpy(lpLogHandle->szName, Name); 00070 00071 /* Get the number of Log Files the EventLog service found */ 00072 LogsActive = LogfListItemCount(); 00073 if (LogsActive == 0) 00074 { 00075 DPRINT1("EventLog service reports no log files!\n"); 00076 Status = STATUS_UNSUCCESSFUL; 00077 goto Done; 00078 } 00079 00080 /* If Creating, default to the Application Log in case we fail, as documented on MSDN */ 00081 if (Create == TRUE) 00082 { 00083 pEventSource = GetEventSourceByName(Name); 00084 DPRINT("EventSource: %p\n", pEventSource); 00085 if (pEventSource) 00086 { 00087 DPRINT("EventSource LogFile: %p\n", pEventSource->LogFile); 00088 lpLogHandle->LogFile = pEventSource->LogFile; 00089 } 00090 else 00091 { 00092 DPRINT("EventSource LogFile: Application log file\n"); 00093 lpLogHandle->LogFile = LogfListItemByName(L"Application"); 00094 } 00095 00096 DPRINT("LogHandle LogFile: %p\n", lpLogHandle->LogFile); 00097 } 00098 else 00099 { 00100 lpLogHandle->LogFile = NULL; 00101 00102 for (i = 1; i <= LogsActive; i++) 00103 { 00104 currentLogFile = LogfListItemByIndex(i); 00105 00106 if (_wcsicmp(Name, currentLogFile->LogName) == 0) 00107 { 00108 lpLogHandle->LogFile = LogfListItemByIndex(i); 00109 lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); 00110 break; 00111 } 00112 } 00113 00114 /* Use the application log if the desired log does not exist */ 00115 if (lpLogHandle->LogFile == NULL) 00116 { 00117 lpLogHandle->LogFile = LogfListItemByName(L"Application"); 00118 lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); 00119 } 00120 } 00121 00122 if (!lpLogHandle->LogFile) 00123 Status = STATUS_UNSUCCESSFUL; 00124 00125 Done: 00126 if (NT_SUCCESS(Status)) 00127 { 00128 /* Append log handle */ 00129 InsertTailList(&LogHandleListHead, &lpLogHandle->LogHandleListEntry); 00130 *LogHandle = lpLogHandle; 00131 } 00132 else 00133 { 00134 HeapFree(GetProcessHeap(), 0, lpLogHandle); 00135 } 00136 00137 return Status; 00138 } 00139 00140 00141 static NTSTATUS 00142 ElfCreateBackupLogHandle(PLOGHANDLE *LogHandle, 00143 PUNICODE_STRING FileName) 00144 { 00145 PLOGHANDLE lpLogHandle; 00146 00147 NTSTATUS Status = STATUS_SUCCESS; 00148 00149 DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName); 00150 00151 lpLogHandle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOGHANDLE)); 00152 if (lpLogHandle == NULL) 00153 { 00154 DPRINT1("Failed to allocate Heap!\n"); 00155 return STATUS_NO_MEMORY; 00156 } 00157 00158 /* Create the log file */ 00159 Status = LogfCreate(&lpLogHandle->LogFile, 00160 NULL, 00161 FileName, 00162 FALSE, 00163 TRUE); 00164 if (!NT_SUCCESS(Status)) 00165 { 00166 DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status); 00167 goto Done; 00168 } 00169 00170 /* Set the backup flag */ 00171 lpLogHandle->Flags |= LOG_HANDLE_BACKUP_FILE; 00172 00173 /* Get the current record */ 00174 lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); 00175 00176 Done: 00177 if (NT_SUCCESS(Status)) 00178 { 00179 /* Append log handle */ 00180 InsertTailList(&LogHandleListHead, &lpLogHandle->LogHandleListEntry); 00181 *LogHandle = lpLogHandle; 00182 } 00183 else 00184 { 00185 HeapFree(GetProcessHeap(), 0, lpLogHandle); 00186 } 00187 00188 return Status; 00189 } 00190 00191 00192 PLOGHANDLE ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle) 00193 { 00194 PLOGHANDLE lpLogHandle; 00195 00196 if (IsListEmpty(&LogHandleListHead)) 00197 { 00198 return NULL; 00199 } 00200 00201 lpLogHandle = CONTAINING_RECORD((PLOGHANDLE)EventLogHandle, LOGHANDLE, LogHandleListEntry); 00202 00203 return lpLogHandle; 00204 } 00205 00206 00207 static NTSTATUS 00208 ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle) 00209 { 00210 PLOGHANDLE lpLogHandle = (PLOGHANDLE)EventLogHandle; 00211 00212 if (!ElfGetLogHandleEntryByHandle(lpLogHandle)) 00213 return STATUS_INVALID_HANDLE; 00214 00215 LogfClose(lpLogHandle->LogFile, FALSE); 00216 00217 RemoveEntryList(&lpLogHandle->LogHandleListEntry); 00218 HeapFree(GetProcessHeap(),0,lpLogHandle); 00219 00220 return STATUS_SUCCESS; 00221 } 00222 00223 /* Function 0 */ 00224 NTSTATUS ElfrClearELFW( 00225 IELF_HANDLE LogHandle, 00226 PRPC_UNICODE_STRING BackupFileName) 00227 { 00228 PLOGHANDLE lpLogHandle; 00229 00230 DPRINT("ElfrClearELFW()\n"); 00231 00232 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00233 if (!lpLogHandle) 00234 { 00235 return STATUS_INVALID_HANDLE; 00236 } 00237 00238 return LogfClearFile(lpLogHandle->LogFile, 00239 (PUNICODE_STRING)BackupFileName); 00240 } 00241 00242 00243 /* Function 1 */ 00244 NTSTATUS ElfrBackupELFW( 00245 IELF_HANDLE LogHandle, 00246 PRPC_UNICODE_STRING BackupFileName) 00247 { 00248 PLOGHANDLE lpLogHandle; 00249 00250 DPRINT("ElfrBackupELFW()\n"); 00251 00252 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00253 if (!lpLogHandle) 00254 { 00255 return STATUS_INVALID_HANDLE; 00256 } 00257 00258 return LogfBackupFile(lpLogHandle->LogFile, 00259 (PUNICODE_STRING)BackupFileName); 00260 } 00261 00262 00263 /* Function 2 */ 00264 NTSTATUS ElfrCloseEL( 00265 IELF_HANDLE *LogHandle) 00266 { 00267 return ElfDeleteEventLogHandle(*LogHandle); 00268 } 00269 00270 00271 /* Function 3 */ 00272 NTSTATUS ElfrDeregisterEventSource( 00273 IELF_HANDLE *LogHandle) 00274 { 00275 return ElfDeleteEventLogHandle(*LogHandle); 00276 } 00277 00278 00279 /* Function 4 */ 00280 NTSTATUS ElfrNumberOfRecords( 00281 IELF_HANDLE LogHandle, 00282 DWORD *NumberOfRecords) 00283 { 00284 PLOGHANDLE lpLogHandle; 00285 PLOGFILE lpLogFile; 00286 00287 DPRINT("ElfrNumberOfRecords()"); 00288 00289 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00290 if (!lpLogHandle) 00291 { 00292 return STATUS_INVALID_HANDLE; 00293 } 00294 00295 lpLogFile = lpLogHandle->LogFile; 00296 00297 DPRINT("Oldest: %lu Current: %lu\n", 00298 lpLogFile->Header.OldestRecordNumber, 00299 lpLogFile->Header.CurrentRecordNumber); 00300 00301 *NumberOfRecords = lpLogFile->Header.CurrentRecordNumber - 00302 lpLogFile->Header.OldestRecordNumber; 00303 00304 return STATUS_SUCCESS; 00305 } 00306 00307 00308 /* Function 5 */ 00309 NTSTATUS ElfrOldestRecord( 00310 IELF_HANDLE LogHandle, 00311 DWORD *OldestRecordNumber) 00312 { 00313 PLOGHANDLE lpLogHandle; 00314 00315 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00316 if (!lpLogHandle) 00317 { 00318 return STATUS_INVALID_HANDLE; 00319 } 00320 00321 if (!OldestRecordNumber) 00322 { 00323 return STATUS_INVALID_PARAMETER; 00324 } 00325 00326 *OldestRecordNumber = LogfGetOldestRecord(lpLogHandle->LogFile); 00327 00328 return STATUS_SUCCESS; 00329 } 00330 00331 00332 /* Function 6 */ 00333 NTSTATUS ElfrChangeNotify( 00334 IELF_HANDLE *LogHandle, 00335 RPC_CLIENT_ID ClientId, 00336 DWORD Event) 00337 { 00338 DPRINT("ElfrChangeNotify()"); 00339 00340 UNIMPLEMENTED; 00341 return STATUS_NOT_IMPLEMENTED; 00342 } 00343 00344 00345 /* Function 7 */ 00346 NTSTATUS ElfrOpenELW( 00347 EVENTLOG_HANDLE_W UNCServerName, 00348 PRPC_UNICODE_STRING ModuleName, 00349 PRPC_UNICODE_STRING RegModuleName, 00350 DWORD MajorVersion, 00351 DWORD MinorVersion, 00352 IELF_HANDLE *LogHandle) 00353 { 00354 if ((MajorVersion != 1) || (MinorVersion != 1)) 00355 return STATUS_INVALID_PARAMETER; 00356 00357 /* RegModuleName must be an empty string */ 00358 if (RegModuleName->Length > 0) 00359 return STATUS_INVALID_PARAMETER; 00360 00361 /*FIXME: UNCServerName must specify the server */ 00362 00363 /*FIXME: Must verify that caller has read access */ 00364 00365 return ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, 00366 ModuleName->Buffer, 00367 FALSE); 00368 } 00369 00370 00371 /* Function 8 */ 00372 NTSTATUS ElfrRegisterEventSourceW( 00373 EVENTLOG_HANDLE_W UNCServerName, 00374 PRPC_UNICODE_STRING ModuleName, 00375 PRPC_UNICODE_STRING RegModuleName, 00376 DWORD MajorVersion, 00377 DWORD MinorVersion, 00378 IELF_HANDLE *LogHandle) 00379 { 00380 DPRINT("ElfrRegisterEventSourceW()\n"); 00381 00382 if ((MajorVersion != 1) || (MinorVersion != 1)) 00383 return STATUS_INVALID_PARAMETER; 00384 00385 /* RegModuleName must be an empty string */ 00386 if (RegModuleName->Length > 0) 00387 return STATUS_INVALID_PARAMETER; 00388 00389 DPRINT("ModuleName: %S\n", ModuleName->Buffer); 00390 00391 /*FIXME: UNCServerName must specify the server or empty for local */ 00392 00393 /*FIXME: Must verify that caller has write access */ 00394 00395 return ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, 00396 ModuleName->Buffer, 00397 TRUE); 00398 } 00399 00400 00401 /* Function 9 */ 00402 NTSTATUS ElfrOpenBELW( 00403 EVENTLOG_HANDLE_W UNCServerName, 00404 PRPC_UNICODE_STRING BackupFileName, 00405 DWORD MajorVersion, 00406 DWORD MinorVersion, 00407 IELF_HANDLE *LogHandle) 00408 { 00409 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName); 00410 00411 if ((MajorVersion != 1) || (MinorVersion != 1)) 00412 return STATUS_INVALID_PARAMETER; 00413 00414 /*FIXME: UNCServerName must specify the server */ 00415 00416 /*FIXME: Must verify that caller has read access */ 00417 00418 return ElfCreateBackupLogHandle((PLOGHANDLE *)LogHandle, 00419 (PUNICODE_STRING)BackupFileName); 00420 } 00421 00422 00423 /* Function 10 */ 00424 NTSTATUS ElfrReadELW( 00425 IELF_HANDLE LogHandle, 00426 DWORD ReadFlags, 00427 DWORD RecordOffset, 00428 RULONG NumberOfBytesToRead, 00429 BYTE *Buffer, 00430 DWORD *NumberOfBytesRead, 00431 DWORD *MinNumberOfBytesNeeded) 00432 { 00433 PLOGHANDLE lpLogHandle; 00434 DWORD dwError; 00435 DWORD RecordNumber; 00436 00437 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00438 if (!lpLogHandle) 00439 { 00440 return STATUS_INVALID_HANDLE; 00441 } 00442 00443 if (!Buffer) 00444 return STATUS_INVALID_PARAMETER; 00445 00446 /* If sequential read, retrieve the CurrentRecord from this log handle */ 00447 if (ReadFlags & EVENTLOG_SEQUENTIAL_READ) 00448 { 00449 RecordNumber = lpLogHandle->CurrentRecord; 00450 } 00451 else 00452 { 00453 RecordNumber = RecordOffset; 00454 } 00455 00456 dwError = LogfReadEvent(lpLogHandle->LogFile, ReadFlags, &RecordNumber, 00457 NumberOfBytesToRead, Buffer, NumberOfBytesRead, MinNumberOfBytesNeeded, 00458 FALSE); 00459 00460 /* Update the handles CurrentRecord if success*/ 00461 if (dwError == ERROR_SUCCESS) 00462 { 00463 lpLogHandle->CurrentRecord = RecordNumber; 00464 } 00465 00466 /* HACK!!! */ 00467 if (dwError == ERROR_HANDLE_EOF) 00468 return STATUS_END_OF_FILE; 00469 00470 return I_RpcMapWin32Status(dwError); 00471 } 00472 00473 00474 /* Function 11 */ 00475 NTSTATUS ElfrReportEventW( 00476 IELF_HANDLE LogHandle, 00477 DWORD Time, 00478 USHORT EventType, 00479 USHORT EventCategory, 00480 DWORD EventID, 00481 USHORT NumStrings, 00482 DWORD DataSize, 00483 PRPC_UNICODE_STRING ComputerName, 00484 PRPC_SID UserSID, 00485 PRPC_UNICODE_STRING Strings[], 00486 BYTE *Data, 00487 USHORT Flags, 00488 DWORD *RecordNumber, 00489 DWORD *TimeWritten) 00490 { 00491 USHORT i; 00492 PBYTE LogBuffer; 00493 PLOGHANDLE lpLogHandle; 00494 DWORD lastRec; 00495 DWORD recSize; 00496 DWORD dwStringsSize = 0; 00497 DWORD dwUserSidLength = 0; 00498 DWORD dwError = ERROR_SUCCESS; 00499 WCHAR *lpStrings; 00500 int pos = 0; 00501 00502 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00503 if (!lpLogHandle) 00504 { 00505 return STATUS_INVALID_HANDLE; 00506 } 00507 00508 /* Flags must be 0 */ 00509 if (Flags) 00510 { 00511 return STATUS_INVALID_PARAMETER; 00512 } 00513 00514 lastRec = LogfGetCurrentRecord(lpLogHandle->LogFile); 00515 00516 for (i = 0; i < NumStrings; i++) 00517 { 00518 switch (EventType) 00519 { 00520 case EVENTLOG_SUCCESS: 00521 DPRINT("Success: %wZ\n", Strings[i]); 00522 break; 00523 00524 case EVENTLOG_ERROR_TYPE: 00525 DPRINT("Error: %wZ\n", Strings[i]); 00526 break; 00527 00528 case EVENTLOG_WARNING_TYPE: 00529 DPRINT("Warning: %wZ\n", Strings[i]); 00530 break; 00531 00532 case EVENTLOG_INFORMATION_TYPE: 00533 DPRINT("Info: %wZ\n", Strings[i]); 00534 break; 00535 00536 case EVENTLOG_AUDIT_SUCCESS: 00537 DPRINT("Audit Success: %wZ\n", Strings[i]); 00538 break; 00539 00540 case EVENTLOG_AUDIT_FAILURE: 00541 DPRINT("Audit Failure: %wZ\n", Strings[i]); 00542 break; 00543 00544 default: 00545 DPRINT1("Type %hu: %wZ\n", EventType, Strings[i]); 00546 break; 00547 } 00548 dwStringsSize += Strings[i]->Length + sizeof UNICODE_NULL; 00549 } 00550 00551 lpStrings = HeapAlloc(GetProcessHeap(), 0, dwStringsSize); 00552 if (!lpStrings) 00553 { 00554 DPRINT1("Failed to allocate heap\n"); 00555 return STATUS_NO_MEMORY; 00556 } 00557 00558 for (i = 0; i < NumStrings; i++) 00559 { 00560 CopyMemory(lpStrings + pos, Strings[i]->Buffer, Strings[i]->Length); 00561 pos += Strings[i]->Length / sizeof(WCHAR); 00562 lpStrings[pos] = UNICODE_NULL; 00563 pos += sizeof UNICODE_NULL / sizeof(WCHAR); 00564 } 00565 00566 if (UserSID) 00567 dwUserSidLength = FIELD_OFFSET(SID, SubAuthority[UserSID->SubAuthorityCount]); 00568 LogBuffer = LogfAllocAndBuildNewRecord(&recSize, 00569 lastRec, 00570 EventType, 00571 EventCategory, 00572 EventID, 00573 lpLogHandle->szName, 00574 ComputerName->Buffer, 00575 dwUserSidLength, 00576 UserSID, 00577 NumStrings, 00578 lpStrings, 00579 DataSize, 00580 Data); 00581 00582 dwError = LogfWriteData(lpLogHandle->LogFile, recSize, LogBuffer); 00583 if (!dwError) 00584 { 00585 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle->LogFile->FileName); 00586 } 00587 00588 LogfFreeRecord(LogBuffer); 00589 00590 HeapFree(GetProcessHeap(), 0, lpStrings); 00591 00592 return I_RpcMapWin32Status(dwError); 00593 } 00594 00595 00596 /* Function 12 */ 00597 NTSTATUS ElfrClearELFA( 00598 IELF_HANDLE LogHandle, 00599 PRPC_STRING BackupFileName) 00600 { 00601 UNICODE_STRING BackupFileNameW; 00602 NTSTATUS Status; 00603 00604 Status = RtlAnsiStringToUnicodeString(&BackupFileNameW, 00605 (PANSI_STRING)BackupFileName, 00606 TRUE); 00607 if (!NT_SUCCESS(Status)) 00608 return Status; 00609 00610 Status = ElfrClearELFW(LogHandle, 00611 (PRPC_UNICODE_STRING)&BackupFileNameW); 00612 00613 RtlFreeUnicodeString(&BackupFileNameW); 00614 00615 return Status; 00616 } 00617 00618 00619 /* Function 13 */ 00620 NTSTATUS ElfrBackupELFA( 00621 IELF_HANDLE LogHandle, 00622 PRPC_STRING BackupFileName) 00623 { 00624 UNICODE_STRING BackupFileNameW; 00625 NTSTATUS Status; 00626 00627 Status = RtlAnsiStringToUnicodeString(&BackupFileNameW, 00628 (PANSI_STRING)BackupFileName, 00629 TRUE); 00630 if (!NT_SUCCESS(Status)) 00631 return Status; 00632 00633 Status = ElfrBackupELFW(LogHandle, 00634 (PRPC_UNICODE_STRING)&BackupFileNameW); 00635 00636 RtlFreeUnicodeString(&BackupFileNameW); 00637 00638 return Status; 00639 } 00640 00641 00642 /* Function 14 */ 00643 NTSTATUS ElfrOpenELA( 00644 EVENTLOG_HANDLE_A UNCServerName, 00645 PRPC_STRING ModuleName, 00646 PRPC_STRING RegModuleName, 00647 DWORD MajorVersion, 00648 DWORD MinorVersion, 00649 IELF_HANDLE *LogHandle) 00650 { 00651 UNICODE_STRING ModuleNameW; 00652 NTSTATUS Status; 00653 00654 if ((MajorVersion != 1) || (MinorVersion != 1)) 00655 return STATUS_INVALID_PARAMETER; 00656 00657 /* RegModuleName must be an empty string */ 00658 if (RegModuleName->Length > 0) 00659 return STATUS_INVALID_PARAMETER; 00660 00661 Status = RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE); 00662 if (!NT_SUCCESS(Status)) 00663 return Status; 00664 00665 /* FIXME: Must verify that caller has read access */ 00666 00667 Status = ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, 00668 ModuleNameW.Buffer, 00669 FALSE); 00670 00671 RtlFreeUnicodeString(&ModuleNameW); 00672 00673 return Status; 00674 } 00675 00676 00677 /* Function 15 */ 00678 NTSTATUS ElfrRegisterEventSourceA( 00679 EVENTLOG_HANDLE_A UNCServerName, 00680 PRPC_STRING ModuleName, 00681 PRPC_STRING RegModuleName, 00682 DWORD MajorVersion, 00683 DWORD MinorVersion, 00684 IELF_HANDLE *LogHandle) 00685 { 00686 UNICODE_STRING ModuleNameW; 00687 NTSTATUS Status; 00688 00689 Status = RtlAnsiStringToUnicodeString(&ModuleNameW, 00690 (PANSI_STRING)ModuleName, 00691 TRUE); 00692 if (!NT_SUCCESS(Status)) 00693 { 00694 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status); 00695 return Status; 00696 } 00697 00698 /* RegModuleName must be an empty string */ 00699 if (RegModuleName->Length > 0) 00700 { 00701 RtlFreeUnicodeString(&ModuleNameW); 00702 return STATUS_INVALID_PARAMETER; 00703 } 00704 00705 if ((MajorVersion != 1) || (MinorVersion != 1)) 00706 { 00707 RtlFreeUnicodeString(&ModuleNameW); 00708 return STATUS_INVALID_PARAMETER; 00709 } 00710 00711 /* FIXME: Must verify that caller has write access */ 00712 00713 Status = ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, 00714 ModuleNameW.Buffer, 00715 TRUE); 00716 00717 RtlFreeUnicodeString(&ModuleNameW); 00718 00719 return Status; 00720 } 00721 00722 00723 /* Function 16 */ 00724 NTSTATUS ElfrOpenBELA( 00725 EVENTLOG_HANDLE_A UNCServerName, 00726 PRPC_STRING BackupFileName, 00727 DWORD MajorVersion, 00728 DWORD MinorVersion, 00729 IELF_HANDLE *LogHandle) 00730 { 00731 UNICODE_STRING BackupFileNameW; 00732 NTSTATUS Status; 00733 00734 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName); 00735 00736 Status = RtlAnsiStringToUnicodeString(&BackupFileNameW, 00737 (PANSI_STRING)BackupFileName, 00738 TRUE); 00739 if (!NT_SUCCESS(Status)) 00740 { 00741 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status); 00742 return Status; 00743 } 00744 00745 if ((MajorVersion != 1) || (MinorVersion != 1)) 00746 { 00747 RtlFreeUnicodeString(&BackupFileNameW); 00748 return STATUS_INVALID_PARAMETER; 00749 } 00750 00751 /*FIXME: UNCServerName must specify the server */ 00752 00753 /*FIXME: Must verify that caller has read access */ 00754 00755 Status = ElfCreateBackupLogHandle((PLOGHANDLE *)LogHandle, 00756 &BackupFileNameW); 00757 00758 RtlFreeUnicodeString(&BackupFileNameW); 00759 00760 return Status; 00761 } 00762 00763 00764 /* Function 17 */ 00765 NTSTATUS ElfrReadELA( 00766 IELF_HANDLE LogHandle, 00767 DWORD ReadFlags, 00768 DWORD RecordOffset, 00769 RULONG NumberOfBytesToRead, 00770 BYTE *Buffer, 00771 DWORD *NumberOfBytesRead, 00772 DWORD *MinNumberOfBytesNeeded) 00773 { 00774 PLOGHANDLE lpLogHandle; 00775 DWORD dwError; 00776 DWORD RecordNumber; 00777 00778 lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); 00779 if (!lpLogHandle) 00780 { 00781 return STATUS_INVALID_HANDLE; 00782 } 00783 00784 if (!Buffer) 00785 return STATUS_INVALID_PARAMETER; 00786 00787 /* If sequential read, retrieve the CurrentRecord from this log handle */ 00788 if (ReadFlags & EVENTLOG_SEQUENTIAL_READ) 00789 { 00790 RecordNumber = lpLogHandle->CurrentRecord; 00791 } 00792 else 00793 { 00794 RecordNumber = RecordOffset; 00795 } 00796 00797 dwError = LogfReadEvent(lpLogHandle->LogFile, 00798 ReadFlags, 00799 &RecordNumber, 00800 NumberOfBytesToRead, 00801 Buffer, 00802 NumberOfBytesRead, 00803 MinNumberOfBytesNeeded, 00804 TRUE); 00805 00806 /* Update the handles CurrentRecord if success*/ 00807 if (dwError == ERROR_SUCCESS) 00808 { 00809 lpLogHandle->CurrentRecord = RecordNumber; 00810 } 00811 00812 /* HACK!!! */ 00813 if (dwError == ERROR_HANDLE_EOF) 00814 return STATUS_END_OF_FILE; 00815 00816 return I_RpcMapWin32Status(dwError); 00817 } 00818 00819 00820 /* Function 18 */ 00821 NTSTATUS ElfrReportEventA( 00822 IELF_HANDLE LogHandle, 00823 DWORD Time, 00824 USHORT EventType, 00825 USHORT EventCategory, 00826 DWORD EventID, 00827 USHORT NumStrings, 00828 DWORD DataSize, 00829 PRPC_STRING ComputerName, 00830 PRPC_SID UserSID, 00831 PRPC_STRING Strings[], 00832 BYTE *Data, 00833 USHORT Flags, 00834 DWORD *RecordNumber, 00835 DWORD *TimeWritten) 00836 { 00837 UNICODE_STRING ComputerNameW; 00838 PUNICODE_STRING *StringsArrayW = NULL; 00839 NTSTATUS Status = STATUS_SUCCESS; 00840 USHORT i; 00841 00842 DPRINT("ElfrReportEventA(%hu)\n", NumStrings); 00843 00844 #if 0 00845 for (i = 0; i < NumStrings; i++) 00846 { 00847 if (Strings[i] == NULL) 00848 { 00849 DPRINT1("String %hu is null\n", i); 00850 } 00851 else 00852 { 00853 DPRINT1("String %hu: %Z\n", i, Strings[i]); 00854 } 00855 } 00856 #endif 00857 00858 Status = RtlAnsiStringToUnicodeString((PUNICODE_STRING)&ComputerNameW, 00859 (PANSI_STRING)ComputerName, 00860 TRUE); 00861 if (!NT_SUCCESS(Status)) 00862 return Status; 00863 00864 if (NumStrings != 0) 00865 { 00866 StringsArrayW = HeapAlloc(MyHeap, 00867 HEAP_ZERO_MEMORY, 00868 NumStrings * sizeof (PUNICODE_STRING)); 00869 if (StringsArrayW == NULL) 00870 { 00871 Status = STATUS_NO_MEMORY; 00872 goto Done; 00873 } 00874 00875 for (i = 0; i < NumStrings; i++) 00876 { 00877 if (Strings[i] != NULL) 00878 { 00879 StringsArrayW[i] = HeapAlloc(MyHeap, 00880 HEAP_ZERO_MEMORY, 00881 sizeof(UNICODE_STRING)); 00882 if (StringsArrayW[i] == NULL) 00883 { 00884 Status = STATUS_NO_MEMORY; 00885 break; 00886 } 00887 00888 Status = RtlAnsiStringToUnicodeString(StringsArrayW[i], 00889 (PANSI_STRING)Strings[i], 00890 TRUE); 00891 } 00892 00893 if (!NT_SUCCESS(Status)) 00894 break; 00895 } 00896 } 00897 00898 if (NT_SUCCESS(Status)) 00899 { 00900 Status = ElfrReportEventW(LogHandle, 00901 Time, 00902 EventType, 00903 EventCategory, 00904 EventID, 00905 NumStrings, 00906 DataSize, 00907 (PRPC_UNICODE_STRING)&ComputerNameW, 00908 UserSID, 00909 (PRPC_UNICODE_STRING*)StringsArrayW, 00910 Data, 00911 Flags, 00912 RecordNumber, 00913 TimeWritten); 00914 } 00915 00916 Done: 00917 for (i = 0; i < NumStrings; i++) 00918 { 00919 if (StringsArrayW[i] != NULL) 00920 { 00921 if (StringsArrayW[i]->Buffer) 00922 { 00923 RtlFreeUnicodeString(StringsArrayW[i]); 00924 HeapFree(MyHeap, 0, StringsArrayW[i]); 00925 } 00926 } 00927 } 00928 00929 if (StringsArrayW != NULL) 00930 HeapFree(MyHeap, 0, StringsArrayW); 00931 00932 RtlFreeUnicodeString(&ComputerNameW); 00933 00934 return Status; 00935 } 00936 00937 00938 /* Function 19 */ 00939 NTSTATUS ElfrRegisterClusterSvc( 00940 handle_t BindingHandle) 00941 { 00942 UNIMPLEMENTED; 00943 return STATUS_NOT_IMPLEMENTED; 00944 } 00945 00946 00947 /* Function 20 */ 00948 NTSTATUS ElfrDeregisterClusterSvc( 00949 handle_t BindingHandle) 00950 { 00951 UNIMPLEMENTED; 00952 return STATUS_NOT_IMPLEMENTED; 00953 } 00954 00955 00956 /* Function 21 */ 00957 NTSTATUS ElfrWriteClusterEvents( 00958 handle_t BindingHandle) 00959 { 00960 UNIMPLEMENTED; 00961 return STATUS_NOT_IMPLEMENTED; 00962 } 00963 00964 00965 /* Function 22 */ 00966 NTSTATUS ElfrGetLogInformation( 00967 IELF_HANDLE LogHandle, 00968 DWORD InfoLevel, 00969 BYTE *Buffer, 00970 DWORD cbBufSize, 00971 DWORD *pcbBytesNeeded) 00972 { 00973 NTSTATUS Status = STATUS_SUCCESS; 00974 00975 /* FIXME: check handle first */ 00976 00977 switch (InfoLevel) 00978 { 00979 case EVENTLOG_FULL_INFO: 00980 { 00981 LPEVENTLOG_FULL_INFORMATION efi = (LPEVENTLOG_FULL_INFORMATION)Buffer; 00982 00983 *pcbBytesNeeded = sizeof(EVENTLOG_FULL_INFORMATION); 00984 if (cbBufSize < sizeof(EVENTLOG_FULL_INFORMATION)) 00985 { 00986 return STATUS_BUFFER_TOO_SMALL; 00987 } 00988 00989 efi->dwFull = 0; /* FIXME */ 00990 } 00991 break; 00992 00993 default: 00994 Status = STATUS_INVALID_LEVEL; 00995 break; 00996 } 00997 00998 return Status; 00999 } 01000 01001 01002 /* Function 23 */ 01003 NTSTATUS ElfrFlushEL( 01004 IELF_HANDLE LogHandle) 01005 { 01006 UNIMPLEMENTED; 01007 return STATUS_NOT_IMPLEMENTED; 01008 } 01009 01010 01011 /* Function 24 */ 01012 NTSTATUS ElfrReportEventAndSourceW( 01013 IELF_HANDLE LogHandle, 01014 DWORD Time, 01015 USHORT EventType, 01016 USHORT EventCategory, 01017 ULONG EventID, 01018 PRPC_UNICODE_STRING SourceName, 01019 USHORT NumStrings, 01020 DWORD DataSize, 01021 PRPC_UNICODE_STRING ComputerName, 01022 PRPC_SID UserSID, 01023 PRPC_UNICODE_STRING Strings[], 01024 BYTE *Data, 01025 USHORT Flags, 01026 DWORD *RecordNumber, 01027 DWORD *TimeWritten) 01028 { 01029 UNIMPLEMENTED; 01030 return STATUS_NOT_IMPLEMENTED; 01031 } 01032 01033 01034 void __RPC_FAR *__RPC_USER midl_user_allocate(SIZE_T len) 01035 { 01036 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); 01037 } 01038 01039 01040 void __RPC_USER midl_user_free(void __RPC_FAR * ptr) 01041 { 01042 HeapFree(GetProcessHeap(), 0, ptr); 01043 } 01044 01045 01046 void __RPC_USER IELF_HANDLE_rundown(IELF_HANDLE LogHandle) 01047 { 01048 } Generated on Thu May 24 2012 04:17:53 for ReactOS by
1.7.6.1
|