Skip to content

Commit 5b5b1a2

Browse files
committed
[NETAPI32][WKSSVC][IDL] Revert workaround for union _WKSTA_INFO
After fixing the union issue in the RPC runtime, revert all workarounds one by one. Return to the original declaration of union _WKSTA_INFO and fix NetrWkstaGetInfo and NetrWkstaSetInfo.
1 parent 69ddd4e commit 5b5b1a2

File tree

3 files changed

+70
-81
lines changed

3 files changed

+70
-81
lines changed

base/services/wkssvc/rpcserver.c

Lines changed: 68 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,17 @@ NetpGetClientLogonId(
130130
unsigned long
131131
__stdcall
132132
NetrWkstaGetInfo(
133-
WKSSVC_IDENTIFY_HANDLE ServerName,
134-
unsigned long Level,
135-
LPWKSTA_INFO *WkstaInfo)
133+
_In_ WKSSVC_IDENTIFY_HANDLE ServerName,
134+
_In_ unsigned long Level,
135+
_Out_ LPWKSTA_INFO WkstaInfo)
136136
{
137137
WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
138138
DWORD dwComputerNameLength;
139139
LPCWSTR pszLanRoot = L"";
140-
PWKSTA_INFO pWkstaInfo = NULL;
140+
PWKSTA_INFO_100 pWkstaInfo100 = NULL;
141+
PWKSTA_INFO_101 pWkstaInfo101 = NULL;
142+
PWKSTA_INFO_102 pWkstaInfo102 = NULL;
143+
PWKSTA_INFO_502 pWkstaInfo502 = NULL;
141144
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
142145
LSA_HANDLE PolicyHandle;
143146
PPOLICY_PRIMARY_DOMAIN_INFO DomainInfo = NULL;
@@ -204,98 +207,98 @@ NetrWkstaGetInfo(
204207
switch (Level)
205208
{
206209
case 100:
207-
pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_100));
208-
if (pWkstaInfo == NULL)
210+
pWkstaInfo100 = midl_user_allocate(sizeof(WKSTA_INFO_100));
211+
if (pWkstaInfo100 == NULL)
209212
{
210213
dwResult = ERROR_NOT_ENOUGH_MEMORY;
211214
break;
212215
}
213216

214-
pWkstaInfo->WkstaInfo100.wki100_platform_id = PLATFORM_ID_NT;
217+
pWkstaInfo100->wki100_platform_id = PLATFORM_ID_NT;
215218

216-
pWkstaInfo->WkstaInfo100.wki100_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
217-
if (pWkstaInfo->WkstaInfo100.wki100_computername != NULL)
218-
wcscpy(pWkstaInfo->WkstaInfo100.wki100_computername, szComputerName);
219+
pWkstaInfo100->wki100_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
220+
if (pWkstaInfo100->wki100_computername != NULL)
221+
wcscpy(pWkstaInfo100->wki100_computername, szComputerName);
219222

220-
pWkstaInfo->WkstaInfo100.wki100_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
221-
if (pWkstaInfo->WkstaInfo100.wki100_langroup != NULL)
222-
wcscpy(pWkstaInfo->WkstaInfo100.wki100_langroup, DomainInfo->Name.Buffer);
223+
pWkstaInfo100->wki100_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
224+
if (pWkstaInfo100->wki100_langroup != NULL)
225+
wcscpy(pWkstaInfo100->wki100_langroup, DomainInfo->Name.Buffer);
223226

224-
pWkstaInfo->WkstaInfo100.wki100_ver_major = VersionInfo.dwMajorVersion;
225-
pWkstaInfo->WkstaInfo100.wki100_ver_minor = VersionInfo.dwMinorVersion;
227+
pWkstaInfo100->wki100_ver_major = VersionInfo.dwMajorVersion;
228+
pWkstaInfo100->wki100_ver_minor = VersionInfo.dwMinorVersion;
226229

227-
*WkstaInfo = pWkstaInfo;
230+
WkstaInfo->WkstaInfo100 = pWkstaInfo100;
228231
break;
229232

230233
case 101:
231-
pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_101));
232-
if (pWkstaInfo == NULL)
234+
pWkstaInfo101 = midl_user_allocate(sizeof(WKSTA_INFO_101));
235+
if (pWkstaInfo101 == NULL)
233236
{
234237
dwResult = ERROR_NOT_ENOUGH_MEMORY;
235238
break;
236239
}
237240

