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
8 /* INCLUDES *****************************************************************/
15 /* FUNCTIONS *****************************************************************/
27 PMESSAGE_RESOURCE_ENTRY
*MessageResourceEntry
)
29 LDR_RESOURCE_INFO ResourceInfo
;
30 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
;
31 PMESSAGE_RESOURCE_DATA MessageTable
;
33 ULONG EntryOffset
= 0, IdOffset
= 0;
34 PMESSAGE_RESOURCE_ENTRY MessageEntry
;
37 DPRINT("RtlFindMessage()\n");
39 ResourceInfo
.Type
= Type
;
40 ResourceInfo
.Name
= 1;
41 ResourceInfo
.Language
= Language
;
43 Status
= LdrFindResource_U(BaseAddress
,
47 if (!NT_SUCCESS(Status
))
52 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry
);
54 Status
= LdrAccessResource(BaseAddress
,
56 (PVOID
*)&MessageTable
,
58 if (!NT_SUCCESS(Status
))
63 DPRINT("MessageTable: %p\n", MessageTable
);
65 DPRINT("NumberOfBlocks %lu\n", MessageTable
->NumberOfBlocks
);
66 for (i
= 0; i
< MessageTable
->NumberOfBlocks
; i
++)
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
);
74 for (i
= 0; i
< MessageTable
->NumberOfBlocks
; i
++)
76 if ((MessageId
>= MessageTable
->Blocks
[i
].LowId
) &&
77 (MessageId
<= MessageTable
->Blocks
[i
].HighId
))
79 EntryOffset
= MessageTable
->Blocks
[i
].OffsetToEntries
;
80 IdOffset
= MessageId
- MessageTable
->Blocks
[i
].LowId
;
84 if (MessageId
< MessageTable
->Blocks
[i
].LowId
)
86 return STATUS_MESSAGE_NOT_FOUND
;
90 if (MessageTable
->NumberOfBlocks
<= i
)
92 return STATUS_MESSAGE_NOT_FOUND
;
95 MessageEntry
= (PMESSAGE_RESOURCE_ENTRY
)
96 ((PUCHAR
)MessageTable
+ MessageTable
->Blocks
[i
].OffsetToEntries
);
98 DPRINT("EntryOffset 0x%08lx\n", EntryOffset
);
99 DPRINT("IdOffset 0x%08lx\n", IdOffset
);
101 DPRINT("MessageEntry: %p\n", MessageEntry
);
102 for (i
= 0; i
< IdOffset
; i
++)
104 MessageEntry
= (PMESSAGE_RESOURCE_ENTRY
)
105 ((PUCHAR
)MessageEntry
+ (ULONG
)MessageEntry
->Length
);
108 if (MessageEntry
->Flags
== 0)
110 DPRINT("AnsiText: %s\n", MessageEntry
->Text
);
114 DPRINT("UnicodeText: %S\n", (PWSTR
)MessageEntry
->Text
);
117 if (MessageResourceEntry
!= NULL
)
119 *MessageResourceEntry
= MessageEntry
;
122 return STATUS_SUCCESS
;
126 /**********************************************************************
127 * RtlFormatMessage (NTDLL.@)
129 * Formats a message (similar to sprintf).
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 *.
138 * Buffer [O] Buffer to store processed message in.
139 * BufferSize [I] Size of Buffer (in bytes?).
151 BOOLEAN IgnoreInserts
,
153 BOOLEAN ArgumentIsArray
,
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
);
163 return STATUS_NOT_IMPLEMENTED
;