2017-06-14 12:17:08 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: NetAPI DLL
|
|
|
|
* FILE: dll/win32/netapi32/browser.c
|
|
|
|
* PURPOSE: Computer Browser service interface code
|
|
|
|
* PROGRAMMERS: Eric Kohl (eric.kohl@reactos.org)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
|
|
|
#include "netapi32.h"
|
|
|
|
|
|
|
|
#include <rpc.h>
|
2017-06-14 13:44:11 +00:00
|
|
|
#include <lmbrowsr.h>
|
2017-06-24 14:59:14 +00:00
|
|
|
#include <lmserver.h>
|
2017-06-14 13:10:36 +00:00
|
|
|
#include "browser_c.h"
|
2017-06-14 12:17:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
|
|
|
|
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
2017-06-14 13:10:36 +00:00
|
|
|
|
|
|
|
handle_t __RPC_USER
|
|
|
|
BROWSER_IDENTIFY_HANDLE_bind(BROWSER_IDENTIFY_HANDLE pszSystemName)
|
|
|
|
{
|
|
|
|
handle_t hBinding = NULL;
|
|
|
|
LPWSTR pszStringBinding;
|
|
|
|
RPC_STATUS status;
|
|
|
|
|
|
|
|
TRACE("BROWSER_IDENTIFY_HANDLE_bind() called\n");
|
|
|
|
|
|
|
|
status = RpcStringBindingComposeW(NULL,
|
|
|
|
L"ncacn_np",
|
|
|
|
pszSystemName,
|
|
|
|
L"\\pipe\\browser",
|
|
|
|
NULL,
|
|
|
|
&pszStringBinding);
|
|
|
|
if (status)
|
|
|
|
{
|
|
|
|
TRACE("RpcStringBindingCompose returned 0x%x\n", status);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set the binding handle that will be used to bind to the server. */
|
|
|
|
status = RpcBindingFromStringBindingW(pszStringBinding,
|
|
|
|
&hBinding);
|
|
|
|
if (status)
|
|
|
|
{
|
|
|
|
TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
|
|
|
|
}
|
|
|
|
|
|
|
|
status = RpcStringFreeW(&pszStringBinding);
|
|
|
|
if (status)
|
|
|
|
{
|
|
|
|
// TRACE("RpcStringFree returned 0x%x\n", status);
|
|
|
|
}
|
|
|
|
|
|
|
|
return hBinding;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void __RPC_USER
|
|
|
|
BROWSER_IDENTIFY_HANDLE_unbind(BROWSER_IDENTIFY_HANDLE pszSystemName,
|
|
|
|
handle_t hBinding)
|
|
|
|
{
|
|
|
|
RPC_STATUS status;
|
|
|
|
|
|
|
|
TRACE("BROWSER_IDENTIFY_HANDLE_unbind() called\n");
|
|
|
|
|
|
|
|
status = RpcBindingFree(&hBinding);
|
|
|
|
if (status)
|
|
|
|
{
|
|
|
|
TRACE("RpcBindingFree returned 0x%x\n", status);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-14 12:17:08 +00:00
|
|
|
|
2017-06-25 12:14:35 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserDebugTrace(
|
|
|
|
_In_opt_ LPWSTR ServerName,
|
|
|
|
_In_ PCHAR Buffer)
|
|
|
|
{
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserDebugTrace(%s %s)\n",
|
|
|
|
debugstr_w(ServerName), Buffer);
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrDebugTrace(ServerName,
|
|
|
|
Buffer);
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-14 13:44:11 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserQueryEmulatedDomains(
|
|
|
|
_In_opt_ LPWSTR ServerName,
|
|
|
|
_Out_ PBROWSER_EMULATED_DOMAIN *EmulatedDomains,
|
|
|
|
_Out_ LPDWORD EntriesRead)
|
|
|
|
{
|
2017-06-19 14:06:04 +00:00
|
|
|
BROWSER_EMULATED_DOMAIN_CONTAINER Container = {0, NULL};
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserQueryEmulatedDomains(%s %p %p)\n",
|
2017-06-14 13:44:11 +00:00
|
|
|
debugstr_w(ServerName), EmulatedDomains, EntriesRead);
|
|
|
|
|
2017-06-19 14:06:04 +00:00
|
|
|
*EmulatedDomains = NULL;
|
|
|
|
*EntriesRead = 0;
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrQueryEmulatedDomains(ServerName,
|
|
|
|
&Container);
|
|
|
|
|
|
|
|
if (status == NERR_Success)
|
|
|
|
{
|
|
|
|
*EmulatedDomains = (PBROWSER_EMULATED_DOMAIN)Container.Buffer;
|
|
|
|
*EntriesRead = Container.EntriesRead;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-24 14:59:14 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserQueryOtherDomains(
|
|
|
|
_In_opt_ LPCWSTR ServerName,
|
|
|
|
_Out_ LPBYTE *BufPtr,
|
|
|
|
_Out_ LPDWORD EntriesRead,
|
|
|
|
_Out_ LPDWORD TotalEntries)
|
|
|
|
{
|
|
|
|
SERVER_INFO_100_CONTAINER Level100Container = {0, NULL};
|
|
|
|
SERVER_ENUM_STRUCT EnumStruct;
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserQueryOtherDomains(%s %p %p %p)\n",
|
|
|
|
debugstr_w(ServerName), BufPtr, EntriesRead, TotalEntries);
|
|
|
|
|
|
|
|
EnumStruct.Level = 100;
|
|
|
|
EnumStruct.ServerInfo.Level100 = &Level100Container;
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrQueryOtherDomains((PWSTR)ServerName,
|
|
|
|
&EnumStruct,
|
|
|
|
TotalEntries);
|
|
|
|
|
|
|
|
if (status == NERR_Success || status == ERROR_MORE_DATA)
|
|
|
|
{
|
|
|
|
*BufPtr = (LPBYTE)EnumStruct.ServerInfo.Level100->Buffer;
|
|
|
|
*EntriesRead = EnumStruct.ServerInfo.Level100->EntriesRead;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-25 12:14:35 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserServerEnum(
|
|
|
|
_In_opt_ LPCWSTR ServerName,
|
|
|
|
_In_opt_ LPCWSTR Transport,
|
|
|
|
_In_opt_ LPCWSTR ClientName,
|
|
|
|
_In_ DWORD Level,
|
|
|
|
_Out_ LPBYTE *BufPtr,
|
|
|
|
_In_ DWORD PrefMaxLen,
|
|
|
|
_Out_ LPDWORD EntriesRead,
|
|
|
|
_Out_ LPDWORD TotalEntries,
|
|
|
|
_In_ DWORD ServerType,
|
|
|
|
_In_opt_ LPCWSTR Domain,
|
|
|
|
_Inout_opt_ LPDWORD ResumeHandle)
|
|
|
|
{
|
|
|
|
SERVER_INFO_100_CONTAINER Level100Container = {0, NULL};
|
|
|
|
SERVER_ENUM_STRUCT EnumStruct;
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserServerEnum(%s %s %s %lu %p %lu %p %p %lu %s %p)\n",
|
|
|
|
debugstr_w(ServerName), debugstr_w(Transport), debugstr_w(ClientName),
|
|
|
|
Level, BufPtr, PrefMaxLen, EntriesRead, TotalEntries, ServerType,
|
|
|
|
debugstr_w(Domain), ResumeHandle);
|
|
|
|
|
|
|
|
EnumStruct.Level = 100;
|
|
|
|
EnumStruct.ServerInfo.Level100 = &Level100Container;
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrServerEnum((PWSTR)ServerName,
|
|
|
|
(PWSTR)Transport,
|
|
|
|
(PWSTR)ClientName,
|
|
|
|
&EnumStruct,
|
|
|
|
PrefMaxLen,
|
|
|
|
TotalEntries,
|
|
|
|
ServerType,
|
|
|
|
(PWSTR)Domain,
|
|
|
|
ResumeHandle);
|
|
|
|
|
|
|
|
if (status == NERR_Success || status == ERROR_MORE_DATA)
|
|
|
|
{
|
|
|
|
*BufPtr = (LPBYTE)EnumStruct.ServerInfo.Level100->Buffer;
|
|
|
|
*EntriesRead = EnumStruct.ServerInfo.Level100->EntriesRead;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-24 14:59:14 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserQueryStatistics(
|
|
|
|
_In_opt_ LPCWSTR ServerName,
|
|
|
|
_Inout_ LPBROWSER_STATISTICS *Statistics)
|
|
|
|
{
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserQueryStatistics(%s %p)\n",
|
|
|
|
debugstr_w(ServerName), Statistics);
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrQueryStatistics((PWSTR)ServerName,
|
|
|
|
Statistics);
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-19 14:06:04 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserResetStatistics(
|
|
|
|
_In_opt_ LPCWSTR ServerName)
|
|
|
|
{
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserResetStatistics(%s)\n",
|
|
|
|
debugstr_w(ServerName));
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrResetStatistics((PWSTR)ServerName);
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
2017-06-24 14:59:14 +00:00
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserResetNetlogonState(
|
|
|
|
_In_ LPCWSTR ServerName)
|
|
|
|
{
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserResetNetlogonState(%s)\n",
|
|
|
|
debugstr_w(ServerName));
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrResetNetlogonState((PWSTR)ServerName);
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
2017-06-19 14:06:04 +00:00
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
2017-06-14 13:44:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
I_BrowserSetNetlogonState(
|
|
|
|
_In_ LPWSTR ServerName,
|
|
|
|
_In_ LPWSTR DomainName,
|
|
|
|
_In_ LPWSTR EmulatedServerName,
|
|
|
|
_In_ DWORD Role)
|
|
|
|
{
|
2017-06-19 14:06:04 +00:00
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("I_BrowserSetNetlogonState(%s %s %s %lu)\n",
|
2017-06-14 13:44:11 +00:00
|
|
|
debugstr_w(ServerName), debugstr_w(ServerName),
|
|
|
|
debugstr_w(EmulatedServerName), Role);
|
|
|
|
|
2017-06-19 14:06:04 +00:00
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = I_BrowserrSetNetlogonState(ServerName,
|
|
|
|
DomainName,
|
|
|
|
EmulatedServerName,
|
|
|
|
Role);
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
2017-06-14 13:44:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-24 21:47:27 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
NetBrowserStatisticsGet(
|
|
|
|
_In_ LPWSTR ServerName,
|
|
|
|
_In_ DWORD Level,
|
|
|
|
_Out_ LPBYTE *Buffer)
|
|
|
|
{
|
|
|
|
BROWSER_STATISTICS_STRUCT StatisticsStruct;
|
|
|
|
BROWSER_STATISTICS_100_CONTAINER Level100Container = {0, NULL};
|
|
|
|
BROWSER_STATISTICS_101_CONTAINER Level101Container = {0, NULL};
|
|
|
|
NET_API_STATUS status;
|
|
|
|
|
|
|
|
TRACE("NetBrowserStatisticsGet(%s %lu %p)\n",
|
|
|
|
debugstr_w(ServerName), Level, Buffer);
|
|
|
|
|
|
|
|
if (Level != 100 && Level != 101)
|
|
|
|
return ERROR_INVALID_LEVEL;
|
|
|
|
|
|
|
|
StatisticsStruct.Level = Level;
|
|
|
|
switch (Level)
|
|
|
|
{
|
|
|
|
case 100:
|
|
|
|
StatisticsStruct.Statistics.Level100 = &Level100Container;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 101:
|
|
|
|
StatisticsStruct.Statistics.Level101 = &Level101Container;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
|
|
{
|
|
|
|
status = NetrBrowserStatisticsGet(ServerName,
|
|
|
|
Level,
|
|
|
|
&StatisticsStruct);
|
|
|
|
|
|
|
|
switch (Level)
|
|
|
|
{
|
|
|
|
case 100:
|
|
|
|
if (StatisticsStruct.Statistics.Level100->Buffer != NULL)
|
|
|
|
{
|
|
|
|
*Buffer = (LPBYTE)StatisticsStruct.Statistics.Level100->Buffer;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 101:
|
|
|
|
if (StatisticsStruct.Statistics.Level101->Buffer != NULL)
|
|
|
|
{
|
|
|
|
*Buffer = (LPBYTE)StatisticsStruct.Statistics.Level101->Buffer;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
status = I_RpcMapWin32Status(RpcExceptionCode());
|
|
|
|
}
|
|
|
|
RpcEndExcept;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-14 12:17:08 +00:00
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
NetServerEnum(
|
2017-06-14 13:44:11 +00:00
|
|
|
_In_opt_ LMCSTR servername,
|
|
|
|
_In_ DWORD level,
|
|
|
|
_Out_ LPBYTE *bufptr,
|
|
|
|
_In_ DWORD prefmaxlen,
|
|
|
|
_Out_ LPDWORD entriesread,
|
|
|
|
_Out_ LPDWORD totalentries,
|
|
|
|
_In_ DWORD servertype,
|
|
|
|
_In_opt_ LMCSTR domain,
|
|
|
|
_Inout_opt_ LPDWORD resume_handle)
|
2017-06-14 12:17:08 +00:00
|
|
|
{
|
2017-06-24 21:47:27 +00:00
|
|
|
TRACE("NetServerEnum(%s %lu %p %lu %p %p %lu %s %p)\n",
|
2017-06-14 12:17:08 +00:00
|
|
|
debugstr_w(servername), level, bufptr, prefmaxlen, entriesread,
|
|
|
|
totalentries, servertype, debugstr_w(domain), resume_handle);
|
|
|
|
|
2017-06-24 21:47:27 +00:00
|
|
|
if (resume_handle != NULL)
|
|
|
|
*resume_handle = 0;
|
|
|
|
|
|
|
|
return NetServerEnumEx(servername,
|
|
|
|
level,
|
|
|
|
bufptr,
|
|
|
|
prefmaxlen,
|
|
|
|
entriesread,
|
|
|
|
totalentries,
|
|
|
|
servertype,
|
|
|
|
domain,
|
|
|
|
NULL);
|
2017-06-14 12:17:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
|
|
WINAPI
|
|
|
|
NetServerEnumEx(
|
2017-06-14 13:44:11 +00:00
|
|
|
_In_opt_ LMCSTR ServerName,
|
|
|
|
_In_ DWORD Level,
|
|
|
|
_Out_ LPBYTE *Bufptr,
|
|
|
|
_In_ DWORD PrefMaxlen,
|
|
|
|
_Out_ LPDWORD EntriesRead,
|
|
|
|
_Out_ LPDWORD totalentries,
|
|
|
|
_In_ DWORD servertype,
|
|
|
|
_In_opt_ LMCSTR domain,
|
|
|
|
_In_opt_ LMCSTR FirstNameToReturn)
|
2017-06-14 12:17:08 +00:00
|
|
|
{
|
|
|
|
FIXME("NetServerEnumEx(%s %lu %p %lu %p %p %lu %s %s)\n",
|
|
|
|
debugstr_w(ServerName), Level, Bufptr, PrefMaxlen, EntriesRead, totalentries,
|
|
|
|
servertype, debugstr_w(domain), debugstr_w(FirstNameToReturn));
|
|
|
|
|
|
|
|
return ERROR_NO_BROWSER_SERVERS_FOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|