[PSDK]
[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
21 NTAPI
22 RtlFindMessage(
23 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 = 0, IdOffset = 0;
34 PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry;
35 ULONG i;
36
37 DPRINT("RtlFindMessage()\n");
38
39 ResourceInfo.Type = Type;
40 ResourceInfo.Name = 1;
41 ResourceInfo.Language = Language;
42
43 Status = LdrFindResource_U(BaseAddress,
44 &ResourceInfo,
45 RESOURCE_DATA_LEVEL,
46 &ResourceDataEntry);
47 if (!NT_SUCCESS(Status))
48 {
49 return Status;
50 }
51
52 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
53
54 Status = LdrAccessResource(BaseAddress,
55 ResourceDataEntry,
56 (PVOID*)&MessageTable,
57 NULL);
58 if (!NT_SUCCESS(Status))
59 {
60 return Status;
61 }
62
63 DPRINT("MessageTable: %p\n", MessageTable);
64
65 DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks);
66 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
67 {
68 DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n",
69 MessageTable->Blocks[i].LowId,
70 MessageTable->Blocks[i].HighId,
71 MessageTable->Blocks[i].OffsetToEntries);
72 }
73
74 for (i = 0; i < MessageTable->NumberOfBlocks; i++)
75 {
76 if ((MessageId >= MessageTable->Blocks[i].LowId) &&
77 (MessageId <= MessageTable->Blocks[i].HighId))
78 {
79 EntryOffset = MessageTable->Blocks[i].OffsetToEntries;
80 IdOffset = MessageId - MessageTable->Blocks[i].LowId;
81 break;
82 }
83
84 if (MessageId < MessageTable->Blocks[i].LowId)
85 {
86 return STATUS_MESSAGE_NOT_FOUND;
87 }
88 }
89
90 if (MessageTable->NumberOfBlocks <= i)
91 {
92 return STATUS_MESSAGE_NOT_FOUND;
93 }
94
95 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)
96 ((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
97
98 DPRINT("EntryOffset 0x%08lx\n", EntryOffset);
99 DPRINT("IdOffset 0x%08lx\n", IdOffset);
100
101 DPRINT("MessageEntry: %p\n", MessageEntry);
102 for (i = 0; i < IdOffset; i++)
103 {
104 MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)
105 ((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length);
106 }
107
108 if (MessageEntry->Flags == 0)
109 {
110 DPRINT("AnsiText: %s\n", MessageEntry->Text);
111 }
112 else
113 {
114 DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text);
115 }
116
117 if (MessageResourceEntry != NULL)
118 {
119 *MessageResourceEntry = MessageEntry;
120 }
121
122 return STATUS_SUCCESS;
123 }
124
125
126 /**********************************************************************
127 * RtlFormatMessage (NTDLL.@)
128 *
129 * Formats a message (similar to sprintf).
130 *
131 * PARAMS
132 * Message [I] Message to format.
133 * MaxWidth [I] Maximum width in characters of each output line.
134 * IgnoreInserts [I] Whether to copy the message without processing inserts.
135 * Ansi [I] Whether Arguments may have ANSI strings.
136 * ArgumentsIsArray [I] Whether Arguments is actually an array rather than a va_list *.
137 * Arguments [I]
138 * Buffer [O] Buffer to store processed message in.
139 * BufferSize [I] Size of Buffer (in bytes?).
140 *
141 * RETURNS
142 * NTSTATUS code.
143 *
144 * @unimplemented
145 */
146 NTSTATUS
147 NTAPI
148 RtlFormatMessage(
149 PWSTR Message,
150 UCHAR MaxWidth,
151 BOOLEAN IgnoreInserts,
152 BOOLEAN Ansi,
153 BOOLEAN ArgumentIsArray,
154 va_list *Arguments,
155 PWSTR Buffer,
156 ULONG BufferSize)
157 {
158 DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n",
159 Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE",
160 ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize);
161
162 UNIMPLEMENTED;
163 return STATUS_NOT_IMPLEMENTED;
164 }
165
166 /* EOF */