News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

C++ conversion to ASM

Started by sinsi, February 10, 2019, 10:40:49 PM

Previous topic - Next topic

sinsi

How would I define vtLoc and vtEmpty in asm?

CComVariant vtLoc(CSIDL_DESKTOP);
CComVariant vtEmpty;

🍺🍺🍺

TimoVJL

#1
http://masm32.com/board/index.php?topic=4019.0

vtEmpty.vt = 0
vtLoc.vt = 3 ; VT_I4
vtLoc.I4 = 0 ; CSIDL_DESKTOP

So ?vtLoc VARIANT <3>
vtEmpty VARIANT <0>


EDIT:VARIANT          16 10h bytes
vt               +0h 2h
iVal             +8h 2h
pvRecord         +8h 4h
pRecInfo         +Ch 4h

x64
VARIANT          24 18h bytes
vt               +0h 2h
iVal             +8h 2h
pvRecord         +8h 8h
pRecInfo         +10h 8h
May the source be with you

mabdelouahab


vtEmpty dq 0,0
vtLoc dq 3,0
or
vtEmpty dq VT_EMPTY,0
vtLoc dq VT_I4 ,CSIDL_DESKTOP

X64

vtEmpty dq VT_EMPTY,0,0
vtLoc dq VT_I4 ,CSIDL_DESKTOP,0

sinsi

So in effect

vtEmpty <type=0 (empty),
         0,0,0 (reserved),
         0,0 (no data)>
vtLoc   <type=3 (I4),
         0,0,0 (reserved),
         0 (data=CSIDL_DESKTOP),
         0 (no data)>

Right?
🍺🍺🍺

aw27

PVOID typedef PTR VOID
MAXSIZEISPTR typedef PTR

tagVariant STRUCT
   vt dw ?
   reserved word 3 dup (?)
   union
      struct __tagBRECORD
         pvRecord PVOID ?
         pRecInfo PVOID ?
      ends
      various MAXSIZEISPTR ?      
   ends
tagVariant ends

.data
vtEmpty tagVariant <0,{0,0,0},{{0,0}}>
vtLoc tagVariant   <3,{0,0,0},{{0,0}}>

sinsi

Now that is a lot easier to understand than this

typedef struct tagVARIANT {
  union {
    struct {
      VARTYPE vt;
      WORD    wReserved1;
      WORD    wReserved2;
      WORD    wReserved3;
      union {
        LONGLONG     llVal;
        LONG         lVal;
        BYTE         bVal;
        SHORT        iVal;
        FLOAT        fltVal;
        DOUBLE       dblVal;
        VARIANT_BOOL boolVal;
        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;
        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 {
          PVOID       pvRecord;
          IRecordInfo *pRecInfo;
        } __VARIANT_NAME_4;
      } __VARIANT_NAME_3;
    } __VARIANT_NAME_2;
    DECIMAL decVal;
  } __VARIANT_NAME_1;
} VARIANT;

🍺🍺🍺

mabdelouahab

#6
      VARIANT STRUCT 
          vt              WORD            0
          wReserved1      WORD            0    ; For VT_DECIMAL
          wReserved2      WORD            0    ; For VT_DECIMAL
          wReserved3      WORD            0    ; For VT_DECIMAL
          Union
              lVal            SDWORD          ?   ; VT_I4
              bVal            byte            ?   ; VT_UI1
              iVal            SWORD           ?   ; VT_I2
              fltVal          REAL4           ?   ; VT_R4
              llVal         QWORD           ?   ; VT_I8   
              dblVal          REAL8           ?   ; VT_R8
              boolVal         WORD           ?   ; VT_BOOL
              scode           DWORD           ?   ; VT_ERROR
              cyVal           QWORD           ?   ; VT_CY
              date            QWORD           ?   ; VT_DATE
              bstrVal         DWORD           ?   ; VT_BSTR
              punkVal         DWORD           ?   ; VT_UNKNOWN
              pdispVal        DWORD           ?   ; VT_DISPATCH
              parray          DWORD           ?   ; VT_ARRAY
              pbVal           DWORD           ?   ; VT_BYREF|VT_UI1
              piVal           DWORD           ?   ; VT_BYREF|VT_I2
              plVal           DWORD           ?   ; VT_BYREF|VT_I4
              pfltVal         DWORD           ?   ; VT_BYREF|VT_R4
              pdblVal         DWORD           ?   ; VT_BYREF|VT_R8
              pboolVal        DWORD           ?   ; VT_BYREF|VT_BOOL
              pscode          DWORD           ?   ; VT_BYREF|VT_ERROR
              pcyVal          DWORD           ?   ; VT_BYREF|VT_CY
              pdate           DWORD           ?   ; VT_BYREF|VT_DATE
              pbstrVal        DWORD           ?   ; VT_BYREF|VT_BSTR
              ppunkVal        DWORD           ?   ; VT_BYREF|VT_UNKNOWN
              ppdispVal       DWORD           ?   ; VT_BYREF|VT_DISPATCH
              pparray         DWORD           ?   ; VT_BYREF|VT_ARRAY
              pvarVal         DWORD           ?   ; VT_BYREF|VT_VARIANT
              byref           DWORD           ?   ; Generic ByRef
              cVal            SBYTE           ?   ; VT_I1
              uiVal           WORD            ?   ; VT_UI2
              ulVal           DWORD           ?   ; VT_UI4
              intVal          SWORD           ?   ; VT_int
              uintVal         WORD            ?   ; VT_uint
              pdecVal         DWORD           ?   ; VT_BYREF|VT_DECIMAL
              pcVal           DWORD           ?   ; VT_BYREF|VT_I1
              puiVal          DWORD           ?   ; VT_BYREF|VT_UI2
              pulVal          DWORD           ?   ; VT_BYREF|VT_UI4
              pintVal         DWORD           ?   ; VT_BYREF|VT_int
              puintVal        DWORD           ?   ; VT_BYREF|VT_uint
            STRUCT                        ; for VT_RECORD
               pvRecord   DWORD ?
               pRecInfo   DWORD ?
            ENDS
          ENDS
      VARIANT ENDS

For VT_DECIMAL:

      VARIANT STRUCT                 
          wReserved           SWORD   14           ;    =14 (VT_DECIMAL)
          UNION
            signscale      SWORD   ?
            STRUCT                        
               scale      BYTE    ?         ;   Power of 10
               sign      BYTE    ?         ;   FALSE/TRUE (0,-1)
            ENDS
          ends
          Hi32              SDWORD   ?
          UNION
            Lo64         QWORD   ?
            STRUCT                        
               Lo32      SDWORD    ?
               Mid32      SDWORD    ?
            ENDS
         ends
       VARIANT ENDS

aw27

Structures with nested structures and unions can be a bit tricky to initialize.

Here it will be legit to simple initialize as follows, although a bit confusing:

vtEmpty tagVariant <0>
vtLoc tagVariant   <3>