3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Message table functions
6 * FILE: ntoskrnl/rtl/message.c
7 * PROGRAMER: Eric Kohl <ekohl@zr-online.de>
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
17 #include <internal/debug.h>
20 /* FUNCTIONS *****************************************************************/
23 RtlFindMessage(PVOID BaseAddress,
27 PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry)
29 LDR_RESOURCE_INFO ResourceInfo;
30 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
31 PRTL_MESSAGE_RESOURCE_DATA MessageTable;
33 ULONG EntryOffset, IdOffset = 0;
34 PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry;
38 DPRINT("RtlFindMessage()\n");
40 ResourceInfo.Type = Type;
41 ResourceInfo.Name = 1;
42 ResourceInfo.Language = Language;
44 Status = LdrFindResource_U(BaseAddress,
48 if (!NT_SUCCESS(Status))
53 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
55 Status = LdrAccessResource(BaseAddress,
57 (PVOID*)&MessageTable,
59 if (!NT_SUCCESS(Status))
64 DPRINT("MessageTable: %p\n", MessageTable);
66 DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks);
67 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
69 DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n",
70 MessageTable->Blocks[i].LowId,
71 MessageTable->Blocks[i].HighId,
72 MessageTable->Blocks[i].OffsetToEntries);
75 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
77 if ((MessageId >= MessageTable->Blocks[i].LowId) &&
78 (MessageId <= MessageTable->Blocks[i].HighId))
80 EntryOffset = MessageTable->Blocks[i].OffsetToEntries;
81 IdOffset = MessageId - MessageTable->Blocks[i].LowId;
85 if (MessageId < MessageTable->Blocks[i].LowId)
87 return STATUS_MESSAGE_NOT_FOUND;
91 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
93 DPRINT("EntryOffset 0x%08lx\n", EntryOffset);
94 DPRINT("IdOffset 0x%08lx\n", IdOffset);
96 DPRINT("MessageEntry: %p\n", MessageEntry);
97 for (i = 0; i < IdOffset; i++)
99 DPRINT("MessageEntry %d: %p\n", i, MessageEntry);
100 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length);
102 DPRINT("MessageEntry: %p\n", MessageEntry);
103 DPRINT("Flags: %hx\n", MessageEntry->Flags);
104 DPRINT("Length: %hu\n", MessageEntry->Length);
106 if (MessageEntry->Flags == 0)
108 DPRINT("AnsiText: %s\n", MessageEntry->Text);
112 DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text);
115 if (MessageResourceEntry != NULL);
117 *MessageResourceEntry = MessageEntry;
120 return(STATUS_SUCCESS);