238-
pWkstaInfo->WkstaInfo101.wki101_platform_id = PLATFORM_ID_NT;
241+
pWkstaInfo101->wki101_platform_id = PLATFORM_ID_NT;
239242

240-
pWkstaInfo->WkstaInfo101.wki101_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
241-
if (pWkstaInfo->WkstaInfo101.wki101_computername != NULL)
242-
wcscpy(pWkstaInfo->WkstaInfo101.wki101_computername, szComputerName);
243+
pWkstaInfo101->wki101_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
244+
if (pWkstaInfo101->wki101_computername != NULL)
245+
wcscpy(pWkstaInfo101->wki101_computername, szComputerName);
243246

244-
pWkstaInfo->WkstaInfo101.wki101_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
245-
if (pWkstaInfo->WkstaInfo101.wki101_langroup != NULL)
246-
wcscpy(pWkstaInfo->WkstaInfo101.wki101_langroup, DomainInfo->Name.Buffer);
247+
pWkstaInfo101->wki101_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
248+
if (pWkstaInfo101->wki101_langroup != NULL)
249+
wcscpy(pWkstaInfo101->wki101_langroup, DomainInfo->Name.Buffer);
247250

248-
pWkstaInfo->WkstaInfo101.wki101_ver_major = VersionInfo.dwMajorVersion;
249-
pWkstaInfo->WkstaInfo101.wki101_ver_minor = VersionInfo.dwMinorVersion;
251+
pWkstaInfo101->wki101_ver_major = VersionInfo.dwMajorVersion;
252+
pWkstaInfo101->wki101_ver_minor = VersionInfo.dwMinorVersion;
250253

251-
pWkstaInfo->WkstaInfo101.wki101_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
252-
if (pWkstaInfo->WkstaInfo101.wki101_lanroot != NULL)
253-
wcscpy(pWkstaInfo->WkstaInfo101.wki101_lanroot, pszLanRoot);
254+
pWkstaInfo101->wki101_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
255+
if (pWkstaInfo101->wki101_lanroot != NULL)
256+
wcscpy(pWkstaInfo101->wki101_lanroot, pszLanRoot);
254257

255-
*WkstaInfo = pWkstaInfo;
258+
WkstaInfo->WkstaInfo101 = pWkstaInfo101;
256259
break;
257260

258261
case 102:
259-
pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_102));
260-
if (pWkstaInfo == NULL)
262+
pWkstaInfo102 = midl_user_allocate(sizeof(WKSTA_INFO_102));
263+
if (pWkstaInfo102 == NULL)
261264
{
262265
dwResult = ERROR_NOT_ENOUGH_MEMORY;
263266
break;
264267
}
265268

266-
pWkstaInfo->WkstaInfo102.wki102_platform_id = PLATFORM_ID_NT;
269+
pWkstaInfo102->wki102_platform_id = PLATFORM_ID_NT;
267270

268-
pWkstaInfo->WkstaInfo102.wki102_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
269-
if (pWkstaInfo->WkstaInfo102.wki102_computername != NULL)
270-
wcscpy(pWkstaInfo->WkstaInfo102.wki102_computername, szComputerName);
271+
pWkstaInfo102->wki102_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
272+
if (pWkstaInfo102->wki102_computername != NULL)
273+
wcscpy(pWkstaInfo102->wki102_computername, szComputerName);
271274

272-
pWkstaInfo->WkstaInfo102.wki102_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
273-
if (pWkstaInfo->WkstaInfo102.wki102_langroup != NULL)
274-
wcscpy(pWkstaInfo->WkstaInfo102.wki102_langroup, DomainInfo->Name.Buffer);
275+
pWkstaInfo102->wki102_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
276+
if (pWkstaInfo102->wki102_langroup != NULL)
277+
wcscpy(pWkstaInfo102->wki102_langroup, DomainInfo->Name.Buffer);
275278

276-
pWkstaInfo->WkstaInfo102.wki102_ver_major = VersionInfo.dwMajorVersion;
277-
pWkstaInfo->WkstaInfo102.wki102_ver_minor = VersionInfo.dwMinorVersion;
279+
pWkstaInfo102->wki102_ver_major = VersionInfo.dwMajorVersion;
280+
pWkstaInfo102->wki102_ver_minor = VersionInfo.dwMinorVersion;
278281

