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
, 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 MessageEntry
= (PRTL_MESSAGE_RESOURCE_ENTRY
)((PUCHAR
)MessageTable
+ MessageTable
->Blocks
[i
].OffsetToEntries
);
90 DPRINT("EntryOffset 0x%08lx\n", EntryOffset
);
91 DPRINT("IdOffset 0x%08lx\n", IdOffset
);
93 DPRINT("MessageEntry: %p\n", MessageEntry
);
94 for (i
= 0; i
< IdOffset
; i
++)
96 MessageEntry
= (PRTL_MESSAGE_RESOURCE_ENTRY
)((PUCHAR
)MessageEntry
+ (ULONG
)MessageEntry
->Length
);
99 if (MessageEntry
->Flags
== 0)
101 DPRINT("AnsiText: %s\n", MessageEntry
->Text
);
105 DPRINT("UnicodeText: %S\n", (PWSTR
)MessageEntry
->Text
);
108 if (MessageResourceEntry
!= NULL
);
110 *MessageResourceEntry
= MessageEntry
;
113 return STATUS_SUCCESS
;
117 /**********************************************************************
118 * RtlFormatMessage (NTDLL.@)
120 * Formats a message (similar to sprintf).
123 * Message [I] Message to format.
124 * MaxWidth [I] Maximum width in characters of each output line.
125 * IgnoreInserts [I] Whether to copy the message without processing inserts.
126 * Ansi [I] Whether Arguments may have ANSI strings.
127 * ArgumentsIsArray [I] Whether Arguments is actually an array rather than a va_list *.
129 * Buffer [O] Buffer to store processed message in.
130 * BufferSize [I] Size of Buffer (in bytes?).
138 RtlFormatMessage(PWSTR Message
,
140 BOOLEAN IgnoreInserts
,
142 BOOLEAN ArgumentIsArray
,
147 DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n",
148 Message
, MaxWidth
, IgnoreInserts
? "TRUE" : "FALSE", Ansi
? "TRUE" : "FALSE",
149 ArgumentIsArray
? "TRUE" : "FALSE", Arguments
, Buffer
, BufferSize
);
152 return STATUS_NOT_IMPLEMENTED
;