:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / ntoskrnl / rtl / message.c
1 /* $Id$
2  *
3  * COPYRIGHT:         See COPYING in the top level directory
4  * PROJECT:           ReactOS kernel
5  * PURPOSE:           Message table functions
6  * FILE:              ntoskrnl/rtl/message.c
7  * PROGRAMER:         Eric Kohl <ekohl@zr-online.de>
8  * REVISION HISTORY:
9  *                    29/05/2001: Created
10  */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15
16 #define NDEBUG
17 #include <internal/debug.h>
18
19
20 /* FUNCTIONS *****************************************************************/
21
22 NTSTATUS STDCALL
23 RtlFindMessage(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, IdOffset = 0;
34    PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry;
35
36    ULONG i;
37
38    DPRINT("RtlFindMessage()\n");
39
40    ResourceInfo.Type = Type;
41    ResourceInfo.Name = 1;
42    ResourceInfo.Language = Language;
43
44    Status = LdrFindResource_U(BaseAddress,
45                               &ResourceInfo,
46                               RESOURCE_DATA_LEVEL,
47                               &ResourceDataEntry);
48    if (!NT_SUCCESS(Status))
49      {
50         return(Status);
51      }
52
53    DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry);
54
55    Status = LdrAccessResource(BaseAddress,
56                               ResourceDataEntry,
57                               (PVOID*)&MessageTable,
58                               NULL);
59    if (!NT_SUCCESS(Status))
60      {
61         return(Status);
62      }
63
64    DPRINT("MessageTable: %p\n", MessageTable);
65
66    DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks);
67    for (i = 0; i < MessageTable->NumberOfBlocks; i++)
68      {
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);
73      }
74
75    for (i = 0; i < MessageTable->NumberOfBlocks; i++)
76      {
77         if ((MessageId >= MessageTable->Blocks[i].LowId) &&
78             (MessageId <= MessageTable->Blocks[i].HighId))
79           {
80              EntryOffset = MessageTable->Blocks[i].OffsetToEntries;
81              IdOffset = MessageId - MessageTable->Blocks[i].LowId;
82              break;
83           }
84
85         if (MessageId < MessageTable->Blocks[i].LowId)
86           {
87              return STATUS_MESSAGE_NOT_FOUND;
88           }
89      }
90
91    MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries);
92
93    DPRINT("EntryOffset 0x%08lx\n", EntryOffset);
94    DPRINT("IdOffset 0x%08lx\n", IdOffset);
95
96    DPRINT("MessageEntry: %p\n", MessageEntry);
97    for (i = 0; i < IdOffset; i++)
98      {
99         DPRINT("MessageEntry %d: %p\n", i, MessageEntry);
100         MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length);
101      }
102    DPRINT("MessageEntry: %p\n", MessageEntry);
103    DPRINT("Flags: %hx\n", MessageEntry->Flags);
104    DPRINT("Length: %hu\n", MessageEntry->Length);
105
106    if (MessageEntry->Flags == 0)
107      {
108         DPRINT("AnsiText: %s\n", MessageEntry->Text);
109      }
110    else
111      {
112         DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text);
113      }
114
115    if (MessageResourceEntry != NULL);
116      {
117         *MessageResourceEntry = MessageEntry;
118      }
119
120    return(STATUS_SUCCESS);
121 }
122
123 /* EOF */