Index: /trunk/include/VBox/dis.h
===================================================================
--- /trunk/include/VBox/dis.h	(revision 41792)
+++ /trunk/include/VBox/dis.h	(revision 41793)
@@ -521,5 +521,5 @@
  * @remark no DECLCALLBACK() here because it's considered to be internal and
  *         there is no point in enforcing CDECL. */
-typedef size_t FNDISPARSE(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis);
+typedef size_t FNDISPARSE(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam);
 /** Pointer to a disassembler parser function. */
 typedef FNDISPARSE *PFNDISPARSE;
Index: /trunk/src/VBox/Disassembler/DisasmCore.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41792)
+++ /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41793)
@@ -520,5 +520,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t disParseInstruction(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis)
+static size_t disParseInstruction(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, size_t cbExtra)
 {
     size_t size = 0;
@@ -570,5 +570,5 @@
     if (pOp->idxParse1 != IDX_ParseNop)
     {
-        size += pDis->pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, &pDis->Param1, pDis);
+        size += pDis->pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, pDis, &pDis->Param1);
         if (fFiltered == false) pDis->Param1.cb = DISGetParamSize(pDis, &pDis->Param1);
     }
@@ -576,5 +576,5 @@
     if (pOp->idxParse2 != IDX_ParseNop)
     {
-        size += pDis->pfnDisasmFnTable[pOp->idxParse2](offInstr+size, pOp, &pDis->Param2, pDis);
+        size += pDis->pfnDisasmFnTable[pOp->idxParse2](offInstr+size, pOp, pDis, &pDis->Param2);
         if (fFiltered == false) pDis->Param2.cb = DISGetParamSize(pDis, &pDis->Param2);
     }
@@ -582,15 +582,15 @@
     if (pOp->idxParse3 != IDX_ParseNop)
     {
-        size += pDis->pfnDisasmFnTable[pOp->idxParse3](offInstr+size, pOp, &pDis->Param3, pDis);
+        size += pDis->pfnDisasmFnTable[pOp->idxParse3](offInstr+size, pOp, pDis, &pDis->Param3);
         if (fFiltered == false) pDis->Param3.cb = DISGetParamSize(pDis, &pDis->Param3);
     }
     // else simple one byte instruction
 
-    return size;
+    return size + cbExtra;
 }
 //*****************************************************************************
 /* Floating point opcode parsing */
 //*****************************************************************************
