views:

48

answers:

2

Hello,

I need to understand just 1 single instruction and accordingly I need to generify the things.

I need to pass structures (Objects of User Defined Data Types) at runtime using following assembly code.

Where Following is User Defined Data Type namely WESContext :

 typedef struct CWESContext
 {

     BSTR UserName;
     BSTR MachineIP;
     BSTR Certificate;
     BSTR BrowserClienthandle;//Its the handle of the BrowserClient or Java Application   Level Object
     BSTR SessionID;
     BSTR TaskID;// name of the original task

     long LocaleID;//The location of the ultimate Caller
     long FeatureID;//The feature ID mapping to some feature available in WESFW
     long SessionTypeID;//Itmay be; Browser CLient Session, OPC Client Session,              Authenticated OPC Clients session(as they have more rights), WESFWSystemClient.

     SYSTEMTIME TimeStamp;//the time the original task was executed
     DWORD Priority; //task priority of the original task

     struct WESProductCategory
     {
         BSTR ProductCategoryName;
         int serialNo;

         struct WESDimensions
         {
            int weight;        
            struct WESVolume
            {
                int length;
                int heigth;
                int width;
            } oVolume;

            BSTR tempHeight;
            BSTR otherUnknownDimensions;
        } oDimensions;       
    } oWESProductCategory;
} CWESContext;

I have created the block enough of size WESContext and filled it with sample data.

      int sizeOfWESContext = sizeof(CWESContext);

      void *pWESContext = malloc(sizeOfWESContext); 
      void *pGenericPtr = pWESContext;
      memset(pWESContext,0,sizeOfWESContext);   

      BSTR *bstrUserName = (BSTR*)pGenericPtr;
      *bstrUserName = SysAllocString(CT2OLE(CA2T(results.at(0).c_str())));
      bstrUserName++;

      pGenericPtr = bstrUserName;

      BSTR *bstrMachineIp = (BSTR*)pGenericPtr;
      *bstrMachineIp = SysAllocString(CT2OLE(CA2T(results.at(1).c_str())));
      bstrMachineIp++;

      pGenericPtr = bstrMachineIp;

      BSTR *bstrCertificate = (BSTR*)pGenericPtr;
     *bstrCertificate = SysAllocString(CT2OLE(CA2T(results.at(2).c_str())));
      bstrCertificate++;

      pGenericPtr = bstrCertificate;

            .....................
            so on so forth...............

If I call it by passing this as object:

Calling Normaly : MyCallableMethodUDT(((CWESContext)pWESContext));

Now following assembly i just pulled from Dissasembly view of Visual Studio while debugging.

       mov         esi,dword ptr [pWESContext]  
       sub         esp,58h  
       mov         ecx,16h  
       mov         edi,esp  
       rep movs    dword ptr es:[edi],dword ptr [esi]

I just need to understand 3rd line..

AS I increase members inside my User Defined Structure (i.e here WESContext) it increases but I am unable to conclude how it increases....? I need to generify this instruction so that whatever the Object is and whatever the size and whatever kind of data it contains....it should get pass by calling it with writing assembly instruction as written above.

Regards, Usman

+1  A: 

ecx is used as the count for the number of dwords to be copied by the rep movs instructions in line 5. It's copying data from the starting address pointed to by esi to the location starting at edi.

The value in ecx would be the size of the data that is being copied.

Aaron Klotz
Number of dwords, actually. If the ptrs were `BYTE PTR`, or the instruction were `MOVSB`, then it'd be number of bytes. But the current asm would assemble to the same as `MOVSD`.
cHao
Ah, yes, I failed to notice the presence DWORD PTR in the instruction. Fixed.
Aaron Klotz
A: 

Thanks Alot..So nice of you guys.

Usman