2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/rtl/message.c
5 * PURPOSE: Message table functions
6 * PROGRAMMERS: Eric Kohl
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS *****************************************************************/
28 OUT PMESSAGE_RESOURCE_ENTRY
* MessageResourceEntry
)
30 LDR_RESOURCE_INFO ResourceInfo
;
31 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
;
32 PMESSAGE_RESOURCE_DATA MessageTable
;
34 ULONG EntryOffset
= 0, IdOffset
= 0;
35 PMESSAGE_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 if (MessageTable
->NumberOfBlocks
<= i
)
93 return STATUS_MESSAGE_NOT_FOUND
;
96 MessageEntry
= (PMESSAGE_RESOURCE_ENTRY
)
97 ((PUCHAR
)MessageTable
+ MessageTable
->Blocks
[i
].OffsetToEntries
);
99 DPRINT("EntryOffset 0x%08lx\n", EntryOffset
);
100 DPRINT("IdOffset 0x%08lx\n", IdOffset
);
102 DPRINT("MessageEntry: %p\n", MessageEntry
);
103 for (i
= 0; i
< IdOffset
; i
++)
105 MessageEntry
= (PMESSAGE_RESOURCE_ENTRY
)
106 ((PUCHAR
)MessageEntry
+ (ULONG
)MessageEntry
->Length
);
109 if (MessageEntry
->Flags
== 0)
111 DPRINT("AnsiText: %s\n", MessageEntry
->Text
);
115 DPRINT("UnicodeText: %S\n", (PWSTR
)MessageEntry
->Text
);
118 if (MessageResourceEntry
!= NULL
)
120 *MessageResourceEntry
= MessageEntry
;
123 return STATUS_SUCCESS
;
133 IN ULONG MaxWidth OPTIONAL
,
134 IN BOOLEAN IgnoreInserts
,
135 IN BOOLEAN ArgumentsAreAnsi
,
136 IN BOOLEAN ArgumentsAreAnArray
,
137 IN
va_list* Arguments
,
140 OUT PULONG ReturnLength OPTIONAL
,
143 DPRINT1("RtlFormatMessage(%S, %lu, %s, %s, %s, %p, %p, %lu, %p, %lx)\n",
144 Message
, MaxWidth
, IgnoreInserts
? "TRUE" : "FALSE", ArgumentsAreAnsi
? "TRUE" : "FALSE",
145 ArgumentsAreAnArray
? "TRUE" : "FALSE", Arguments
, Buffer
, BufferSize
,
146 ReturnLength
, Flags
);
149 return STATUS_NOT_IMPLEMENTED
;
152 /**********************************************************************
153 * RtlFormatMessage (NTDLL.@)
155 * Formats a message (similar to sprintf).
158 * Message [I] Message to format.
159 * MaxWidth [I] Maximum width in characters of each output line (optional).
160 * IgnoreInserts [I] Whether to copy the message without processing inserts.
161 * ArgumentsAreAnsi [I] Whether Arguments may have ANSI strings.
162 * ArgumentsAreAnArray [I] Whether Arguments is actually an array rather than a va_list *.
164 * Buffer [O] Buffer to store processed message in.
165 * BufferSize [I] Size of Buffer (in bytes).
166 * ReturnLength [O] Size of the formatted message (in bytes; optional).
177 IN ULONG MaxWidth OPTIONAL
,
178 IN BOOLEAN IgnoreInserts
,
179 IN BOOLEAN ArgumentsAreAnsi
,
180 IN BOOLEAN ArgumentsAreAnArray
,
181 IN
va_list* Arguments
,
184 OUT PULONG ReturnLength OPTIONAL
)
186 /* Call the extended API */
187 return RtlFormatMessageEx(Message
,