Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/rtl/message.c * PURPOSE: Message table functions * PROGRAMMERS: Eric Kohl */
/* INCLUDES *****************************************************************/
#include <rtl.h>
#define NDEBUG#include <debug.h>
/* FUNCTIONS *****************************************************************/
/* * @implemented */NTSTATUSNTAPIRtlFindMessage( IN PVOID BaseAddress, IN ULONG Type, IN ULONG Language, IN ULONG MessageId, OUT PMESSAGE_RESOURCE_ENTRY* MessageResourceEntry){ LDR_RESOURCE_INFO ResourceInfo; PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; PMESSAGE_RESOURCE_DATA MessageTable; NTSTATUS Status; ULONG EntryOffset = 0, IdOffset = 0; PMESSAGE_RESOURCE_ENTRY MessageEntry; ULONG i;
DPRINT("RtlFindMessage()\n");
ResourceInfo.Type = Type; ResourceInfo.Name = 1; ResourceInfo.Language = Language;
Status = LdrFindResource_U(BaseAddress, &ResourceInfo, RESOURCE_DATA_LEVEL, &ResourceDataEntry); if (!NT_SUCCESS(Status)) { return Status; }
DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
Status = LdrAccessResource(BaseAddress, ResourceDataEntry, (PVOID*)&MessageTable, NULL); if (!NT_SUCCESS(Status)) { return Status; }
DPRINT("MessageTable: %p\n", MessageTable);
DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); for (i = 0; i < MessageTable->NumberOfBlocks; i++) { DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", MessageTable->Blocks[i].LowId, MessageTable->Blocks[i].HighId, MessageTable->Blocks[i].OffsetToEntries); }
for (i = 0; i < MessageTable->NumberOfBlocks; i++) { if ((MessageId >= MessageTable->Blocks[i].LowId) && (MessageId <= MessageTable->Blocks[i].HighId)) { EntryOffset = MessageTable->Blocks[i].OffsetToEntries; IdOffset = MessageId - MessageTable->Blocks[i].LowId; break; }
if (MessageId < MessageTable->Blocks[i].LowId) { return STATUS_MESSAGE_NOT_FOUND; } }
if (MessageTable->NumberOfBlocks <= i) { return STATUS_MESSAGE_NOT_FOUND; }
MessageEntry = (PMESSAGE_RESOURCE_ENTRY) ((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
DPRINT("EntryOffset 0x%08lx\n", EntryOffset); DPRINT("IdOffset 0x%08lx\n", IdOffset);
DPRINT("MessageEntry: %p\n", MessageEntry); for (i = 0; i < IdOffset; i++) { MessageEntry = (PMESSAGE_RESOURCE_ENTRY) ((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); }
if (MessageEntry->Flags == 0) { DPRINT("AnsiText: %s\n", MessageEntry->Text); } else { DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); }
if (MessageResourceEntry != NULL) { *MessageResourceEntry = MessageEntry; }
return STATUS_SUCCESS;}
/* * @unimplemented */NTSTATUSNTAPIRtlFormatMessageEx( IN PWSTR Message, IN ULONG MaxWidth OPTIONAL, IN BOOLEAN IgnoreInserts, IN BOOLEAN ArgumentsAreAnsi, IN BOOLEAN ArgumentsAreAnArray, IN va_list* Arguments, OUT PWSTR Buffer, IN ULONG BufferSize, OUT PULONG ReturnLength OPTIONAL, IN ULONG Flags){ DPRINT1("RtlFormatMessage(%S, %lu, %s, %s, %s, %p, %p, %lu, %p, %lx)\n", Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", ArgumentsAreAnsi ? "TRUE" : "FALSE", ArgumentsAreAnArray ? "TRUE" : "FALSE", Arguments, Buffer, BufferSize, ReturnLength, Flags);
UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED;}
/********************************************************************** * RtlFormatMessage (NTDLL.@) * * Formats a message (similar to sprintf). * * PARAMS * Message [I] Message to format. * MaxWidth [I] Maximum width in characters of each output line (optional). * IgnoreInserts [I] Whether to copy the message without processing inserts. * ArgumentsAreAnsi [I] Whether Arguments may have ANSI strings. * ArgumentsAreAnArray [I] Whether Arguments is actually an array rather than a va_list *. * Arguments [I] * Buffer [O] Buffer to store processed message in. * BufferSize [I] Size of Buffer (in bytes). * ReturnLength [O] Size of the formatted message (in bytes; optional). * * RETURNS * NTSTATUS code. * * @implemented */NTSTATUSNTAPIRtlFormatMessage( IN PWSTR Message, IN ULONG MaxWidth OPTIONAL, IN BOOLEAN IgnoreInserts, IN BOOLEAN ArgumentsAreAnsi, IN BOOLEAN ArgumentsAreAnArray, IN va_list* Arguments, OUT PWSTR Buffer, IN ULONG BufferSize, OUT PULONG ReturnLength OPTIONAL){ /* Call the extended API */ return RtlFormatMessageEx(Message, MaxWidth, IgnoreInserts, ArgumentsAreAnsi, ArgumentsAreAnArray, Arguments, Buffer, BufferSize, ReturnLength, 0);}
/* EOF */