279-
pWkstaInfo->WkstaInfo102.wki102_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
280-
if (pWkstaInfo->WkstaInfo102.wki102_lanroot != NULL)
281-
wcscpy(pWkstaInfo->WkstaInfo102.wki102_lanroot, pszLanRoot);
282+
pWkstaInfo102->wki102_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
283+
if (pWkstaInfo102->wki102_lanroot != NULL)
284+
wcscpy(pWkstaInfo102->wki102_lanroot, pszLanRoot);
282285

283-
pWkstaInfo->WkstaInfo102.wki102_logged_on_users = LoggedOnUsers;
286+
pWkstaInfo102->wki102_logged_on_users = LoggedOnUsers;
284287

285-
*WkstaInfo = pWkstaInfo;
288+
WkstaInfo->WkstaInfo102 = pWkstaInfo102;
286289
break;
287290

288291
case 502:
289-
pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_502));
290-
if (pWkstaInfo == NULL)
292+
pWkstaInfo502 = midl_user_allocate(sizeof(WKSTA_INFO_502));
293+
if (pWkstaInfo502 == NULL)
291294
{
292295
dwResult = ERROR_NOT_ENOUGH_MEMORY;
293296
break;
294297
}
295298

296-
CopyMemory(&pWkstaInfo->WkstaInfo502, &WkstaInfo502, sizeof(WKSTA_INFO_502));
299+
CopyMemory(pWkstaInfo502, &WkstaInfo502, sizeof(WKSTA_INFO_502));
297300

298-
*WkstaInfo = pWkstaInfo;
301+
WkstaInfo->WkstaInfo502 = pWkstaInfo502;
299302
break;
300303