-static size_t ParseEscFP(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseEscFP(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t      size = 0;
@@ -642,8 +642,8 @@
 
     if (fpop->idxParse1 != IDX_ParseNop)
-        size += pDis->pfnDisasmFnTable[fpop->idxParse1](offInstr+size, fpop, pParam, pDis);
+        size += pDis->pfnDisasmFnTable[fpop->idxParse1](offInstr+size, fpop, pDis, pParam);
 
     if (fpop->idxParse2 != IDX_ParseNop)
-        size += pDis->pfnDisasmFnTable[fpop->idxParse2](offInstr+size, fpop, pParam, pDis);
+        size += pDis->pfnDisasmFnTable[fpop->idxParse2](offInstr+size, fpop, pDis, pParam);
 
     return size;
@@ -660,5 +660,5 @@
  *
  ********************************************************************************************************************************/
-static void UseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static void UseSIB(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp);
@@ -709,5 +709,5 @@
 
 
-static size_t ParseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseSIB(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     unsigned size = sizeof(uint8_t);
@@ -741,5 +741,5 @@
 
 
-static size_t ParseSIB_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseSIB_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     unsigned size = sizeof(uint8_t);
@@ -886,5 +886,5 @@
 
 
-static size_t UseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t UseModRM(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     unsigned vtype = OP_PARM_VTYPE(pParam->fParam);
@@ -969,5 +969,5 @@
             if (rm == 4)
             {   /* SIB byte follows ModRM */
-                UseSIB(offInstr, pOp, pParam, pDis);
+                UseSIB(offInstr, pOp, pDis, pParam);
             }
             else
@@ -995,5 +995,5 @@
         case 1: //effective address + 8 bits displacement
             if (rm == 4) {//SIB byte follows ModRM
-                UseSIB(offInstr, pOp, pParam, pDis);
+                UseSIB(offInstr, pOp, pDis, pParam);
             }
             else
@@ -1008,5 +1008,5 @@
         case 2: //effective address + 32 bits displacement
             if (rm == 4) {//SIB byte follows ModRM
-                UseSIB(offInstr, pOp, pParam, pDis);
+                UseSIB(offInstr, pOp, pDis, pParam);
             }
             else
@@ -1063,5 +1063,5 @@
 // Query the size of the ModRM parameters and fetch the immediate data (if any)
 //*****************************************************************************
-static size_t QueryModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis, size_t *pSibInc)
+static size_t QueryModRM(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam, size_t *pSibInc)
 {
     size_t sibinc;
@@ -1085,5 +1085,5 @@
         if (mod != 3 && rm == 4)
         {   /* SIB byte follows ModRM */
-            *pSibInc = ParseSIB(offInstr, pOp, pParam, pDis);
+            *pSibInc = ParseSIB(offInstr, pOp, pDis, pParam);
             offInstr += *pSibInc;
             size += *pSibInc;
@@ -1146,5 +1146,5 @@
 // Query the size of the ModRM parameters and fetch the immediate data (if any)
 //*****************************************************************************
-static size_t QueryModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis, size_t *pSibInc)
+static size_t QueryModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam, size_t *pSibInc)
 {
     size_t sibinc;
@@ -1167,5 +1167,5 @@
         if (mod != 3 && rm == 4)
         {   /* SIB byte follows ModRM */
-            *pSibInc = ParseSIB_SizeOnly(offInstr, pOp, pParam, pDis);
+            *pSibInc = ParseSIB_SizeOnly(offInstr, pOp, pDis, pParam);
             offInstr += *pSibInc;
             size += *pSibInc;
@@ -1221,5 +1221,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseIllegal(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseIllegal(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1229,5 +1229,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseModRM(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = sizeof(uint8_t);   //ModRM byte
@@ -1267,13 +1267,13 @@
         }
     }
-    size += QueryModRM(offInstr, pOp, pParam, pDis, &sibinc);
+    size += QueryModRM(offInstr, pOp, pDis, pParam, &sibinc);
     offInstr += sibinc;
 
-    UseModRM(offInstr, pOp, pParam, pDis);
+    UseModRM(offInstr, pOp, pDis, pParam);
     return size;
 }
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = sizeof(uint8_t);   //ModRM byte
@@ -1314,5 +1314,5 @@
     }
 
-    size += QueryModRM_SizeOnly(offInstr, pOp, pParam, pDis, &sibinc);
+    size += QueryModRM_SizeOnly(offInstr, pOp, pDis, pParam, &sibinc);
     offInstr += sibinc;
 
@@ -1322,5 +1322,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     ////AssertMsgFailed(("??\n"));
@@ -1331,5 +1331,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmByte(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmByte(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1341,5 +1341,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmByte_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmByte_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1348,5 +1348,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmByteSX(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmByteSX(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1374,5 +1374,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmByteSX_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmByteSX_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1381,5 +1381,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmUshort(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmUshort(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1391,5 +1391,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmUshort_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmUshort_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1398,5 +1398,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmUlong(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmUlong(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1408,5 +1408,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmUlong_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmUlong_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1415,5 +1415,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmQword(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmQword(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1425,5 +1425,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmQword_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmQword_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1432,5 +1432,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmV(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmV(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1458,5 +1458,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmV_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmV_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam);
@@ -1469,5 +1469,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmZ(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmZ(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1498,5 +1498,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmZ_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmZ_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam);
@@ -1510,5 +1510,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-static size_t ParseImmBRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmBRel(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1521,5 +1521,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-static size_t ParseImmBRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmBRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
@@ -1529,5 +1529,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-static size_t ParseImmVRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmVRel(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(pOp);
@@ -1557,5 +1557,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-static size_t ParseImmVRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmVRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp); NOREF(pParam);
@@ -1567,5 +1567,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmAddr(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmAddr(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     if (pDis->uAddrMode == DISCPUMODE_32BIT)
@@ -1629,5 +1629,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmAddr_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmAddr_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp);
@@ -1662,5 +1662,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmAddrF(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmAddrF(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     // immediate far pointers - only 16:16 or 16:32; determined by operand, *not* address size!
@@ -1685,5 +1685,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseImmAddrF_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseImmAddrF_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp);
@@ -1704,5 +1704,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseFixedReg(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseFixedReg(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr);
@@ -1805,5 +1805,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseXv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseXv(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr);
@@ -1830,5 +1830,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseXb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseXb(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp);
@@ -1855,5 +1855,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseYv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseYv(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr);
@@ -1880,5 +1880,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseYb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseYb(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     NOREF(offInstr); NOREF(pOp);
@@ -1905,5 +1905,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     PCDISOPCODE   pOpcode;
@@ -1959,10 +1959,9 @@
     }
 
-    size += disParseInstruction(offInstr+size, pOpcode, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseThreeByteEsc4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr+size, pOpcode, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseThreeByteEsc4(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     PCDISOPCODE   pOpcode;
@@ -2020,10 +2019,9 @@
     }
 
-    size += disParseInstruction(offInstr+size, pOpcode, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseThreeByteEsc5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr+size, pOpcode, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseThreeByteEsc5(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     PCDISOPCODE   pOpcode;
@@ -2055,10 +2053,9 @@
         pOpcode = &g_InvalidOpcode[0];
 
-    size += disParseInstruction(offInstr+size, pOpcode, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseNopPause(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr+size, pOpcode, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseNopPause(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2073,10 +2070,9 @@
         pOp = &g_aMapX86_NopPause[0]; /* NOP */
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseImmGrpl(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseImmGrpl(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     int idx = (pDis->bOpCode - 0x80) * 8;
@@ -2092,11 +2088,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseShiftGrp2(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseShiftGrp2(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     int idx;
@@ -2132,11 +2126,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp3(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp3(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     int idx = (pDis->bOpCode - 0xF6) * 8;
@@ -2153,11 +2145,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp4(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2173,11 +2163,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp5(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2193,7 +2181,5 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
+    return disParseInstruction(offInstr, pOp, pDis, size);
 }
 //*****************************************************************************
@@ -2203,5 +2189,5 @@
 //
 //*****************************************************************************
-static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2217,5 +2203,5 @@
     pDis->ModRM.Bits.Reg = MODRM_REG(ModRM);
 
-    size_t modrmsize = QueryModRM(offInstr+sizeof(uint8_t), pOp, pParam, pDis, NULL);
+    size_t modrmsize = QueryModRM(offInstr+sizeof(uint8_t), pOp, pDis, pParam, NULL);
 
     uint8_t opcode = disReadByte(pDis, offInstr+sizeof(uint8_t)+modrmsize);
@@ -2232,12 +2218,10 @@
     }
 
-    size += disParseInstruction(offInstr, pOp, pDis);
     size += sizeof(uint8_t);   //imm8_opcode uint8_t
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp6(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp6(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2253,11 +2237,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp7(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp7(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2281,11 +2263,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp8(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp8(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2301,11 +2281,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp9(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp9(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2321,11 +2299,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2341,11 +2317,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2364,10 +2338,9 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
     size_t size = 0;
@@ -2385,17 +2358,14 @@
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
-{
-    size_t size = 0;
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
+{
     NOREF(pParam);
 
-    unsigned modrm = disReadByte(pDis, offInstr);
-    unsigned reg   = MODRM_REG(modrm);
+    uint8_t modrm = disReadByte(pDis, offInstr);
+    uint8_t reg   = MODRM_REG(modrm);
     if (pDis->fPrefix & DISPREFIX_OPSIZE)
         reg += 8;   //2nd table
@@ -2404,22 +2374,20 @@
 
     //little hack to make sure the ModRM byte is included in the returned size
+    size_t size = 0;
     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
-{
-    size_t size = 0;
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
+{
     NOREF(pParam);
 
-    unsigned modrm = disReadByte(pDis, offInstr);
-    unsigned mod   = MODRM_MOD(modrm);
-    unsigned reg   = MODRM_REG(modrm);
-    unsigned rm    = MODRM_RM(modrm);
+    uint8_t modrm = disReadByte(pDis, offInstr);
+    uint8_t mod   = MODRM_MOD(modrm);
+    uint8_t reg   = MODRM_REG(modrm);
+    uint8_t rm    = MODRM_RM(modrm);
 
     if (mod == 3 && rm == 0)
@@ -2429,28 +2397,25 @@
 
     //little hack to make sure the ModRM byte is included in the returned size
+    size_t size = 0;
     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-    return size;
-}
-//*****************************************************************************
-//*****************************************************************************
-static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISSTATE pDis)
-{
+    return disParseInstruction(offInstr, pOp, pDis, size);
+}
+//*****************************************************************************
+//*****************************************************************************
+static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
+{
+    NOREF(pParam);
+
+    uint8_t modrm = disReadByte(pDis, offInstr);
+    pOp = &g_aMapX86_Group16[MODRM_REG(modrm)];
+
+    //little hack to make sure the ModRM byte is included in the returned size
     size_t size = 0;
-    NOREF(pParam);
-
-    unsigned modrm = disReadByte(pDis, offInstr);
-    unsigned reg   = MODRM_REG(modrm);
-
-    pOp = &g_aMapX86_Group16[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
         size = sizeof(uint8_t); //ModRM byte
 
-    size += disParseInstruction(offInstr, pOp, pDis);
-    return size;
+    return disParseInstruction(offInstr, pOp, pDis, size);
 }
 
@@ -2564,5 +2529,5 @@
             if (opcode != OP_REX)
             {
-                /** Last prefix byte (for SSE2 extension tables); don't include the REX prefix */
+                /* Last prefix byte (for SSE2 extension tables); don't include the REX prefix */
                 pDis->bLastPrefix = opcode;
                 pDis->fPrefix &= ~DISPREFIX_REX;
@@ -2636,5 +2601,5 @@
         pDis->bOpCode  = codebyte;
         pDis->cbPrefix = (uint8_t)offInstr - 1;
-        offInstr += disParseInstruction(offInstr, &paOneByteMap[pDis->bOpCode], pDis);
+        offInstr = disParseInstruction(offInstr, &paOneByteMap[pDis->bOpCode], pDis, offInstr);
         break;
     }
