nexmon – Rev 1

Subversion Repositories:
Rev:
default rel
%define XMMWORD
%define YMMWORD
%define ZMMWORD
section .text code align=64

EXTERN  OPENSSL_ia32cap_P

global  asm_RC4

ALIGN   16
asm_RC4:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_asm_RC4:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8
        mov     rcx,r9


        or      rsi,rsi
        jne     NEAR $L$entry
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret
$L$entry:
        push    rbx
        push    r12
        push    r13
$L$prologue:
        mov     r11,rsi
        mov     r12,rdx
        mov     r13,rcx
        xor     r10,r10
        xor     rcx,rcx

        lea     rdi,[8+rdi]
        mov     r10b,BYTE[((-8))+rdi]
        mov     cl,BYTE[((-4))+rdi]
        cmp     DWORD[256+rdi],-1
        je      NEAR $L$RC4_CHAR
        mov     r8d,DWORD[OPENSSL_ia32cap_P]
        xor     rbx,rbx
        inc     r10b
        sub     rbx,r10
        sub     r13,r12
        mov     eax,DWORD[r10*4+rdi]
        test    r11,-16
        jz      NEAR $L$loop1
        bt      r8d,30
        jc      NEAR $L$intel
        and     rbx,7
        lea     rsi,[1+r10]
        jz      NEAR $L$oop8
        sub     r11,rbx
$L$oop8_warmup:
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     DWORD[r10*4+rdi],edx
        add     al,dl
        inc     r10b
        mov     edx,DWORD[rax*4+rdi]
        mov     eax,DWORD[r10*4+rdi]
        xor     dl,BYTE[r12]
        mov     BYTE[r13*1+r12],dl
        lea     r12,[1+r12]
        dec     rbx
        jnz     NEAR $L$oop8_warmup

        lea     rsi,[1+r10]
        jmp     NEAR $L$oop8
