From: Etaash Mathamsetty etaash.mathamsetty@gmail.com
--- dlls/ntoskrnl.exe/instr.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c index b4c646bb3b2..55a3ea8d0d3 100644 --- a/dlls/ntoskrnl.exe/instr.c +++ b/dlls/ntoskrnl.exe/instr.c @@ -893,31 +893,34 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context ) case 0x38: case 0x39: /* cmp r/m r/m*/ { - BYTE* data = NULL; - BYTE* data2 = NULL; - data = INSTR_GetOperandAddr(context, instr + 1, prefixlen + 1, long_addr, rex, segprefix, &len); - data2 = INSTR_GetOperandAddr(context, instr + 2, prefixlen + 2, long_addr, rex, segprefix, &len); + BYTE* data = INSTR_GetOperandAddr(context, instr + 1, prefixlen + 1, long_addr, rex, segprefix, &len); + BYTE* data2 = INSTR_GetOperandAddr(context, instr + 2, prefixlen + 2, long_addr, rex, segprefix, &len); SIZE_T offset = data - user_shared_data; SIZE_T offset2 = data2 - user_shared_data; SIZE_T data_size = get_op_size(long_op, rex); + BOOL is_user_shared_data = FALSE; if(offset <= KSHARED_USER_DATA_PAGE_SIZE - data_size) { - if(offset2 <= KSHARED_USER_DATA_PAGE_SIZE - data_size) - { - data2 = wine_user_shared_data + offset2; - TRACE("USD offset2 %#x at %p", (unsigned int)offset, (void*)context->Rip); - } - TRACE("USD offset %#x at %p\n",(unsigned int) offset, (void*)context->Rip); - - /* clear ZF and CF */ + TRACE("USD offset %#x at %p\n",(unsigned int) offset, (void*) context->Rip); + data = wine_user_shared_data + offset; + is_user_shared_data = TRUE; + } + if(offset2 <= KSHARED_USER_DATA_PAGE_SIZE - data_size) + { + TRACE("USD offset %#x at %p", (unsigned int) offset2, (void*) context->Rip); + data2 = wine_user_shared_data + offset2; + is_user_shared_data = TRUE; + } + if(is_user_shared_data){ + /* clear ZF and CF */ context->EFlags &= ~(1UL << 6); context->EFlags &= ~(1UL);
- if(*(wine_user_shared_data + offset) == *data2) + if(*data == *data2) { context->EFlags |= (1UL << 6); /* ZF */ } - else if(*(wine_user_shared_data + offset) < *data2){ + else if(*data < *data2){ context->EFlags |= 1UL; /* CF */ } context->Rip += prefixlen + len + 1;