Assembly 怎样才能';新界!对象引用对象';s cmpxchg失败?

Assembly 怎样才能';新界!对象引用对象';s cmpxchg失败?,assembly,64-bit,windows-kernel,Assembly,64 Bit,Windows Kernel,我目前正在进行“实用逆向工程”,其中一项任务要求我反编译“ObFastDereferenceObject”内核例程。程序集的大部分内容相当容易理解,但我无法理解如何使用这个“cmpxchg”指令 我完全理解cmpxchg指令(cmp dest,rax;if equal mov dest,source;else mov rax,dest),但在这个函数中,我看不出cmpxchg如何失败 nt!ObFastDereferenceObject: sub rsp, 28h mov r

我目前正在进行“实用逆向工程”,其中一项任务要求我反编译“ObFastDereferenceObject”内核例程。程序集的大部分内容相当容易理解,但我无法理解如何使用这个“cmpxchg”指令

我完全理解cmpxchg指令(cmp dest,rax;if equal mov dest,source;else mov rax,dest),但在这个函数中,我看不出cmpxchg如何失败

nt!ObFastDereferenceObject:
 sub     rsp, 28h
 mov     r9, rdx
 prefetchw [rcx]
 mov     rax, qword ptr [rcx]
 mov     r8, rax
 xor     r8, rdx
 cmp     r8, 0Fh
 jae     nt!ObFastDereferenceObject+0x29

nt!ObFastDereferenceObject+0x19:
 lea     r8, [rax+1]
 lock cmpxchg qword ptr [rcx], r8
 jne     nt!ObFastDereferenceObject+0x33

nt!ObFastDereferenceObject+0x24:
 add     rsp, 28h
 ret

nt!ObFastDereferenceObject+0x29:
 mov     rcx, r9
 call    nt!ObfDereferenceObject
 jmp     nt!ObFastDereferenceObject+0x24

nt!ObFastDereferenceObject+0x33:
 mov     rdx, rax
 xor     rdx, r9
 cmp     rdx, 0Fh
 jb      nt!ObFastDereferenceObject+0x19

nt!ObFastDereferenceObject+0x3f:
 jmp     nt!ObFastDereferenceObject+0x29
因为(在第4行)rax得到了rcx指向的_EX_FAST_REF结构的副本, 因为rax和rcx以及rcx指向的对象都没有改变, 就我所知,比较rax和[rcx]的cmpxchg应始终计算为相等。
(考虑到只有当此cmpxchg的计算结果为“不相等”时,函数才有一个正在执行的部分,这是极不可能的。)

它是多线程代码。内存中的值可能会被另一个线程更改。它实际上是自我记录的,不必要的
prefetchw
大声喊叫“该值可能已过时,因为它已被提前读取”。