我需要提交快照方法中的page83信息
在进行vss跟踪时,我得到了驱动器的page83,我需要m_rgbIdentifier
BEGIN VDS_LUN_INFORMATION for \\.\PHYSICALDRIVE1: rgLunInformation[0]
BEGIN VDS_STORAGE_DEVICE_ID_DESCRIPTOR m_deviceIdDescriptor[0] BEGIN
VDS_STORAGE_IDENTIFIER m_rgIdentifiers[0,0] m_rgbIdentifier:
m_rgbIdentifier是BYTE的位置
typedef struct _VDS_STORAGE_IDENTIFIER
{
VDS_STORAGE_IDENTIFIER_CODE_SET m_CodeSet;
VDS_STORAGE_IDENTIFIER_TYPE m_Type;
ULONG m_cbIdentifier;
/* [size_is] */ BYTE *m_rgbIdentifier;
} VDS_STORAGE_IDENTIFIER;
和BYTE
typedef unsigned char BYTE;
如何将m_rgbIdentifier转换为任何String类型并传递给REST API
答案 0 :(得分:1)
行BYTE *m_rgbIdentifier;
表示m_rgbIdentifier
是BYTE *
,不是BYTE
。
所以它是unsigned char *
。简单地说它不是(保证是)空终止,但它的长度在m_cbIdentifier
中给出。
如果没有null,你可以转换为普通的C字符串(char *
):
char * str = new char[m_cbIdentifier + 1];
memcpy(str, m_rgbIdentifier, m_cbIdentifier);
str[m_cbIdentifier] = 0;
如果您需要真正的BSTR,则应使用SysAllocString
:
int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_rgbIdentifier,
m_cbIdentifier, NULL, 0);
LPWSTR w = new WCHAR[len];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_rgbIdentifier,
m_cbIdentifier, w, len);
BSTR bstr = SysAllocString(w);
delete[] w;
然后必须使用SysFreeString
释放BSTR。
编辑:
只有当结构中的m_CodeSet
具有值VDSStorageIdCodeSetAscii
= 2时,此答案才有意义。并且以第一种方式获得的C字符串是纯ANSI字符串。如果需要将其转换为Unicode,则必须使用MultiByteToWideChar
。在第二段代码中获得的LPWSTR w
是Unicode(wchar_t)C字符串。