windows-nt/Source/XPSP1/NT/ds/netapi/xactsrv/xsunicod.c

269 lines
4.6 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
XsUnicod.c
Abstract:
This module contains Unicode routines for XACTSRV.
Author:
Shanku Niyogi (w-shankn) 27-Sep-1990
Revision History:
--*/
#include "xactsrvp.h"
#include <prefix.h> // PREFIX_ equates.
LPWSTR
XsDupStrToWStr(
IN LPSTR Src
)
/*++
Routine Description:
This routine is an ANSI->Unicode equivalent of the run-time strdup
function.
Arguments:
Src - A pointer to the source string.
Return Value:
LPWSTR - Pointer to the destination string if successful, NULL otherwise.
Memory must be freed with NetpMemoryFree.
--*/
{
LPWSTR dest = NULL;
if (( dest = NetpMemoryAllocate(sizeof(WCHAR) * ( strlen( Src ) + 1 )))
== NULL ) {
return NULL;
}
NetpCopyStrToWStr( dest, Src );
return dest;
} // XsDupStrToWStr
LPSTR
XsDupWStrToStr(
IN LPWSTR Src
)
/*++
Routine Description:
This routine is a Unicode->ANSI equivalent of the run-time strdup
function.
Arguments:
Src - A pointer to the source string.
Return Value:
LPSTR - Pointer to the destination string if successful, NULL otherwise.
Memory must be freed with NetpMemoryFree.
--*/
{
LPSTR dest = NULL;
if (( dest = NetpMemoryAllocate( NetpUnicodeToDBCSLen( Src ) + 1 )) == NULL ) {
return NULL;
}
NetpCopyWStrToStrDBCS( dest, Src );
return dest;
} // XsDupWStrToStr
LPSTR
XsDupStrToStr(
IN LPSTR Src
)
/*++
Routine Description:
This routine is equivalent to the run-time strdup function, but allocates
memory using NetpMemory functions.
Arguments:
Src - A pointer to the source string.
Return Value:
LPSTR - Pointer to the destination string if successful, NULL otherwise.
Memory must be freed with NetpMemoryFree.
--*/
{
LPSTR dest = NULL;
if (( dest = NetpMemoryAllocate( strlen( Src ) + 1 )) == NULL ) {
return NULL;
}
strcpy( dest, Src );
return dest;
} // XsDupStrToStr
#ifdef UNICODE
VOID
XsCopyTBufToBuf(
OUT LPBYTE Dest,
IN LPBYTE Src,
IN DWORD DestSize
)
/*++
Routine Description:
This routine is a Unicode->ANSI equivalent of the run-time memcpy
function.
Arguments:
Dest - A pointer to the destination buffer.
Src - A pointer to the source buffer.
DestSize - The size, in bytes, of the destination buffer.
Return Value:
none.
--*/
{
DWORD finalDestSize;
NTSTATUS ntStatus;
DWORD srcSize;
if ( (Dest == NULL) || (Src == NULL) || (DestSize == 0) ) {
return;
}
srcSize = WCSSIZE( (LPWSTR) Src );
NetpAssert( srcSize > 0 );
ntStatus = RtlUnicodeToOemN(
(PCHAR) Dest, // OEM string
(ULONG) DestSize, // max bytes in OEM string
(PULONG) & finalDestSize, // bytes in OEM string
(PWSTR) Src, // UNICODE string
(ULONG) srcSize // bytes in UNICODE string
);
if ( !NT_SUCCESS( ntStatus ) ) {
IF_DEBUG(ERRORS) {
NetpKdPrint(( PREFIX_XACTSRV
"XsCopyTBufToBuf: unexpected return code from "
"RtlUnicodeToOemN: " FORMAT_NTSTATUS ".\n",
ntStatus ));
}
}
return;
} // XsCopyTBufToBuf
VOID
XsCopyBufToTBuf(
OUT LPBYTE Dest,
IN LPBYTE Src,
IN DWORD SrcSize
)
/*++
Routine Description:
This routine is a ANSI->Unicode equivalent of the run-time memcpy
function.
Arguments:
Dest - A pointer to the destination buffer.
Src - A pointer to the source buffer.
SrcSize - The size, in bytes, of the source buffer.
Return Value:
none.
--*/
{
DWORD finalDestSize;
DWORD destSize = SrcSize * sizeof(WCHAR); // max byte count for dest.
NTSTATUS ntStatus;
if ( (Dest == NULL) || (Src == NULL) || (SrcSize == 0) ) {
return;
}
NetpAssert( destSize > 0 );
ntStatus = RtlOemToUnicodeN(
(PWSTR) Dest, // UNICODE string
(ULONG) destSize, // max bytes in UNICODE buffer
(PULONG) & finalDestSize, // final bytes in UNICODE buffer
(PCHAR) Src, // OEM string
(ULONG) SrcSize // bytes in OEM string
);
if ( !NT_SUCCESS( ntStatus ) ) {
IF_DEBUG(ERRORS) {
NetpKdPrint(( PREFIX_XACTSRV
"XsCopyBufToTBuf: unexpected return code from "
"RtlOemToUnicodeN: " FORMAT_NTSTATUS ".\n",
ntStatus ));
}
}
} // XsCopyBufToTBuf
#endif // def UNICODE