From 968bdeddf3306aed5dfd2e1be375cd3bef324b60 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 29 May 2019 12:56:43 +0200 Subject: [PATCH] [NETAPI32] Implement NetpAllocWStrFromStr(), NetpAllocWStrFromAnsiStr() (not public, but useful) and NetpAllocWStrFromWStr(). --- dll/win32/netapi32/misc.c | 85 ++++++++++++++++++++++++++++++++ dll/win32/netapi32/netapi32.h | 24 +++++++-- dll/win32/netapi32/netapi32.spec | 4 +- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/dll/win32/netapi32/misc.c b/dll/win32/netapi32/misc.c index 0d236e2ed48..5e541b693f7 100644 --- a/dll/win32/netapi32/misc.c +++ b/dll/win32/netapi32/misc.c @@ -135,6 +135,91 @@ NetUnregisterDomainNameChangeNotification( } +PWSTR +WINAPI +NetpAllocWStrFromAnsiStr( + _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; +} + + +PWSTR +WINAPI +NetpAllocWStrFromStr( + _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; +} + + +PWSTR +WINAPI +NetpAllocWStrFromWStr( + _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_STATUS WINAPI NetpNtStatusToApiStatus( diff --git a/dll/win32/netapi32/netapi32.h b/dll/win32/netapi32/netapi32.h index 451865707ff..7a839ef51ff 100644 --- a/dll/win32/netapi32/netapi32.h +++ b/dll/win32/netapi32/netapi32.h @@ -33,10 +33,6 @@ extern LIST_ENTRY g_EnumContextListHead; extern CRITICAL_SECTION g_EnumContextListLock; -NET_API_STATUS -WINAPI -NetpNtStatusToApiStatus(NTSTATUS Status); - /* misc.c */ NTSTATUS @@ -68,6 +64,26 @@ CopySidFromSidAndRid( _In_ PSID SrcSid, _In_ ULONG RelativeId); +PWSTR +WINAPI +NetpAllocWStrFromAnsiStr( + _In_ PSTR InString); + +PWSTR +WINAPI +NetpAllocWStrFromStr( + _In_ PSTR InString); + +PWSTR +WINAPI +NetpAllocWStrFromWStr( + _In_ PWSTR InString); + +NET_API_STATUS +WINAPI +NetpNtStatusToApiStatus( + _In_ NTSTATUS Status); + /* wksta.c */ BOOL diff --git a/dll/win32/netapi32/netapi32.spec b/dll/win32/netapi32/netapi32.spec index dda3b36b6ed..f4e88244641 100644 --- a/dll/win32/netapi32/netapi32.spec +++ b/dll/win32/netapi32/netapi32.spec @@ -269,8 +269,8 @@ @ stub NetpAllocConfigName @ stub NetpAllocFtinfoEntry @ stub NetpAllocStrFromWStr -@ stub NetpAllocWStrFromStr -@ stub NetpAllocWStrFromWStr +@ stdcall NetpAllocWStrFromStr(str) +@ stdcall NetpAllocWStrFromWStr(wstr) @ stub NetpApiStatusToNtStatus @ stub NetpAssertFailed @ stub NetpCleanFtinfoContext -- 2.17.1