我需要将UNICODE_STRING结构转换为简单的NULL TERMINATED STRING。
typedef
struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
}
UNICODE_STRING, *PUNICODE_STRING;
我无法在MSDN上找到关于它的清洁溶剂。 有人去过吗? 我没有使用.net所以我需要一个原生API解决方案。
非常感谢!
答案 0 :(得分:4)
您应该使用WideCharToMultiByte。作为输出缓冲区大小的估计,您可以使用长度字段 - 但请考虑真正的多字节字符串的情况,在这种情况下,它将失败并返回ERROR_INSUFFICIENT_BUFFER,您需要重新开始使用更大的缓冲区。或者,首先使用输出缓冲区大小0来调用它,因此它会告诉您缓冲区的必要大小。
答案 1 :(得分:1)
编译unicode并转换为ansi时,这似乎对我有用
(由http://support.microsoft.com/kb/138813修改):
HRESULT UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA){
ULONG cbAnsi, cCharacters;
DWORD dwError;
// If input is null then just return the same.
if (pszW == NULL)
{
*ppszA = NULL;
return NOERROR;
}
cCharacters = wcslen(pszW)+1;
cbAnsi = cCharacters*2;
*ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi);
if (NULL == *ppszA)
return E_OUTOFMEMORY;
if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA, cbAnsi, NULL, NULL))
{
dwError = GetLastError();
CoTaskMemFree(*ppszA);
*ppszA = NULL;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR;
}
用法:
LPSTR pszstrA;
UnicodeToAnsi(my_unicode_string.Buffer, &pszstrA);
cout << "My ansi string: (" << pszstrA << ")\r\n";
答案 2 :(得分:0)
WCHAR* UnicodeStringToNulTerminated(UNICODE_STRING* str)
{
WCHAR* result;
if(str == NULL)
return NULL;
result = (WCHAR*)malloc(result->Length + 2);
if(result == NULL)
// raise?
return NULL;
memcpy(result, str->Buffer, str->Length);
result[str->Length] = L'\0';
return result;
}
答案 3 :(得分:0)
由于您没有说明是否需要ANSI或UNICODE以null结尾的字符串,我将假设UNICODE:
#include <string>
UNICODE_STRING us;
// fill us as needed...
std::wstring ws(us.Buffer, us.Length);
// use ws.c_str() where needed...
答案 4 :(得分:0)
转换为ANSI的替代代码,并且不需要UNICODE_STRING中必须作为参数传递给WideCharToMultiByte的unicode字符数。 (注意UNICODE_STRING.Length是一个字节数,而不是unicode字符,如果缓冲区没有以零结尾,则wcslen不起作用。)
UNICODE_STRING tmp;
// ...
STRING dest; // or ANSI_STRING in kernel mode
LONG (WINAPI *RtlUnicodeStringToAnsiString)(PVOID, PVOID, BOOL);
*(FARPROC *)&RtlUnicodeStringToAnsiString =
GetProcAddress(LoadLibraryA("NTDLL.DLL"), "RtlUnicodeStringToAnsiString");
if(!RtlUnicodeStringToAnsiString)
{
return;
}
ULONG unicodeBufferSize = tmp.Length;
dest.Buffer = (PCHAR)malloc(unicodeBufferSize+1); // that must be enough...
dest.Length = 0;
dest.MaximumLength = unicodeBufferSize+1;
RtlUnicodeStringToAnsiString(&dest, &tmp, FALSE);
dest.Buffer[dest.Length] = 0; // now we get it in dest.Buffer