/* * String.c * * Author: BreenH * * String utilities in the NT flavor. */ /* * Includes */ #include "precomp.h" #include "tsutilnt.h" /* * Function Implementations */ NTSTATUS NTAPI NtAllocateAndCopyStringA( PSTR *ppDestination, PCSTR pString ) { NTSTATUS Status; PSTR pCopy; ULONG cbString; ASSERT(ppDestination != NULL); cbString = (lstrlenA(pString) + 1) * sizeof(CHAR); pCopy = LocalAlloc(LMEM_FIXED, cbString); if (pCopy != NULL) { RtlCopyMemory(pCopy, pString, cbString); *ppDestination = pCopy; Status = STATUS_SUCCESS; } else { Status = STATUS_NO_MEMORY; } return(Status); } NTSTATUS NTAPI NtAllocateAndCopyStringW( PWSTR *ppDestination, PCWSTR pString ) { NTSTATUS Status; PWSTR pCopy; ULONG cbString; ASSERT(ppDestination != NULL); ASSERT(pString != NULL); cbString = (lstrlenW(pString) + 1) * sizeof(WCHAR); pCopy = LocalAlloc(LMEM_FIXED, cbString); if (pCopy != NULL) { RtlCopyMemory(pCopy, pString, cbString); *ppDestination = pCopy; Status = STATUS_SUCCESS; } else { Status = STATUS_NO_MEMORY; } return(Status); } NTSTATUS NTAPI NtConvertAnsiToUnicode( PWSTR *ppUnicodeString, PCSTR pAnsiString ) { NTSTATUS Status; PWSTR pUnicodeString; ULONG cbAnsiString; ULONG cbBytesWritten; ULONG cbUnicodeString; ASSERT(ppUnicodeString != NULL); ASSERT(pAnsiString != NULL); // // Get the number of bytes in the ANSI string, then get the number of // bytes needed for the Unicode version. None of the Rtl... APIs include // the NULL terminator in their calculations. // cbAnsiString = lstrlenA(pAnsiString); Status = RtlMultiByteToUnicodeSize( &cbUnicodeString, (PCHAR)pAnsiString, cbAnsiString ); if (Status == STATUS_SUCCESS) { // // Allocate a buffer for the Unicode string and its NULL terminator, // then convert the string. // cbUnicodeString += sizeof(WCHAR); pUnicodeString = (PWSTR)LocalAlloc(LPTR, cbUnicodeString); if (pUnicodeString != NULL) { Status = RtlMultiByteToUnicodeN( pUnicodeString, cbUnicodeString, &cbBytesWritten, (PCHAR)pAnsiString, cbAnsiString ); if (Status == STATUS_SUCCESS) { *ppUnicodeString = pUnicodeString; } else { LocalFree(pUnicodeString); } } else { Status = STATUS_NO_MEMORY; } } return(Status); } NTSTATUS NTAPI NtConvertUnicodeToAnsi( PSTR *ppAnsiString, PCWSTR pUnicodeString ) { NTSTATUS Status; PSTR pAnsiString; ULONG cbAnsiString; ULONG cbBytesWritten; ULONG cbUnicodeString; ASSERT(ppAnsiString != NULL); ASSERT(pUnicodeString != NULL); // // Get the number of bytes in the ANSI string, then get the number of // bytes needed for the Unicode version. None of the Rtl... APIs include // the NULL terminator in their calculations. // cbUnicodeString = lstrlenW(pUnicodeString) * sizeof(WCHAR); Status = RtlUnicodeToMultiByteSize( &cbAnsiString, (PWSTR)pUnicodeString, cbUnicodeString ); if (Status == STATUS_SUCCESS) { // // Allocate a buffer for the Unicode string and its NULL terminator, // then convert the string. // cbAnsiString += sizeof(CHAR); pAnsiString = (PSTR)LocalAlloc(LPTR, cbAnsiString); if (pAnsiString != NULL) { Status = RtlUnicodeToMultiByteN( pAnsiString, cbAnsiString, &cbBytesWritten, (PWSTR)pUnicodeString, cbUnicodeString ); if (Status == STATUS_SUCCESS) { *ppAnsiString = pAnsiString; } else { LocalFree(pAnsiString); } } else { Status = STATUS_NO_MEMORY; } } return(Status); }