[IDL][NETAPI32][SRVSVC] Hack around another midl/rpcrt4 bug

NETAPI32: Get rid of the old WINE NetServerGetInfo and replace it by a proper call to NetrServerGetInfo.
SRVSVC: Implement parts of NetrServerGetInfo.
srvsvc.idl: Hack around a bug in midl or rpcrt4. They are not able to handle a pointer to a union of pointers to structs. A pointer to a union of structs works a advertised.
This commit is contained in:
Eric Kohl 2018-05-06 16:49:24 +02:00
parent 93edd2a185
commit 12bdbe5710
4 changed files with 143 additions and 70 deletions

View file

@ -348,10 +348,91 @@ __stdcall
NetrServerGetInfo(
SRVSVC_HANDLE ServerName,
DWORD Level,
LPSERVER_INFO InfoStruct)
LPSERVER_INFO *InfoStruct)
{
UNIMPLEMENTED;
return ERROR_CALL_NOT_IMPLEMENTED;
WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD dwComputerNameLength, dwSize;
PSERVER_INFO pServerInfo = NULL;
OSVERSIONINFOW VersionInfo;
TRACE("NetrServerGetInfo(%p %lu %p)\n",
ServerName, Level, InfoStruct);
dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerNameW(szComputerName, &dwComputerNameLength);
dwComputerNameLength++; /* include NULL terminator */
VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
GetVersionExW(&VersionInfo);
switch (Level)
{
case 100:
dwSize = sizeof(SERVER_INFO_100) +
dwComputerNameLength * sizeof(WCHAR);
pServerInfo = midl_user_allocate(dwSize);
if (pServerInfo == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
pServerInfo->ServerInfo100.sv100_platform_id = PLATFORM_ID_NT;
pServerInfo->ServerInfo100.sv100_name = (LPWSTR)((ULONG_PTR)pServerInfo + sizeof(SERVER_INFO_100));
wcscpy(pServerInfo->ServerInfo100.sv100_name, szComputerName);
*InfoStruct = pServerInfo;
break;
case 101:
dwSize = sizeof(SERVER_INFO_101) +
dwComputerNameLength * sizeof(WCHAR);
pServerInfo = midl_user_allocate(dwSize);
if (pServerInfo == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
pServerInfo->ServerInfo101.sv101_platform_id = PLATFORM_ID_NT;
pServerInfo->ServerInfo101.sv101_name = (LPWSTR)((ULONG_PTR)pServerInfo + sizeof(SERVER_INFO_101));
wcscpy(pServerInfo->ServerInfo101.sv101_name, szComputerName);
pServerInfo->ServerInfo101.sv101_version_major = VersionInfo.dwMajorVersion;
pServerInfo->ServerInfo101.sv101_version_minor = VersionInfo.dwMinorVersion;
pServerInfo->ServerInfo101.sv101_type = SV_TYPE_NT; /* FIXME */
pServerInfo->ServerInfo101.sv101_comment = NULL; /* FIXME */
*InfoStruct = pServerInfo;
break;
case 102:
dwSize = sizeof(SERVER_INFO_102) +
dwComputerNameLength * sizeof(WCHAR);
pServerInfo = midl_user_allocate(dwSize);
if (pServerInfo == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
pServerInfo->ServerInfo102.sv102_platform_id = PLATFORM_ID_NT;
pServerInfo->ServerInfo102.sv102_name = (LPWSTR)((ULONG_PTR)pServerInfo + sizeof(SERVER_INFO_102));
wcscpy(pServerInfo->ServerInfo102.sv102_name, szComputerName);
pServerInfo->ServerInfo102.sv102_version_major = VersionInfo.dwMajorVersion;
pServerInfo->ServerInfo102.sv102_version_minor = VersionInfo.dwMinorVersion;
pServerInfo->ServerInfo102.sv102_type = SV_TYPE_NT;
pServerInfo->ServerInfo102.sv102_comment = NULL; /* FIXME */
pServerInfo->ServerInfo102.sv102_users = 0; /* FIXME */
pServerInfo->ServerInfo102.sv102_disc = 0; /* FIXME */
pServerInfo->ServerInfo102.sv102_hidden = SV_VISIBLE; /* FIXME */
pServerInfo->ServerInfo102.sv102_announce = 0; /* FIXME */
pServerInfo->ServerInfo102.sv102_anndelta = 0; /* FIXME */
pServerInfo->ServerInfo102.sv102_licenses = 0; /* FIXME */
pServerInfo->ServerInfo102.sv102_userpath = NULL; /* FIXME */
*InfoStruct = pServerInfo;
break;
default:
FIXME("level %d unimplemented\n", Level);
return ERROR_INVALID_LEVEL;
}
return NERR_Success;
}

View file

@ -18,8 +18,6 @@
#include "netapi32.h"
#include <lmserver.h>
WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
@ -40,64 +38,3 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
return TRUE;
}
/************************************************************
* NetServerGetInfo (NETAPI32.@)
*/
NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE* bufptr)
{
NET_API_STATUS ret;
TRACE("%s %d %p\n", debugstr_w( servername ), level, bufptr );
if (servername)
{
if (!NETAPI_IsLocalComputer(servername))
{
FIXME("remote computers not supported\n");
return ERROR_INVALID_LEVEL;
}
}
if (!bufptr) return ERROR_INVALID_PARAMETER;
switch (level)
{
case 100:
case 101:
{
DWORD computerNameLen, size;
WCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
computerNameLen = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerNameW(computerName, &computerNameLen);
computerNameLen++; /* include NULL terminator */
size = sizeof(SERVER_INFO_101) + computerNameLen * sizeof(WCHAR);
ret = NetApiBufferAllocate(size, (LPVOID *)bufptr);
if (ret == NERR_Success)
{
/* INFO_100 structure is a subset of INFO_101 */
PSERVER_INFO_101 info = (PSERVER_INFO_101)*bufptr;
OSVERSIONINFOW verInfo;
info->sv101_platform_id = PLATFORM_ID_NT;
info->sv101_name = (LMSTR)(*bufptr + sizeof(SERVER_INFO_101));
memcpy(info->sv101_name, computerName,
computerNameLen * sizeof(WCHAR));
verInfo.dwOSVersionInfoSize = sizeof(verInfo);
GetVersionExW(&verInfo);
info->sv101_version_major = verInfo.dwMajorVersion;
info->sv101_version_minor = verInfo.dwMinorVersion;
/* Use generic type as no wine equivalent of DC / Server */
info->sv101_type = SV_TYPE_NT;
info->sv101_comment = NULL;
}
break;
}
default:
FIXME("level %d unimplemented\n", level);
ret = ERROR_INVALID_LEVEL;
}
return ret;
}

View file

@ -364,7 +364,6 @@ NetServerDiskEnum(
}
#if 0
NET_API_STATUS
WINAPI
NetServerGetInfo(
@ -383,7 +382,7 @@ NetServerGetInfo(
{
status = NetrServerGetInfo(servername,
level,
(LPSERVER_INFO)bufptr);
(LPSERVER_INFO *)bufptr);
}
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
{
@ -393,7 +392,6 @@ NetServerGetInfo(
return status;
}
#endif
NET_API_STATUS

View file

@ -734,6 +734,7 @@ typedef struct _SERVER_INFO_1556
} SERVER_INFO_1556, *PSERVER_INFO_1556, *LPSERVER_INFO_1556;
cpp_quote("#endif")
/*
typedef [switch_type(unsigned long)] union _SERVER_INFO
{
[case(100)] LPSERVER_INFO_100 ServerInfo100;
@ -788,6 +789,61 @@ typedef [switch_type(unsigned long)] union _SERVER_INFO
[case(1555)] LPSERVER_INFO_1555 ServerInfo1555;
[case(1556)] LPSERVER_INFO_1556 ServerInfo1556;
} SERVER_INFO, *PSERVER_INFO, *LPSERVER_INFO;
*/
typedef [switch_type(unsigned long)] union _SERVER_INFO
{
[case(100)] SERVER_INFO_100 ServerInfo100;
[case(101)] SERVER_INFO_101 ServerInfo101;
[case(102)] SERVER_INFO_102 ServerInfo102;
[case(103)] SERVER_INFO_103 ServerInfo103;
[case(502)] SERVER_INFO_502 ServerInfo502;
[case(503)] SERVER_INFO_503 ServerInfo503;
[case(599)] SERVER_INFO_599 ServerInfo599;
[case(1005)] SERVER_INFO_1005 ServerInfo1005;
[case(1107)] SERVER_INFO_1107 ServerInfo1107;
[case(1010)] SERVER_INFO_1010 ServerInfo1010;
[case(1016)] SERVER_INFO_1016 ServerInfo1016;
[case(1017)] SERVER_INFO_1017 ServerInfo1017;
[case(1018)] SERVER_INFO_1018 ServerInfo1018;
[case(1501)] SERVER_INFO_1501 ServerInfo1501;
[case(1502)] SERVER_INFO_1502 ServerInfo1502;
[case(1503)] SERVER_INFO_1503 ServerInfo1503;
[case(1506)] SERVER_INFO_1506 ServerInfo1506;
[case(1510)] SERVER_INFO_1510 ServerInfo1510;
[case(1511)] SERVER_INFO_1511 ServerInfo1511;
[case(1512)] SERVER_INFO_1512 ServerInfo1512;
[case(1513)] SERVER_INFO_1513 ServerInfo1513;
[case(1514)] SERVER_INFO_1514 ServerInfo1514;
[case(1515)] SERVER_INFO_1515 ServerInfo1515;
[case(1516)] SERVER_INFO_1516 ServerInfo1516;
[case(1518)] SERVER_INFO_1518 ServerInfo1518;
[case(1523)] SERVER_INFO_1523 ServerInfo1523;
[case(1528)] SERVER_INFO_1528 ServerInfo1528;
[case(1529)] SERVER_INFO_1529 ServerInfo1529;
[case(1530)] SERVER_INFO_1530 ServerInfo1530;
[case(1533)] SERVER_INFO_1533 ServerInfo1533;
[case(1534)] SERVER_INFO_1534 ServerInfo1534;
[case(1535)] SERVER_INFO_1535 ServerInfo1535;
[case(1536)] SERVER_INFO_1536 ServerInfo1536;
[case(1538)] SERVER_INFO_1538 ServerInfo1538;
[case(1539)] SERVER_INFO_1539 ServerInfo1539;
[case(1540)] SERVER_INFO_1540 ServerInfo1540;
[case(1541)] SERVER_INFO_1541 ServerInfo1541;
[case(1542)] SERVER_INFO_1542 ServerInfo1542;
[case(1543)] SERVER_INFO_1543 ServerInfo1543;
[case(1544)] SERVER_INFO_1544 ServerInfo1544;
[case(1545)] SERVER_INFO_1545 ServerInfo1545;
[case(1546)] SERVER_INFO_1546 ServerInfo1546;
[case(1547)] SERVER_INFO_1547 ServerInfo1547;
[case(1548)] SERVER_INFO_1548 ServerInfo1548;
[case(1549)] SERVER_INFO_1549 ServerInfo1549;
[case(1550)] SERVER_INFO_1550 ServerInfo1550;
[case(1552)] SERVER_INFO_1552 ServerInfo1552;
[case(1553)] SERVER_INFO_1553 ServerInfo1553;
[case(1554)] SERVER_INFO_1554 ServerInfo1554;
[case(1555)] SERVER_INFO_1555 ServerInfo1555;
[case(1556)] SERVER_INFO_1556 ServerInfo1556;
} SERVER_INFO, *PSERVER_INFO, *LPSERVER_INFO;
typedef struct _DISK_INFO
{
@ -1162,7 +1218,8 @@ interface srvsvc
NetrServerGetInfo(
[in, string, unique] SRVSVC_HANDLE ServerName,
[in] DWORD Level,
[out, switch_is(Level)] LPSERVER_INFO InfoStruct);
[out, switch_is(Level)] LPSERVER_INFO *InfoStruct);
// [out, switch_is(Level)] LPSERVER_INFO InfoStruct);
NET_API_STATUS
__stdcall