windows-nt/Source/XPSP1/NT/base/wmi/dll/dpapi.c
2020-09-26 16:20:57 +08:00

178 lines
3.7 KiB
C

/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
dpapi.c
Abstract:
WMI data provider api set
Author:
16-Jan-1997 AlanWar
Revision History:
--*/
#include "wmiump.h"
ULONG WmipCountedAnsiToCountedUnicode(
PCHAR Ansi,
PWCHAR Unicode
)
/*++
Routine Description:
Translate a counted ansi string into a counted unicode string.
Conversion may be done inplace, that is Ansi == Unicode.
Arguments:
Ansi is the counted ansi string to convert to UNICODE
Unicode is the buffer to place the converted string into
Return Value:
ERROR_SUCCESS or an error code
--*/
{
PCHAR APtr;
PWCHAR WPtr;
ULONG AnsiSize, UnicodeSize;
ULONG Status;
AnsiSize = *((PUSHORT)Ansi);
APtr = WmipAlloc(AnsiSize + 1);
if (APtr != NULL)
{
memcpy(APtr, Ansi + sizeof(USHORT), AnsiSize);
APtr[AnsiSize] = 0;
WPtr = NULL;
Status = AnsiToUnicode(APtr, &WPtr);
if (Status == ERROR_SUCCESS)
{
UnicodeSize = (wcslen(WPtr)+1) * sizeof(WCHAR);
*Unicode = (USHORT)UnicodeSize;
memcpy(Unicode+1, WPtr, UnicodeSize);
Status = ERROR_SUCCESS;
WmipFree(WPtr);
}
WmipFree(APtr);
} else {
Status = ERROR_NOT_ENOUGH_MEMORY;
}
return(Status);
}
ULONG WmipCountedUnicodeToCountedAnsi(
PWCHAR Unicode,
PCHAR Ansi
)
/*++
Routine Description:
Translate a counted ansi string into a counted unicode string.
Conversion may be done inplace, that is Ansi == Unicode.
Arguments:
Unicode is the counted unicode string to convert to ansi
Ansi is the buffer to place the converted string into
Return Value:
ERROR_SUCCESS or an error code
--*/
{
PCHAR APtr;
PWCHAR WPtr;
ULONG AnsiSize, UnicodeSize;
ULONG Status;
UnicodeSize = *Unicode;
WPtr = WmipAlloc(UnicodeSize + sizeof(WCHAR));
if (WPtr != NULL)
{
memcpy(WPtr, Unicode + 1, UnicodeSize);
WPtr[UnicodeSize/sizeof(WCHAR)] = UNICODE_NULL;
APtr = NULL;
Status = UnicodeToAnsi(WPtr, &APtr, &AnsiSize);
if (Status == ERROR_SUCCESS)
{
*((PUSHORT)Ansi) = (USHORT)AnsiSize;
memcpy(Ansi+sizeof(USHORT), APtr, AnsiSize);
Status = ERROR_SUCCESS;
WmipFree(APtr);
}
WmipFree(WPtr);
} else {
Status = ERROR_NOT_ENOUGH_MEMORY;
}
return(Status);
}
ULONG WmipCopyStringToCountedUnicode(
LPCWSTR String,
PWCHAR CountedString,
ULONG *BytesUsed,
BOOLEAN ConvertFromAnsi
)
/*++
Routine Description:
This routine will copy an ansi ro unicode C string to a counted unicode
string.
Arguments:
String is the ansi or unicode incoming string
Counted string is a pointer to where to write counted unicode string
*BytesUsed returns number of bytes used to build counted unicode string
ConvertFromAnsi is TRUE if String is an ANSI string
Return Value:
ERROR_SUCCESS or an error code
--*/
{
USHORT StringSize;
PWCHAR StringPtr = CountedString+1;
ULONG Status;
if (ConvertFromAnsi)
{
StringSize = (strlen((PCHAR)String) +1) * sizeof(WCHAR);
Status = AnsiToUnicode((PCHAR)String,
&StringPtr);
} else {
StringSize = (wcslen(String) +1) * sizeof(WCHAR);
wcscpy(StringPtr, String);
Status = ERROR_SUCCESS;
}
*CountedString = StringSize;
*BytesUsed = StringSize + sizeof(USHORT);
return(Status);
}