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 <ekohl@zr-online.de>
8 /* INCLUDES *****************************************************************/
15 /* FUNCTIONS *****************************************************************/
21 RtlFindMessage(PVOID BaseAddress
,
25 PRTL_MESSAGE_RESOURCE_ENTRY
*MessageResourceEntry
)
27 LDR_RESOURCE_INFO ResourceInfo
;
28 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
;
29 PRTL_MESSAGE_RESOURCE_DATA MessageTable
;
31 ULONG EntryOffset
= 0, IdOffset
= 0;
32 PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry
;
35 DPRINT("RtlFindMessage()\n");
37 ResourceInfo
.Type
= Type
;
38 ResourceInfo
.Name
= 1;
39 ResourceInfo
.Language
= Language
;
41 Status
= LdrFindResource_U(BaseAddress
,
45 if (!NT_SUCCESS(Status
))
50 DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry
);
52 Status
= LdrAccessResource(BaseAddress
,
54 (PVOID
*)&MessageTable
,
56 if (!NT_SUCCESS(Status
))
61 DPRINT("MessageTable: %p\n", MessageTable
);
63 DPRINT("NumberOfBlocks %lu\n", MessageTable
->NumberOfBlocks
);
64 for (i
= 0; i
< MessageTable
->NumberOfBlocks
; i
++)
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
);
72 for (i
= 0; i
< MessageTable
->NumberOfBlocks
; i
++)
74 if ((MessageId
>= MessageTable
->Blocks
[i
].LowId
) &&
75 (MessageId
<= MessageTable
->Blocks
[i
].HighId
))
77 EntryOffset
= MessageTable
->Blocks
[i
].OffsetToEntries
;
78 IdOffset
= MessageId
- MessageTable
->Blocks
[i
].LowId
;
82 if (MessageId
< MessageTable
->Blocks
[i
].LowId
)
84 return STATUS_MESSAGE_NOT_FOUND
;
88 if (MessageTable
->NumberOfBlocks
<= i
)
90 return STATUS_MESSAGE_NOT_FOUND
;
93 MessageEntry
= (PRTL_MESSAGE_RESOURCE_ENTRY
)((PUCHAR
)MessageTable
+ MessageTable
->Blocks
[i
].OffsetToEntries
);
95 DPRINT("EntryOffset 0x%08lx\n", EntryOffset
);
96 DPRINT("IdOffset 0x%08lx\n", IdOffset
);
98 DPRINT("MessageEntry: %p\n", MessageEntry
);
99 for (i
= 0; i
< IdOffset
; i
++)
101 MessageEntry
= (PRTL_MESSAGE_RESOURCE_ENTRY
)((PUCHAR
)MessageEntry
+ (ULONG
)MessageEntry
->Length
);
104 if (MessageEntry
->Flags
== 0)
106 DPRINT("AnsiText: %s\n", MessageEntry
->Text
);
110 DPRINT("UnicodeText: %S\n", (PWSTR
)MessageEntry
->Text
);
113 if (MessageResourceEntry
!= NULL
);
115 *MessageResourceEntry
= MessageEntry
;
118 return STATUS_SUCCESS
;
122 /**********************************************************************
123 * RtlFormatMessage (NTDLL.@)
125 * Formats a message (similar to sprintf).
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 *.
134 * Buffer [O] Buffer to store processed message in.
135 * BufferSize [I] Size of Buffer (in bytes?).
143 RtlFormatMessage(PWSTR Message
,
145 BOOLEAN IgnoreInserts
,
147 BOOLEAN ArgumentIsArray
,
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
);
157 return STATUS_NOT_IMPLEMENTED
;