[LIBXSLT] Update to version 1.1.32. CORE-14291
[reactos.git] / dll / win32 / lsasrv / utils.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/lsasrv/utils.c
5 * PURPOSE: Utility functions
6 *
7 * PROGRAMMERS: Eric Kohl
8 */
9
10 #include "lsasrv.h"
11
12 #include <winuser.h>
13
14 /* FUNCTIONS ***************************************************************/
15
16 INT
17 LsapLoadString(HINSTANCE hInstance,
18 UINT uId,
19 LPWSTR lpBuffer,
20 INT nBufferMax)
21 {
22 HGLOBAL hmem;
23 HRSRC hrsrc;
24 WCHAR *p;
25 int string_num;
26 int i;
27
28 /* Use loword (incremented by 1) as resourceid */
29 hrsrc = FindResourceW(hInstance,
30 MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1),
31 (LPWSTR)RT_STRING);
32 if (!hrsrc)
33 return 0;
34
35 hmem = LoadResource(hInstance, hrsrc);
36 if (!hmem)
37 return 0;
38
39 p = LockResource(hmem);
40 string_num = uId & 0x000f;
41 for (i = 0; i < string_num; i++)
42 p += *p + 1;
43
44 i = min(nBufferMax - 1, *p);
45 if (i > 0)
46 {
47 memcpy(lpBuffer, p + 1, i * sizeof(WCHAR));
48 lpBuffer[i] = 0;
49 }
50 else
51 {
52 if (nBufferMax > 1)
53 {
54 lpBuffer[0] = 0;
55 return 0;
56 }
57 }
58
59 return i;
60 }
61
62
63 INT
64 LsapGetResourceStringLengthEx(
65 _In_ HINSTANCE hInstance,
66 _In_ UINT uId,
67 _In_ USHORT usLanguage)
68 {
69 HGLOBAL hmem;
70 HRSRC hrsrc;
71 WCHAR *p;
72 UINT i, string_num;
73
74 /* Use loword (incremented by 1) as resourceid */
75 // hrsrc = FindResourceExW(hInstance,
76 // MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1),
77 // (LPWSTR)RT_STRING,
78 // usLanguage);
79 hrsrc = FindResourceW(hInstance,
80 MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1),
81 (LPWSTR)RT_STRING);
82 if (!hrsrc)
83 return 0;
84
85 hmem = LoadResource(hInstance, hrsrc);
86 if (!hmem)
87 return 0;
88
89 p = LockResource(hmem);
90 string_num = uId & 0x000f;
91 for (i = 0; i < string_num; i++)
92 p += *p + 1;
93
94 return *p + 1;
95 }
96
97
98 INT
99 LsapLoadStringEx(
100 _In_ HINSTANCE hInstance,
101 _In_ UINT uId,
102 _In_ USHORT usLanguage,
103 _Out_ LPWSTR lpBuffer,
104 _Out_ INT nBufferMax)
105 {
106 HGLOBAL hmem;
107 HRSRC hrsrc;
108 WCHAR *p;
109 int string_num;
110 int i;
111
112 /* Use loword (incremented by 1) as resourceid */
113 // hrsrc = FindResourceExW(hInstance,
114 // MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1),
115 // (LPWSTR)RT_STRING,
116 // usLanguage);
117 hrsrc = FindResourceW(hInstance,
118 MAKEINTRESOURCEW((LOWORD(uId) >> 4) + 1),
119 (LPWSTR)RT_STRING);
120 if (!hrsrc)
121 return 0;
122
123 hmem = LoadResource(hInstance, hrsrc);
124 if (!hmem)
125 return 0;
126
127 p = LockResource(hmem);
128 string_num = uId & 0x000f;
129 for (i = 0; i < string_num; i++)
130 p += *p + 1;
131
132 i = min(nBufferMax - 1, *p);
133 if (i > 0)
134 {
135 memcpy(lpBuffer, p + 1, i * sizeof(WCHAR));
136 lpBuffer[i] = 0;
137 }
138 else
139 {
140 if (nBufferMax > 1)
141 {
142 lpBuffer[0] = 0;
143 return 0;
144 }
145 }
146
147 return i;
148 }
149
150
151 PSID
152 LsapAppendRidToSid(
153 PSID SrcSid,
154 ULONG Rid)
155 {
156 ULONG Rids[8] = {0, 0, 0, 0, 0, 0, 0, 0};
157 UCHAR RidCount;
158 PSID DstSid;
159 ULONG i;
160
161 RidCount = *RtlSubAuthorityCountSid(SrcSid);
162 if (RidCount >= 8)
163 return NULL;
164
165 for (i = 0; i < RidCount; i++)
166 Rids[i] = *RtlSubAuthoritySid(SrcSid, i);
167
168 Rids[RidCount] = Rid;
169 RidCount++;
170
171 RtlAllocateAndInitializeSid(RtlIdentifierAuthoritySid(SrcSid),
172 RidCount,
173 Rids[0],
174 Rids[1],
175 Rids[2],
176 Rids[3],
177 Rids[4],
178 Rids[5],
179 Rids[6],
180 Rids[7],
181 &DstSid);
182
183 return DstSid;
184 }
185
186 /* EOF */