301304
default:
@@ -330,9 +333,9 @@ NetrWkstaSetInfo(
330333
switch (Level)
331334
{
332335
case 502:
333-
if (WkstaInfo->WkstaInfo502.wki502_keep_conn >= 1 && WkstaInfo->WkstaInfo502.wki502_keep_conn <= 65535)
336+
if (WkstaInfo->WkstaInfo502->wki502_keep_conn >= 1 && WkstaInfo->WkstaInfo502->wki502_keep_conn <= 65535)
334337
{
335-
WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo502.wki502_keep_conn;
338+
WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo502->wki502_keep_conn;
336339
}
337340
else
338341
{
@@ -342,9 +345,9 @@ NetrWkstaSetInfo(
342345

343346
if (dwResult == NERR_Success)
344347
{
345-
if (WkstaInfo->WkstaInfo502.wki502_max_cmds >= 50 && WkstaInfo->WkstaInfo502.wki502_max_cmds <= 65535)
348+
if (WkstaInfo->WkstaInfo502->wki502_max_cmds >= 50 && WkstaInfo->WkstaInfo502->wki502_max_cmds <= 65535)
346349
{
347-
WkstaInfo502.wki502_max_cmds = WkstaInfo->WkstaInfo502.wki502_max_cmds;
350+
WkstaInfo502.wki502_max_cmds = WkstaInfo->WkstaInfo502->wki502_max_cmds;
348351
}
349352
else
350353
{
@@ -355,9 +358,9 @@ NetrWkstaSetInfo(
355358

356359
if (dwResult == NERR_Success)
357360
{
358-
if (WkstaInfo->WkstaInfo502.wki502_sess_timeout >= 60 && WkstaInfo->WkstaInfo502.wki502_sess_timeout <= 65535)
361+
if (WkstaInfo->WkstaInfo502->wki502_sess_timeout >= 60 && WkstaInfo->WkstaInfo502->wki502_sess_timeout <= 65535)
359362
{
360-
WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo502.wki502_sess_timeout;
363+
WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo502->wki502_sess_timeout;
361364
}
362365
else
363366
{
@@ -368,9 +371,9 @@ NetrWkstaSetInfo(
368371

369372
if (dwResult == NERR_Success)
370373
{
371-
if (WkstaInfo->WkstaInfo502.wki502_dormant_file_limit != 0)
374+
if (WkstaInfo->WkstaInfo502->wki502_dormant_file_limit != 0)
372375
{
373-
WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo502.wki502_dormant_file_limit;
376+
WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo502->wki502_dormant_file_limit;
374377
}
375378
else
376379
{
@@ -381,9 +384,9 @@ NetrWkstaSetInfo(
381384
break;
382385

383386
case 1013:
384-
if (WkstaInfo->WkstaInfo1013.wki1013_keep_conn >= 1 && WkstaInfo->WkstaInfo1013.wki1013_keep_conn <= 65535)
387+
if (WkstaInfo->WkstaInfo1013->wki1013_keep_conn >= 1 && WkstaInfo->WkstaInfo1013->wki1013_keep_conn <= 65535)
385388
{
386-
WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo1013.wki1013_keep_conn;
389+
WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo1013->wki1013_keep_conn;
387390
}
388391
else
389392
{
@@ -393,9 +396,9 @@ NetrWkstaSetInfo(
393396
break;
394397

395398
case 1018:
396-
if (WkstaInfo->WkstaInfo1018.wki1018_sess_timeout >= 60 && WkstaInfo->WkstaInfo1018.wki1018_sess_timeout <= 65535)
399+
if (WkstaInfo->WkstaInfo1018->wki1018_sess_timeout >= 60 && WkstaInfo->WkstaInfo1018->wki1018_sess_timeout <= 65535)
397400
{
398-
WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo1018.wki1018_sess_timeout;
401+
WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo1018->wki1018_sess_timeout;
399402
}
400403
else
401404
{
@@ -405,9 +408,9 @@ NetrWkstaSetInfo(
405408
break;
406409

407410
case 1046:
408-
if (WkstaInfo->WkstaInfo1046.wki1046_dormant_file_limit != 0)
411+
if (WkstaInfo->WkstaInfo1046->wki1046_dormant_file_limit != 0)
409412
{
410-
WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo1046.wki1046_dormant_file_limit;
413+
WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo1046->wki1046_dormant_file_limit;
411414
}
412415
else
413416
{

dll/win32/netapi32/wksta_new.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ NetWkstaGetInfo(
884884
{
885885
status = NetrWkstaGetInfo(servername,
886886
level,
887-
(LPWKSTA_INFO*)bufptr);
887+
(LPWKSTA_INFO)bufptr);
888888
}
889889
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
890890
{

sdk/include/reactos/idl/wkssvc.idl

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ typedef struct _WKSTA_TRANSPORT_INFO_0
206206
unsigned long wkti0_wan_ish;
207207
} WKSTA_TRANSPORT_INFO_0, *PWKSTA_TRANSPORT_INFO_0, *LPWKSTA_TRANSPORT_INFO_0;
208208

209-
/*
210209
typedef [switch_type(unsigned long)] union _WKSTA_INFO
211210
{
212211
[case(100)] LPWKSTA_INFO_100 WkstaInfo100;
@@ -218,18 +217,6 @@ typedef [switch_type(unsigned long)] union _WKSTA_INFO
218217
[case(1046)] LPWKSTA_INFO_1046 WkstaInfo1046;
219218
[default] ;
220219
} WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;
221-
*/
222-
typedef [switch_type(unsigned long)] union _WKSTA_INFO
223-
{
224-
[case(100)] WKSTA_INFO_100 WkstaInfo100;
225-
[case(101)] WKSTA_INFO_101 WkstaInfo101;
226-
[case(102)] WKSTA_INFO_102 WkstaInfo102;
227-
[case(502)] WKSTA_INFO_502 WkstaInfo502;
228-
[case(1013)] WKSTA_INFO_1013 WkstaInfo1013;
229-
[case(1018)] WKSTA_INFO_1018 WkstaInfo1018;
230-
[case(1046)] WKSTA_INFO_1046 WkstaInfo1046;
231-
[default] ;
232-
} WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;
233220

234221
typedef struct _USE_INFO_0
235222
{
@@ -398,8 +385,7 @@ interface wkssvc
398385
NetrWkstaGetInfo(
399386
[in, string, unique] WKSSVC_IDENTIFY_HANDLE ServerName,
400387
[in] unsigned long Level,
401-
[out, switch_is(Level)] LPWKSTA_INFO *WkstaInfo);
402-
// [out, switch_is(Level)] LPWKSTA_INFO WkstaInfo);
388+
[out, switch_is(Level)] LPWKSTA_INFO WkstaInfo);
403389

404390
/* Function 1 */
405391
unsigned long

0 commit comments

Comments
 (0)