Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325/* * PROJECT: NetAPI DLL * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0) * PURPOSE: Miscellaneous functions * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org) */
/* INCLUDES ******************************************************************/
#include "netapi32.h"
#include <rpc.h>#include "srvsvc_c.h"#include "wkssvc_c.h"
WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
/* FUNCTIONS *****************************************************************/
NET_API_STATUSWINAPINetRegisterDomainNameChangeNotification( _Out_ PHANDLE NotificationEventHandle){ HANDLE EventHandle; NTSTATUS Status;
TRACE("NetRegisterDomainNameChangeNotification(%p)\n", NotificationEventHandle);
if (NotificationEventHandle == NULL) return ERROR_INVALID_PARAMETER;
EventHandle = CreateEventW(NULL, FALSE, FALSE, NULL); if (EventHandle == NULL) return GetLastError();
Status = LsaRegisterPolicyChangeNotification(PolicyNotifyDnsDomainInformation, NotificationEventHandle); if (!NT_SUCCESS(Status)) { CloseHandle(EventHandle); return NetpNtStatusToApiStatus(Status); }
*NotificationEventHandle = EventHandle;
return NERR_Success;}
NET_API_STATUSWINAPINetStatisticsGet( _In_ LPWSTR server, _In_ LPWSTR service, _In_ DWORD level, _In_ DWORD options, _Out_ LPBYTE *bufptr){ NET_API_STATUS status = ERROR_NOT_SUPPORTED;
TRACE("NetStatisticsGet(%s %s %lu %lu %p)\n", debugstr_w(server), debugstr_w(service), level, options, bufptr);
*bufptr = NULL;
if (_wcsicmp(service, L"LanmanWorkstation") == 0) { if (level != 0) return ERROR_INVALID_LEVEL;
if (options != 0) return ERROR_INVALID_PARAMETER;
RpcTryExcept { status = NetrWorkstationStatisticsGet(server, L"LanmanWorkstation", level, options, (LPSTAT_WORKSTATION_0*)bufptr); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; } else if (_wcsicmp(service, L"LanmanServer") == 0) { if (level != 0) return ERROR_INVALID_LEVEL;
if (options != 0) return ERROR_INVALID_PARAMETER;
RpcTryExcept { status = NetrServerStatisticsGet(server, L"LanmanServer", level, options, (LPSTAT_SERVER_0 *)bufptr); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; }
return status;}
NET_API_STATUSWINAPINetUnregisterDomainNameChangeNotification( _In_ HANDLE NotificationEventHandle){ NTSTATUS Status;
TRACE("NetUnregisterDomainNameChangeNotification(%p)\n", NotificationEventHandle);
if (NotificationEventHandle == NULL) return ERROR_INVALID_PARAMETER;
Status = LsaUnregisterPolicyChangeNotification(PolicyNotifyDnsDomainInformation, NotificationEventHandle);
return NetpNtStatusToApiStatus(Status);}
PSTRWINAPINetpAllocAnsiStrFromWStr( _In_ PWSTR InString){ UNICODE_STRING UnicodeString; ANSI_STRING AnsiString; ULONG Size; NET_API_STATUS NetStatus; NTSTATUS Status;
RtlInitUnicodeString(&UnicodeString, InString);
Size = RtlUnicodeStringToAnsiSize(&UnicodeString); NetStatus = NetApiBufferAllocate(Size, (PVOID*)&AnsiString.Buffer); if (NetStatus != NERR_Success) return NULL;
Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE); if (!NT_SUCCESS(Status)) { NetApiBufferFree(AnsiString.Buffer); return NULL; }
return AnsiString.Buffer;}
PSTRWINAPINetpAllocStrFromWStr( _In_ PWSTR InString){ UNICODE_STRING UnicodeString; OEM_STRING OemString; ULONG Size; NET_API_STATUS NetStatus; NTSTATUS Status;
RtlInitUnicodeString(&UnicodeString, InString);
Size = RtlUnicodeStringToOemSize(&UnicodeString); NetStatus = NetApiBufferAllocate(Size, (PVOID*)&OemString.Buffer); if (NetStatus != NERR_Success) return NULL;
Status = RtlUnicodeStringToOemString(&OemString, &UnicodeString, FALSE); if (!NT_SUCCESS(Status)) { NetApiBufferFree(OemString.Buffer); return NULL; }
return OemString.Buffer;}
PWSTRWINAPINetpAllocWStrFromAnsiStr( _In_ PSTR InString){ ANSI_STRING AnsiString; UNICODE_STRING UnicodeString; ULONG Size; NET_API_STATUS NetStatus; NTSTATUS Status;
RtlInitAnsiString(&AnsiString, InString);
Size = RtlAnsiStringToUnicodeSize(&AnsiString); NetStatus = NetApiBufferAllocate(Size, (PVOID*)&UnicodeString.Buffer); if (NetStatus != NERR_Success) return NULL;
Status = RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE); if (!NT_SUCCESS(Status)) { NetApiBufferFree(UnicodeString.Buffer); return NULL; }
return UnicodeString.Buffer;}
PWSTRWINAPINetpAllocWStrFromStr( _In_ PSTR InString){ OEM_STRING OemString; UNICODE_STRING UnicodeString; ULONG Size; NET_API_STATUS NetStatus; NTSTATUS Status;
RtlInitAnsiString((PANSI_STRING)&OemString, InString);
Size = RtlOemStringToUnicodeSize(&OemString); NetStatus = NetApiBufferAllocate(Size, (PVOID*)&UnicodeString.Buffer); if (NetStatus != NERR_Success) return NULL;
Status = RtlOemStringToUnicodeString(&UnicodeString, &OemString, FALSE); if (!NT_SUCCESS(Status)) { NetApiBufferFree(UnicodeString.Buffer); return NULL; }
return UnicodeString.Buffer;}
PWSTRWINAPINetpAllocWStrFromWStr( _In_ PWSTR InString){ PWSTR OutString; ULONG Size; NET_API_STATUS Status;
Size = (wcslen(InString) + 1) * sizeof(WCHAR); Status = NetApiBufferAllocate(Size, (PVOID*)&OutString); if (Status != NERR_Success) return NULL;
wcscpy(OutString, InString);
return OutString;}
NET_API_STATUSWINAPINetpNtStatusToApiStatus( _In_ NTSTATUS Status){ NET_API_STATUS ApiStatus;
switch (Status) { case STATUS_SUCCESS: ApiStatus = NERR_Success; break;
case STATUS_INVALID_ACCOUNT_NAME: ApiStatus = NERR_BadUsername; break;
case STATUS_USER_EXISTS: ApiStatus = NERR_UserExists; break;
case STATUS_GROUP_EXISTS: ApiStatus = NERR_GroupExists; break;
case STATUS_PASSWORD_RESTRICTION: ApiStatus = NERR_PasswordTooShort; break;
default: ApiStatus = RtlNtStatusToDosError(Status); break; }
return ApiStatus;}
/* EOF */