ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

rpc.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.