Передача байтового массива в класс поставщика WMI в C ++ - PullRequest
0 голосов
/ 20 марта 2020

У меня есть реализация клиентского приложения WMI на C ++. Я ищу для вызова метода ProtectKeyWithExternalKey класса Win32_EncryptableVolume. Он принимает байтовый массив в качестве параметра (ExternalKey).

uint32 ProtectKeyWithExternalKey(
  [in, optional] string FriendlyName,
  [in, optional] uint8  ExternalKey[],
  [out]          string VolumeKeyProtectorID
);

Когда этот метод будет вызываться с использованием ExecMethod класса IWbemServices, нам нужно установить объект IWbemClassObject для входных параметров и передать его в ExecMethod.

    virtual HRESULT STDMETHODCALLTYPE ExecMethod( 
        /* [in] */ __RPC__in const BSTR strObjectPath,
        /* [in] */ __RPC__in const BSTR strMethodName,
        /* [in] */ long lFlags,
        /* [in] */ __RPC__in_opt IWbemContext *pCtx,
        /* [in] */ __RPC__in_opt IWbemClassObject *pInParams,
        /* [unique][in][out] */ __RPC__deref_opt_inout_opt IWbemClassObject **ppOutParams,
        /* [unique][in][out] */ __RPC__deref_opt_inout_opt IWbemCallResult **ppCallResult) = 0;

При установке IWbemClassObject необходимо установить тип VARIANT.

    virtual HRESULT STDMETHODCALLTYPE Put( 
        /* [string][in] */ LPCWSTR wszName,
        /* [in] */ long lFlags,
        /* [in] */ VARIANT *pVal,
        /* [in] */ CIMTYPE Type) = 0;

Что следует установить в VARIANT (VARTYPE и член объединения) для байтового массива (uint8 [])?

typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;

struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;

Должно ли это быть BYTE * для члена профсоюза? Если да, это будет указатель на неподписанный символ. Как определяется размер байтового массива? Это нулевой символ для конца массива? Другими словами, для передачи байтового массива достаточно uint8 * и не требуется ли размер массива?

И что следует инициализировать для члена VARTYPE? Вот перечисление.

enum VARENUM
    {
        VT_EMPTY    = 0,
        VT_NULL = 1,
        VT_I2   = 2,
        VT_I4   = 3,
        VT_R4   = 4,
        VT_R8   = 5,
        VT_CY   = 6,
        VT_DATE = 7,
        VT_BSTR = 8,
        VT_DISPATCH = 9,
        VT_ERROR    = 10,
        VT_BOOL = 11,
        VT_VARIANT  = 12,
        VT_UNKNOWN  = 13,
        VT_DECIMAL  = 14,
        VT_I1   = 16,
        VT_UI1  = 17,
        VT_UI2  = 18,
        VT_UI4  = 19,
        VT_I8   = 20,
        VT_UI8  = 21,
        VT_INT  = 22,
        VT_UINT = 23,
        VT_VOID = 24,
        VT_HRESULT  = 25,
        VT_PTR  = 26,
        VT_SAFEARRAY    = 27,
        VT_CARRAY   = 28,
        VT_USERDEFINED  = 29,
        VT_LPSTR    = 30,
        VT_LPWSTR   = 31,
        VT_RECORD   = 36,
        VT_INT_PTR  = 37,
        VT_UINT_PTR = 38,
        VT_FILETIME = 64,
        VT_BLOB = 65,
        VT_STREAM   = 66,
        VT_STORAGE  = 67,
        VT_STREAMED_OBJECT  = 68,
        VT_STORED_OBJECT    = 69,
        VT_BLOB_OBJECT  = 70,
        VT_CF   = 71,
        VT_CLSID    = 72,
        VT_VERSIONED_STREAM = 73,
        VT_BSTR_BLOB    = 0xfff,
        VT_VECTOR   = 0x1000,
        VT_ARRAY    = 0x2000,
        VT_BYREF    = 0x4000,
        VT_RESERVED = 0x8000,
        VT_ILLEGAL  = 0xffff,
        VT_ILLEGALMASKED    = 0xfff,
        VT_TYPEMASK = 0xfff
    } ;

Должно ли это быть VT_BLOB?

  • VT_BLOB [P] Длина префикса байтов

Пожалуйста, помогите. Заранее спасибо!

...