mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
3.7 KiB
179 lines
3.7 KiB
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dpapi.c
|
|
|
|
Abstract:
|
|
|
|
WMI data provider api set
|
|
|
|
Author:
|
|
|
|
16-Jan-1997 AlanWar
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include "wmiump.h"
|
|
#include "trcapi.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 = WmipAnsiToUnicode(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 = WmipUnicodeToAnsi(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 = WmipAnsiToUnicode((PCHAR)String,
|
|
&StringPtr);
|
|
} else {
|
|
StringSize = (wcslen(String) +1) * sizeof(WCHAR);
|
|
wcscpy(StringPtr, String);
|
|
Status = ERROR_SUCCESS;
|
|
}
|
|
|
|
*CountedString = StringSize;
|
|
*BytesUsed = StringSize + sizeof(USHORT);
|
|
|
|
return(Status);
|
|
}
|
|
|