c34e60bc3a71a0b5f5693ba3cd8cd61b15473bce
[reactos.git] / reactos / ntoskrnl / rtl / message.c
1 /* $Id: message.c,v 1.1 2001/06/01 17:13:24 ekohl Exp $
2 *
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>
8 * REVISION HISTORY:
9 * 29/05/2001: Created
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15
16 #define NDEBUG
17 #include <internal/debug.h>
18
19
20 /* FUNCTIONS *****************************************************************/
21
22 NTSTATUS STDCALL
23 RtlFindMessage(PVOID BaseAddress,
24 ULONG Type,
25 ULONG Language,
26 ULONG MessageId,
27 PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry)
28 {
29 LDR_RESOURCE_INFO ResourceInfo;
30 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
31 PRTL_MESSAGE_RESOURCE_DATA MessageTable;
32 NTSTATUS Status;
33 ULONG EntryOffset, IdOffset;
34 PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry;
35
36 ULONG i;
37
38 DPRINT("RtlFindMessage()\n");
39
40 ResourceInfo.Type = Type;
41 ResourceInfo.Name = 1;
42 ResourceInfo.Language = Language;
43
44 Status = LdrFindResource_U(BaseAddress,
45 &ResourceInfo,
46 RESOURCE_DATA_LEVEL,
47 &ResourceDataEntry);
48 if (!NT_SUCCESS(Status))
49 {
50 return(Status);
51 }
52
53 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
54
55 Status = LdrAccessResource(BaseAddress,
56 ResourceDataEntry,
57 (PVOID*)&MessageTable,
58 NULL);
59 if (!NT_SUCCESS(Status))
60 {
61 return(Status);
62 }
63
64 DPRINT("MessageTable: %p\n", MessageTable);
65
66 DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks);
67 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
68 {
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);
73 }
74
75 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
76 {
77 if ((MessageId >= MessageTable->Blocks[i].LowId) &&
78 (MessageId <= MessageTable->Blocks[i].HighId))
79 {
80 EntryOffset = MessageTable->Blocks[i].OffsetToEntries;
81 IdOffset = MessageId - MessageTable->Blocks[i].LowId;
82 break;
83 }
84
85 if (MessageId < MessageTable->Blocks[i].LowId)
86 {
87 return STATUS_MESSAGE_NOT_FOUND;
88 }
89 }
90
91 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((ULONG)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
92
93 DPRINT("EntryOffset 0x%08lx\n", EntryOffset);
94 DPRINT("IdOffset 0x%08lx\n", IdOffset);
95
96 DPRINT("MessageEntry: %p\n", MessageEntry);
97 for (i = 0; i < IdOffset; i++)
98 {
99 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)(MessageEntry + (ULONG)MessageEntry->Length);
100 }
101
102 if (MessageEntry->Flags == 0)
103 {
104 DPRINT("AnsiText: %s\n", MessageEntry->Text);
105 }
106 else
107 {
108 DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text);
109 }
110
111 if (MessageResourceEntry != NULL);
112 {
113 *MessageResourceEntry = MessageEntry;
114 }
115
116 return(STATUS_SUCCESS);
117 }
118
119 /* EOF */