202 lines
4.3 KiB
C++
202 lines
4.3 KiB
C++
/*++
|
||
|
||
Copyright (c) 1991-1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
convert.c
|
||
|
||
Abstract:
|
||
|
||
Contains functions for converting unicode and ansi strings.
|
||
|
||
Author:
|
||
|
||
Dan Lafferty (danl) 04-Jan-1992
|
||
|
||
Environment:
|
||
|
||
User Mode -Win32
|
||
|
||
Notes:
|
||
|
||
optional-notes
|
||
|
||
Revision History:
|
||
|
||
04-Jan-1992 danl
|
||
created
|
||
20-May-1992 JohnRo
|
||
Use CONST where possible.
|
||
|
||
--*/
|
||
|
||
#include <scpragma.h>
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
|
||
#include <windef.h>
|
||
#include <winbase.h> // LocalAlloc
|
||
|
||
#include <string.h>
|
||
#include <scdebug.h> // SC_LOG
|
||
#include <sclib.h> // My prototype.
|
||
|
||
BOOL
|
||
ScConvertToUnicode(
|
||
OUT LPWSTR *UnicodeOut,
|
||
IN LPCSTR AnsiIn
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function translates an AnsiString into a Unicode string.
|
||
A new string buffer is created by this function. If the call to
|
||
this function is successful, the caller must take responsibility for
|
||
the unicode string buffer that was allocated by this function.
|
||
The allocated buffer should be free'd with a call to LocalFree.
|
||
|
||
NOTE: This function allocates memory for the Unicode String.
|
||
|
||
Arguments:
|
||
|
||
AnsiIn - This is a pointer to an ansi string that is to be converted.
|
||
|
||
UnicodeOut - This is a pointer to a location where the pointer to the
|
||
unicode string is to be placed.
|
||
|
||
Return Value:
|
||
|
||
TRUE - The conversion was successful.
|
||
|
||
FALSE - The conversion was unsuccessful. In this case a buffer for
|
||
the unicode string was not allocated.
|
||
|
||
--*/
|
||
{
|
||
|
||
NTSTATUS ntStatus;
|
||
DWORD bufSize;
|
||
UNICODE_STRING unicodeString;
|
||
ANSI_STRING ansiString;
|
||
|
||
//
|
||
// Allocate a buffer for the unicode string.
|
||
//
|
||
|
||
bufSize = ((DWORD) strlen(AnsiIn) + 1) * sizeof(WCHAR);
|
||
|
||
*UnicodeOut = (LPWSTR) LocalAlloc(LMEM_ZEROINIT, bufSize);
|
||
|
||
if (*UnicodeOut == NULL) {
|
||
SC_LOG(ERROR,"ScConvertToUnicode:LocalAlloc Failure %ld\n",GetLastError());
|
||
return(FALSE);
|
||
}
|
||
|
||
//
|
||
// Initialize the string structures
|
||
//
|
||
RtlInitAnsiString( &ansiString, AnsiIn);
|
||
|
||
unicodeString.Buffer = *UnicodeOut;
|
||
unicodeString.MaximumLength = (USHORT)bufSize;
|
||
unicodeString.Length = 0;
|
||
|
||
//
|
||
// Call the conversion function.
|
||
//
|
||
ntStatus = RtlAnsiStringToUnicodeString (
|
||
&unicodeString, // Destination
|
||
&ansiString, // Source
|
||
(BOOLEAN) FALSE); // Allocate the destination
|
||
|
||
if (!NT_SUCCESS(ntStatus)) {
|
||
|
||
SC_LOG(ERROR,
|
||
"ScConvertToUnicode:RtlAnsiStringToUnicodeString Failure %lx\n",
|
||
ntStatus);
|
||
|
||
LocalFree(*UnicodeOut);
|
||
*UnicodeOut = NULL;
|
||
return(FALSE);
|
||
}
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
BOOL
|
||
ScConvertToAnsi(
|
||
OUT LPSTR AnsiOut,
|
||
IN LPCWSTR UnicodeIn
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function translates a UnicodeString into an Ansi string.
|
||
|
||
BEWARE!
|
||
It is assumped that the buffer pointed to by AnsiOut is large
|
||
enough to hold the Unicode String. Check sizes first.
|
||
|
||
If it is desired, UnicodeIn and AnsiIn can point to the same
|
||
location. Since the ansi string will always be smaller than the
|
||
unicode string, translation can take place in the same buffer.
|
||
|
||
Arguments:
|
||
|
||
UnicodeIn - This is a pointer to a unicode that is to be converted.
|
||
|
||
AnsiOut - This is a pointer to a buffer that will contain the
|
||
ansi string on return from this function call.
|
||
|
||
Return Value:
|
||
|
||
TRUE - The conversion was successful.
|
||
|
||
FALSE - The conversion was unsuccessful.
|
||
|
||
--*/
|
||
{
|
||
|
||
NTSTATUS ntStatus;
|
||
UNICODE_STRING unicodeString;
|
||
ANSI_STRING ansiString;
|
||
|
||
//
|
||
// Initialize the string structures
|
||
//
|
||
RtlInitUnicodeString( &unicodeString, UnicodeIn);
|
||
|
||
ansiString.Buffer = AnsiOut;
|
||
ansiString.MaximumLength = unicodeString.MaximumLength;
|
||
ansiString.Length = 0;
|
||
|
||
//
|
||
// Call the conversion function.
|
||
//
|
||
ntStatus = RtlUnicodeStringToAnsiString (
|
||
&ansiString, // Destination
|
||
&unicodeString, // Source
|
||
(BOOLEAN) FALSE); // Allocate the destination
|
||
|
||
if (!NT_SUCCESS(ntStatus)) {
|
||
|
||
|
||
SC_LOG(ERROR,"ScConvertToAnsi:RtlUnicodeStrintToAnsiString Failure %lx\n",
|
||
ntStatus);
|
||
|
||
return(FALSE);
|
||
}
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
|