Removed outdated email addresses.
[reactos.git] / reactos / lib / rtl / message.c
1 /* COPYRIGHT: See COPYING in the top level directory
2 * PROJECT: ReactOS system libraries
3 * FILE: lib/rtl/message.c
4 * PURPOSE: Message table functions
5 * PROGRAMMERS: Eric Kohl
6 */
7
8 /* INCLUDES *****************************************************************/
9
10 #include <rtl.h>
11
12 #define NDEBUG
13 #include <debug.h>
14
15 /* FUNCTIONS *****************************************************************/
16
17 /*
18 * @implemented
19 */
20 NTSTATUS NTAPI
21 RtlFindMessage(PVOID BaseAddress,
22 ULONG Type,
23 ULONG Language,
24 ULONG MessageId,
25 PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry)
26 {
27 LDR_RESOURCE_INFO ResourceInfo;
28 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
29 PRTL_MESSAGE_RESOURCE_DATA MessageTable;
30 NTSTATUS Status;
31 ULONG EntryOffset = 0, IdOffset = 0;
32 PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry;
33 ULONG i;
34
35 DPRINT("RtlFindMessage()\n");
36
37 ResourceInfo.Type = Type;
38 ResourceInfo.Name = 1;
39 ResourceInfo.Language = Language;
40
41 Status = LdrFindResource_U(BaseAddress,
42 &ResourceInfo,
43 RESOURCE_DATA_LEVEL,
44 &ResourceDataEntry);
45 if (!NT_SUCCESS(Status))
46 {
47 return Status;
48 }
49
50 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
51
52 Status = LdrAccessResource(BaseAddress,
53 ResourceDataEntry,
54 (PVOID*)&MessageTable,
55 NULL);
56 if (!NT_SUCCESS(Status))
57 {
58 return Status;
59 }
60
61 DPRINT("MessageTable: %p\n", MessageTable);
62
63 DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks);
64 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
65 {
66 DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n",
67 MessageTable->Blocks[i].LowId,
68 MessageTable->Blocks[i].HighId,
69 MessageTable->Blocks[i].OffsetToEntries);
70 }
71
72 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
73 {
74 if ((MessageId >= MessageTable->Blocks[i].LowId) &&
75 (MessageId <= MessageTable->Blocks[i].HighId))
76 {
77 EntryOffset = MessageTable->Blocks[i].OffsetToEntries;
78 IdOffset = MessageId - MessageTable->Blocks[i].LowId;
79 break;
80 }
81
82 if (MessageId < MessageTable->Blocks[i].LowId)
83 {
84 return STATUS_MESSAGE_NOT_FOUND;
85 }
86 }
87
88 if (MessageTable->NumberOfBlocks <= i)
89 {
90 return STATUS_MESSAGE_NOT_FOUND;
91 }
92
93 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
94
95 DPRINT("EntryOffset 0x%08lx\n", EntryOffset);
96 DPRINT("IdOffset 0x%08lx\n", IdOffset);
97
98 DPRINT("MessageEntry: %p\n", MessageEntry);
99 for (i = 0; i < IdOffset; i++)
100 {
101 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length);
102 }
103
104 if (MessageEntry->Flags == 0)
105 {
106 DPRINT("AnsiText: %s\n", MessageEntry->Text);
107 }
108 else
109 {
110 DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text);
111 }
112
113 if (MessageResourceEntry != NULL)
114 {
115 *MessageResourceEntry = MessageEntry;
116 }
117
118 return STATUS_SUCCESS;
119 }
120
121
122 /**********************************************************************
123 * RtlFormatMessage (NTDLL.@)
124 *
125 * Formats a message (similar to sprintf).
126 *
127 * PARAMS
128 * Message [I] Message to format.
129 * MaxWidth [I] Maximum width in characters of each output line.
130 * IgnoreInserts [I] Whether to copy the message without processing inserts.
131 * Ansi [I] Whether Arguments may have ANSI strings.
132 * ArgumentsIsArray [I] Whether Arguments is actually an array rather than a va_list *.
133 * Arguments [I]
134 * Buffer [O] Buffer to store processed message in.
135 * BufferSize [I] Size of Buffer (in bytes?).
136 *
137 * RETURNS
138 * NTSTATUS code.
139 *
140 * @unimplemented
141 */
142 NTSTATUS NTAPI
143 RtlFormatMessage(PWSTR Message,
144 UCHAR MaxWidth,
145 BOOLEAN IgnoreInserts,
146 BOOLEAN Ansi,
147 BOOLEAN ArgumentIsArray,
148 va_list *Arguments,
149 PWSTR Buffer,
150 ULONG BufferSize)
151 {
152 DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n",
153 Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE",
154 ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize);
155
156 UNIMPLEMENTED;
157 return STATUS_NOT_IMPLEMENTED;
158 }
159
160 /* EOF */