ALIGN   16
$L$oop8:
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     ebx,DWORD[rsi*4+rdi]
        ror     r8,8
        mov     DWORD[r10*4+rdi],edx
        add     dl,al
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,bl
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        mov     eax,DWORD[4+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[4+r10*4+rdi],edx
        add     dl,bl
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     ebx,DWORD[8+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[8+r10*4+rdi],edx
        add     dl,al
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,bl
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        mov     eax,DWORD[12+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[12+r10*4+rdi],edx
        add     dl,bl
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     ebx,DWORD[16+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[16+r10*4+rdi],edx
        add     dl,al
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,bl
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        mov     eax,DWORD[20+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[20+r10*4+rdi],edx
        add     dl,bl
        mov     r8b,BYTE[rdx*4+rdi]
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     ebx,DWORD[24+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[24+r10*4+rdi],edx
        add     dl,al
        mov     r8b,BYTE[rdx*4+rdi]
        add     sil,8
        add     cl,bl
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        mov     eax,DWORD[((-4))+rsi*4+rdi]
        ror     r8,8
        mov     DWORD[28+r10*4+rdi],edx
        add     dl,bl
        mov     r8b,BYTE[rdx*4+rdi]
        add     r10b,8
        ror     r8,8
        sub     r11,8

        xor     r8,QWORD[r12]
        mov     QWORD[r13*1+r12],r8
        lea     r12,[8+r12]

        test    r11,-8
        jnz     NEAR $L$oop8
        cmp     r11,0
        jne     NEAR $L$loop1
        jmp     NEAR $L$exit

ALIGN   16
$L$intel:
        test    r11,-32
        jz      NEAR $L$loop1
        and     rbx,15
        jz      NEAR $L$oop16_is_hot
        sub     r11,rbx
$L$oop16_warmup:
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     DWORD[r10*4+rdi],edx
        add     al,dl
        inc     r10b
        mov     edx,DWORD[rax*4+rdi]
        mov     eax,DWORD[r10*4+rdi]
        xor     dl,BYTE[r12]
        mov     BYTE[r13*1+r12],dl
        lea     r12,[1+r12]
        dec     rbx
        jnz     NEAR $L$oop16_warmup

        mov     rbx,rcx
        xor     rcx,rcx
        mov     cl,bl

$L$oop16_is_hot:
        lea     rsi,[r10*4+rdi]
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        pxor    xmm0,xmm0
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[4+rsi]
        movzx   eax,al
        mov     DWORD[rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],0
        jmp     NEAR $L$oop16_enter
ALIGN   16
$L$oop16:
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        pxor    xmm2,xmm0
        psllq   xmm1,8
        pxor    xmm0,xmm0
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[4+rsi]
        movzx   eax,al
        mov     DWORD[rsi],edx
        pxor    xmm2,xmm1
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],0
        movdqu  XMMWORD[r13*1+r12],xmm2
        lea     r12,[16+r12]
$L$oop16_enter:
        mov     edx,DWORD[rcx*4+rdi]
        pxor    xmm1,xmm1
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[8+rsi]
        movzx   ebx,bl
        mov     DWORD[4+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],0
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[12+rsi]
        movzx   eax,al
        mov     DWORD[8+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],1
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[16+rsi]
        movzx   ebx,bl
        mov     DWORD[12+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],1
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[20+rsi]
        movzx   eax,al
        mov     DWORD[16+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],2
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[24+rsi]
        movzx   ebx,bl
        mov     DWORD[20+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],2
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[28+rsi]
        movzx   eax,al
        mov     DWORD[24+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],3
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[32+rsi]
        movzx   ebx,bl
        mov     DWORD[28+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],3
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[36+rsi]
        movzx   eax,al
        mov     DWORD[32+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],4
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[40+rsi]
        movzx   ebx,bl
        mov     DWORD[36+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],4
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[44+rsi]
        movzx   eax,al
        mov     DWORD[40+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],5
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[48+rsi]
        movzx   ebx,bl
        mov     DWORD[44+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],5
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[52+rsi]
        movzx   eax,al
        mov     DWORD[48+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],6
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        mov     eax,DWORD[56+rsi]
        movzx   ebx,bl
        mov     DWORD[52+rsi],edx
        add     cl,al
        pinsrw  xmm1,WORD[rbx*4+rdi],6
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        add     al,dl
        mov     ebx,DWORD[60+rsi]
        movzx   eax,al
        mov     DWORD[56+rsi],edx
        add     cl,bl
        pinsrw  xmm0,WORD[rax*4+rdi],7
        add     r10b,16
        movdqu  xmm2,XMMWORD[r12]
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],ebx
        add     bl,dl
        movzx   ebx,bl
        mov     DWORD[60+rsi],edx
        lea     rsi,[r10*4+rdi]
        pinsrw  xmm1,WORD[rbx*4+rdi],7
        mov     eax,DWORD[rsi]
        mov     rbx,rcx
        xor     rcx,rcx
        sub     r11,16
        mov     cl,bl
        test    r11,-16
        jnz     NEAR $L$oop16

        psllq   xmm1,8
        pxor    xmm2,xmm0
        pxor    xmm2,xmm1
        movdqu  XMMWORD[r13*1+r12],xmm2
        lea     r12,[16+r12]

        cmp     r11,0
        jne     NEAR $L$loop1
        jmp     NEAR $L$exit

ALIGN   16
$L$loop1:
        add     cl,al
        mov     edx,DWORD[rcx*4+rdi]
        mov     DWORD[rcx*4+rdi],eax
        mov     DWORD[r10*4+rdi],edx
        add     al,dl
        inc     r10b
        mov     edx,DWORD[rax*4+rdi]
        mov     eax,DWORD[r10*4+rdi]
        xor     dl,BYTE[r12]
        mov     BYTE[r13*1+r12],dl
        lea     r12,[1+r12]
        dec     r11
        jnz     NEAR $L$loop1
        jmp     NEAR $L$exit

ALIGN   16
$L$RC4_CHAR:
        add     r10b,1
        movzx   eax,BYTE[r10*1+rdi]
        test    r11,-8
        jz      NEAR $L$cloop1
        jmp     NEAR $L$cloop8
ALIGN   16
$L$cloop8:
        mov     r8d,DWORD[r12]
        mov     r9d,DWORD[4+r12]
        add     cl,al
        lea     rsi,[1+r10]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   esi,sil
        movzx   ebx,BYTE[rsi*1+rdi]
        mov     BYTE[rcx*1+rdi],al
        cmp     rcx,rsi
        mov     BYTE[r10*1+rdi],dl
        jne     NEAR $L$cmov0
        mov     rbx,rax
$L$cmov0:
        add     dl,al
        xor     r8b,BYTE[rdx*1+rdi]
        ror     r8d,8
        add     cl,bl
        lea     r10,[1+rsi]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   r10d,r10b
        movzx   eax,BYTE[r10*1+rdi]
        mov     BYTE[rcx*1+rdi],bl
        cmp     rcx,r10
        mov     BYTE[rsi*1+rdi],dl
        jne     NEAR $L$cmov1
        mov     rax,rbx
$L$cmov1:
        add     dl,bl
        xor     r8b,BYTE[rdx*1+rdi]
        ror     r8d,8
        add     cl,al
        lea     rsi,[1+r10]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   esi,sil
        movzx   ebx,BYTE[rsi*1+rdi]
        mov     BYTE[rcx*1+rdi],al
        cmp     rcx,rsi
        mov     BYTE[r10*1+rdi],dl
        jne     NEAR $L$cmov2
        mov     rbx,rax
$L$cmov2:
        add     dl,al
        xor     r8b,BYTE[rdx*1+rdi]
        ror     r8d,8
        add     cl,bl
        lea     r10,[1+rsi]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   r10d,r10b
        movzx   eax,BYTE[r10*1+rdi]
        mov     BYTE[rcx*1+rdi],bl
        cmp     rcx,r10
        mov     BYTE[rsi*1+rdi],dl
        jne     NEAR $L$cmov3
        mov     rax,rbx
$L$cmov3:
        add     dl,bl
        xor     r8b,BYTE[rdx*1+rdi]
        ror     r8d,8
        add     cl,al
        lea     rsi,[1+r10]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   esi,sil
        movzx   ebx,BYTE[rsi*1+rdi]
        mov     BYTE[rcx*1+rdi],al
        cmp     rcx,rsi
        mov     BYTE[r10*1+rdi],dl
        jne     NEAR $L$cmov4
        mov     rbx,rax
$L$cmov4:
        add     dl,al
        xor     r9b,BYTE[rdx*1+rdi]
        ror     r9d,8
        add     cl,bl
        lea     r10,[1+rsi]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   r10d,r10b
        movzx   eax,BYTE[r10*1+rdi]
        mov     BYTE[rcx*1+rdi],bl
        cmp     rcx,r10
        mov     BYTE[rsi*1+rdi],dl
        jne     NEAR $L$cmov5
        mov     rax,rbx
$L$cmov5:
        add     dl,bl
        xor     r9b,BYTE[rdx*1+rdi]
        ror     r9d,8
        add     cl,al
        lea     rsi,[1+r10]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   esi,sil
        movzx   ebx,BYTE[rsi*1+rdi]
        mov     BYTE[rcx*1+rdi],al
        cmp     rcx,rsi
        mov     BYTE[r10*1+rdi],dl
        jne     NEAR $L$cmov6
        mov     rbx,rax
$L$cmov6:
        add     dl,al
        xor     r9b,BYTE[rdx*1+rdi]
        ror     r9d,8
        add     cl,bl
        lea     r10,[1+rsi]
        movzx   edx,BYTE[rcx*1+rdi]
        movzx   r10d,r10b
        movzx   eax,BYTE[r10*1+rdi]
        mov     BYTE[rcx*1+rdi],bl
        cmp     rcx,r10
        mov     BYTE[rsi*1+rdi],dl
        jne     NEAR $L$cmov7
        mov     rax,rbx
$L$cmov7:
        add     dl,bl
        xor     r9b,BYTE[rdx*1+rdi]
        ror     r9d,8
        lea     r11,[((-8))+r11]
        mov     DWORD[r13],r8d
        lea     r12,[8+r12]
        mov     DWORD[4+r13],r9d
        lea     r13,[8+r13]

        test    r11,-8
        jnz     NEAR $L$cloop8
        cmp     r11,0
        jne     NEAR $L$cloop1
        jmp     NEAR $L$exit
ALIGN   16
$L$cloop1:
        add     cl,al
        movzx   ecx,cl
        movzx   edx,BYTE[rcx*1+rdi]
        mov     BYTE[rcx*1+rdi],al
        mov     BYTE[r10*1+rdi],dl
        add     dl,al
        add     r10b,1
        movzx   edx,dl
        movzx   r10d,r10b
        movzx   edx,BYTE[rdx*1+rdi]
        movzx   eax,BYTE[r10*1+rdi]
        xor     dl,BYTE[r12]
        lea     r12,[1+r12]
        mov     BYTE[r13],dl
        lea     r13,[1+r13]
        sub     r11,1
        jnz     NEAR $L$cloop1
        jmp     NEAR $L$exit

ALIGN   16
$L$exit:
        sub     r10b,1
        mov     DWORD[((-8))+rdi],r10d
        mov     DWORD[((-4))+rdi],ecx

        mov     r13,QWORD[rsp]
        mov     r12,QWORD[8+rsp]
        mov     rbx,QWORD[16+rsp]
        add     rsp,24
$L$epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret
$L$SEH_end_asm_RC4:
global  asm_RC4_set_key

ALIGN   16
asm_RC4_set_key:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_asm_RC4_set_key:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8


        lea     rdi,[8+rdi]
        lea     rdx,[rsi*1+rdx]
        neg     rsi
        mov     rcx,rsi
        xor     eax,eax
        xor     r9,r9
        xor     r10,r10
        xor     r11,r11

        mov     r8d,DWORD[OPENSSL_ia32cap_P]
        bt      r8d,20
        jc      NEAR $L$c1stloop
        jmp     NEAR $L$w1stloop

ALIGN   16
$L$w1stloop:
        mov     DWORD[rax*4+rdi],eax
        add     al,1
        jnc     NEAR $L$w1stloop

        xor     r9,r9
        xor     r8,r8
ALIGN   16
$L$w2ndloop:
        mov     r10d,DWORD[r9*4+rdi]
        add     r8b,BYTE[rsi*1+rdx]
        add     r8b,r10b
        add     rsi,1
        mov     r11d,DWORD[r8*4+rdi]
        cmovz   rsi,rcx
        mov     DWORD[r8*4+rdi],r10d
        mov     DWORD[r9*4+rdi],r11d
        add     r9b,1
        jnc     NEAR $L$w2ndloop
        jmp     NEAR $L$exit_key

ALIGN   16
$L$c1stloop:
        mov     BYTE[rax*1+rdi],al
        add     al,1
        jnc     NEAR $L$c1stloop

        xor     r9,r9
        xor     r8,r8
ALIGN   16
$L$c2ndloop:
        mov     r10b,BYTE[r9*1+rdi]
        add     r8b,BYTE[rsi*1+rdx]
        add     r8b,r10b
        add     rsi,1
        mov     r11b,BYTE[r8*1+rdi]
        jnz     NEAR $L$cnowrap
        mov     rsi,rcx
$L$cnowrap:
        mov     BYTE[r8*1+rdi],r10b
        mov     BYTE[r9*1+rdi],r11b
        add     r9b,1
        jnc     NEAR $L$c2ndloop
        mov     DWORD[256+rdi],-1

ALIGN   16
$L$exit_key:
        xor     eax,eax
        mov     DWORD[((-8))+rdi],eax
        mov     DWORD[((-4))+rdi],eax
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret
$L$SEH_end_asm_RC4_set_key:
EXTERN  __imp_RtlVirtualUnwind

ALIGN   16
stream_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        lea     r10,[$L$prologue]
        cmp     rbx,r10
        jb      NEAR $L$in_prologue

        mov     rax,QWORD[152+r8]

        lea     r10,[$L$epilogue]
        cmp     rbx,r10
        jae     NEAR $L$in_prologue

        lea     rax,[24+rax]

        mov     rbx,QWORD[((-8))+rax]
        mov     r12,QWORD[((-16))+rax]
        mov     r13,QWORD[((-24))+rax]
        mov     QWORD[144+r8],rbx
        mov     QWORD[216+r8],r12
        mov     QWORD[224+r8],r13

$L$in_prologue:
        mov     rdi,QWORD[8+rax]
        mov     rsi,QWORD[16+rax]
        mov     QWORD[152+r8],rax
        mov     QWORD[168+r8],rsi
        mov     QWORD[176+r8],rdi

        jmp     NEAR $L$common_seh_exit



ALIGN   16
key_se_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[152+r8]
        mov     rdi,QWORD[8+rax]
        mov     rsi,QWORD[16+rax]
        mov     QWORD[168+r8],rsi
        mov     QWORD[176+r8],rdi

$L$common_seh_exit:

        mov     rdi,QWORD[40+r9]
        mov     rsi,r8
        mov     ecx,154
        DD      0xa548f3fc

        mov     rsi,r9
        xor     rcx,rcx
        mov     rdx,QWORD[8+rsi]
        mov     r8,QWORD[rsi]
        mov     r9,QWORD[16+rsi]
        mov     r10,QWORD[40+rsi]
        lea     r11,[56+rsi]
        lea     r12,[24+rsi]
        mov     QWORD[32+rsp],r10
        mov     QWORD[40+rsp],r11
        mov     QWORD[48+rsp],r12
        mov     QWORD[56+rsp],rcx
        call    QWORD[__imp_RtlVirtualUnwind]

        mov     eax,1
        add     rsp,64
        popfq
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbp
        pop     rbx
        pop     rdi
        pop     rsi
        DB      0F3h,0C3h               ;repret


section .pdata rdata align=4
ALIGN   4
        DD      $L$SEH_begin_asm_RC4 wrt ..imagebase
        DD      $L$SEH_end_asm_RC4 wrt ..imagebase
        DD      $L$SEH_info_asm_RC4 wrt ..imagebase

        DD      $L$SEH_begin_asm_RC4_set_key wrt ..imagebase
        DD      $L$SEH_end_asm_RC4_set_key wrt ..imagebase
        DD      $L$SEH_info_asm_RC4_set_key wrt ..imagebase

section .xdata rdata align=8
ALIGN   8
$L$SEH_info_asm_RC4:
DB      9,0,0,0
        DD      stream_se_handler wrt ..imagebase
$L$SEH_info_asm_RC4_set_key:
DB      9,0,0,0
        DD      key_se_handler wrt ..imagebase