Yes Vortex, but it is interesting to see what the cpu does.@Loop :
mov [rdi].SECTION_FOUND.Index,r8
lea rcx,[rdi].SECTION_FOUND.Section
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.Name
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.Name,xmm1
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.SizeOfRawData
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.SizeOfRawData,xmm1
movq mm0,QWORD PTR [rsi].IMAGE_SECTION_HEADER.NumberOfRelocations
movq QWORD PTR [rcx].IMAGE_SECTION_HEADER.NumberOfRelocations,mm0
add rdi,SIZEOF SECTION_FOUND
add rsi,SIZEOF IMAGE_SECTION_HEADER
add r8,1
sub rdx,1
jnz @Loop
emms
ret
Here I avoid memcpy I have 96 sections to copy
I think it could be better like this:
@Loop :
mov [rdi].SECTION_FOUND.Index,r8
lea rcx,[rdi].SECTION_FOUND.Section
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.Name
movdqu xmm2,OWORD PTR [rsi].IMAGE_SECTION_HEADER.SizeOfRawData
movq mm0,QWORD PTR [rsi].IMAGE_SECTION_HEADER.NumberOfRelocations
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.Name,xmm1
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.SizeOfRawData,xmm2
movq QWORD PTR [rcx].IMAGE_SECTION_HEADER.NumberOfRelocations,mm0
add rdi,SIZEOF SECTION_FOUND
add rsi,SIZEOF IMAGE_SECTION_HEADER
add r8,1
sub rdx,1
jnz @Loop
emms
ret