269 lines
4.6 KiB
C
269 lines
4.6 KiB
C
|
/*++
|
|||
|
|
|||
|
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
|