⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdr38key.asm

📁 破解很多程序的序列号算法程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
; history:
; 1.0   initial release
;       tested with: CDRWin V3.8A Beta of 12/27/99
; 1.1   change of Expiration_Word, 0x4a2 blacklisted since 01/19/00,
;       Hi to Egis/Core.
;       also tested with: CDRWIN V3.8A Final of 03/20/00
; 1.2   change of Expiration_Word, 0x4a4 blacklisted since 28/06/00,
;       this is getting boring, why don't you finally use the rest of 
;       your key, Jeff? - i'm getting impatient :=>
; 2.0   option to change expiration range;
;       option to generate cdrwin.dat
;       option to get keycode from cdrwin.dat 
;       option to fix badly cracked cdrwin.dat
;
; tested with:
; - various betas of V3.8A
; - final of V3.8A
; - V3.8B June 2000
; - V3.8B July 2000

; CDRWin/DAO V3.8 Open-Source Keymaker V2.0 
; (C) The Riddler / X-FORCE / UNION

; #########################################################################
    .386
    .model flat, stdcall
    option casemap:none
; #########################################################################

    include \masm32\include\windows.inc

    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib

    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib

    include \masm32\include\comdlg32.inc
    includelib \masm32\lib\comdlg32.lib


; #########################################################################

;== local macros ==

    m2m MACRO M1, M2
        push M2
        pop  M1
    ENDM

    return MACRO arg
        mov eax, arg
        ret
    ENDM

;== local prototypes ==

DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
cdrwin_keyengine PROTO :DWORD
save_dat_routine PROTO :DWORD
dat_routine PROTO :DWORD

; #########################################################################


 .const
    IDC_STATIC          equ -1
    IDD_DIALOG          equ 100
    IDC_NAME            equ 3001
    IDC_EMAIL           equ 3002
    IDC_UNLOCKKEY       equ 3003
    IDC_CHECKKEY        equ 3004
    IDC_CDRWIN          equ 3006
    IDC_DAO             equ 3007
    IDC_MONTHSTART      equ 3010
    IDC_YEARSTART       equ 3011
    IDC_MONTHEND        equ 3012
    IDC_YEAREND         equ 3013
    IDC_RANDOMIZE       equ 3014
    IDC_GETDAT          equ 3100
    IDC_SAVE            equ 3101
    IDC_EDITFAQ         equ 3200

    IDM_EXIT            equ 5000

    MAXSIZE             equ 040h-1
    
 .data
    wsprintfa           dd 0
    userlib             db "user32.dll",0
ALIGN 4
    userfunction        db "wsprintfA",0
ALIGN 4
    lpError1            db "Please enter at least SIX characters!",0
ALIGN 4
    lpError2            db "ARGG! You're blacklisted!",0
ALIGN 4
    lpError3            db "Cannot read file!",0
ALIGN 4
    lpError4            db "Cdrwin.dat file is corrupted!",0
ALIGN 4
    lpError5            db "Date out of range you dummy!",0
ALIGN 4
    lpError6            db "COASTER warning! Bad Crack detected. Want to correct it?",0
ALIGN 4
    lpError7            db "You must enter valid Name/Company and Expiration before you save!",0
ALIGN 4
    lpCaption           db "CDRWin/DAO V3.8 Open-Source Keymaker V2.0",0
ALIGN 4
    lpCode              db "%08lX-%08lX-%08lX-%08lX",0
ALIGN 4
    lpSaved             db "Cdrwin.dat saved!",0
ALIGN 4
    szName              db MAXSIZE+1 dup (0)
ALIGN 4
    szEmail             db MAXSIZE+1 dup (0)
ALIGN 4
    Expiration_Word     dw 04b2h   ; 1.0: can be between 04a2h - 04bah
                                   ; 1.1: can be between 04a4h - 04bch
                                   ; 1.2: can be between 04a7h - 04beh
                                   ; 2.0: user defined                                 
ALIGN 4
    Default_Year        dd 1999
    Default_Month       dd 12      

    Base_Counter        equ 2       
    Base_Year           equ 1900
    Base_Month          equ 1       ; 1=Jan, ..., 12=Dec

    Length_of_Validity  equ 12      ; until now keys were 12 months valid.
                                    ; in V3.8B July'00 Goldenhawk extends it to 15 months?!

ALIGN 4
    szFileFilter        db "All Files (*.*)",0,"*.*",0
                        db "Cdrwin Registration File (cdrwin.dat)",0,"cdrwin.dat",0,0
ALIGN 4
    szFileOpenTitle     db "Select Cdrwin.dat to retrieve registration information...",0
ALIGN 4
    szFileSaveTitle     db "Select Cdrwin path to save Cdrwin.dat...",0
ALIGN 4
    Got_Fixed           db 0        ; Flag if Cdrwin.dat needed Fix and hence new Save
ALIGN 4
    Valid_Data          db 0        ; Flag if Input is valid and Save Cdrwin.dat is allowed

; == following data directly ripped from CDRWin code
ALIGN 4
    Empty_Dat label byte            ; The original cdrwin.dat taken from Cdrwin V3.8B :)
    db 002h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 079h, 0A7h, 0F8h, 04Dh, 043h, 044h, 052h, 04Fh
    db 04Dh, 020h, 052h, 065h, 063h, 06Fh, 072h, 064h, 069h, 06Eh, 067h, 020h, 053h, 06Fh, 066h, 074h
    db 077h, 061h, 072h, 065h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 047h, 06Fh, 06Ch, 064h
    db 065h, 06Eh, 020h, 048h, 061h, 077h, 06Bh, 020h, 054h, 065h, 063h, 068h, 06Eh, 06Fh, 06Ch, 06Fh
    db 067h, 079h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 031h, 032h, 035h, 020h
    db 049h, 06Eh, 064h, 069h, 061h, 06Eh, 020h, 052h, 06Fh, 063h, 06Bh, 020h, 052h, 06Fh, 061h, 064h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 04Dh, 065h, 072h, 072h
    db 069h, 06Dh, 061h, 063h, 06Bh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 04Eh, 048h, 000h, 000h
    db 030h, 033h, 030h, 035h, 034h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 036h, 030h, 033h, 02Dh
    db 034h, 032h, 039h, 02Dh, 031h, 030h, 032h, 037h, 000h, 000h, 000h, 000h, 036h, 030h, 033h, 02Dh
    db 034h, 032h, 039h, 02Dh, 030h, 030h, 037h, 033h, 000h, 000h, 000h, 000h, 044h, 065h, 06Dh, 06Fh
    db 06Eh, 073h, 074h, 072h, 061h, 074h, 069h, 06Fh, 06Eh, 020h, 056h, 065h, 072h, 073h, 069h, 06Fh
    db 06Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 047h, 06Fh, 06Ch, 064h
    db 065h, 06Eh, 020h, 048h, 061h, 077h, 06Bh, 020h, 054h, 065h, 063h, 068h, 06Eh, 06Fh, 06Ch, 06Fh
    db 067h, 079h, 000h, 065h, 02Eh, 064h, 065h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 084h, 0EDh, 077h, 057h
    db 0DAh, 053h, 080h, 027h, 0D9h, 09Dh, 0A6h, 0C4h, 032h, 0D0h, 0EAh, 09Dh, 055h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 018h, 000h, 006h, 000h, 0D0h, 007h, 006h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
               
ALIGN 4
Checksum_Table_1 db 4 dup(0), 7Eh, 88h,    3Eh, 1Ch, 0FCh,    10h, 7Dh, 38h, 82h
    db 98h,    43h, 24h, 0F8h,    21h, 0FAh, 70h,    86h, 0A9h, 0C4h
    db 6Ch,    4, 31h,    87h, 48h, 7Ah, 2 dup(0B9h), 54h, 0F0h
    db 43h,    0F4h, 0E1h, 8Eh, 0CBh, 0CAh, 0FDh, 0Ch,    53h, 89h
    db 0D9h, 72h, 0DBh, 0B7h, 0C5h,    8, 62h,    0Eh, 91h, 76h
    db 0EAh, 30h, 8Dh, 0F4h, 72h, 73h, 0A9h, 8Ah, 0FAh, 4Dh
    db 0B5h, 4 dup(0), 1, 56h, 0CEh, 18h, 2, 0ACh, 9Ch, 31h
    db 3, 0FAh, 52h, 29h, 4, 58h, 39h, 63h,    5, 0Eh,    0F7h, 7Bh
    db 6, 0F4h, 0A5h, 52h, 7, 0A2h,    6Bh, 4Ah, 8, 0B0h, 72h
    db 0C6h, 9, 0E6h, 0BCh,    0DEh, 0Ah, 1Ch,    0EEh, 0F7h, 0Bh
    db 4Ah,    20h, 0EFh, 0Ch,    0E8h, 4Bh, 0A5h, 0Dh, 0BEh, 85h
    db 0BDh, 0Eh, 44h, 0D7h, 94h, 0Fh, 12h,    19h, 8Ch, 5 dup(0)
    db 20h,    0, 14h,    0, 40h,    0, 28h,    0, 60h,    0, 3Ch,    0, 80h
    db 0, 50h, 0, 0A0h, 0, 44h, 0, 0C0h, 0,    78h, 0,    0E0h, 0
    db 6Ch,    2 dup(0), 1, 0A0h, 0, 20h, 1, 0B4h, 0, 40h, 1
    db 88h,    0, 60h,    1, 9Ch,    0, 80h,    1, 0F0h, 0, 0A0h, 1, 0E4h
    db 0, 0C0h, 1, 0D8h, 0,    0E0h, 1, 0CCh, 6 dup(0), 81h, 10h
    db 2 dup(0), 2,    21h, 2 dup(0), 83h, 31h, 2 dup(0), 4, 42h
    db 2 dup(0), 85h, 52h, 2 dup(0), 6, 63h, 2 dup(0), 87h
    db 73h,    2 dup(0), 8, 84h, 2 dup(0), 89h, 94h, 2    dup(0)
    db 0Ah,    0A5h, 2    dup(0),    8Bh, 0B5h, 2 dup(0), 0Ch, 0C6h
    db 2 dup(0), 8Dh, 0D6h,    2 dup(0), 0Eh, 0E7h, 2 dup(0)
    db 8Fh,    0F7h
ALIGN 4
Checksum_Table_2 db 4 dup(0), 0C0h, 0ADh, 55h, 19h, 80h, 5Bh, 0ABh, 32h
    db 40h,    0F6h, 0FEh, 2Bh, 0, 0B7h, 56h, 65h, 0C0h, 1Ah
    db 3, 7Ch, 80h,    0ECh, 0FDh, 57h, 40h, 41h, 0A8h, 4Eh, 0
    db 6Eh,    0ADh, 0CAh, 0C0h, 0C3h,    0F8h, 0D3h, 80h, 35h, 6
    db 0F8h, 40h, 98h, 53h,    0E1h, 0, 0D9h, 0FBh, 0AFh, 0C0h
    db 74h,    0AEh, 0B6h, 80h, 82h, 50h, 9Dh,    40h, 2Fh, 5, 84h
ALIGN 4
Checksum_Table_3 db 4 dup(0), 64h, 10h,    0B7h, 1Dh, 0C8h, 20h, 6Eh, 3Bh
    db 0ACh, 30h, 0D9h, 26h, 90h, 41h, 0DCh, 76h, 0F4h, 51h
    db 2 dup(6Bh), 58h, 61h, 0B2h, 4Dh, 3Ch, 71h, 5, 50h, 20h
    db 83h,    0B8h, 0EDh, 44h, 93h, 0Fh, 0F0h, 0E8h, 0A3h, 2 dup(0D6h)
    db 8Ch,    0B3h, 61h, 0CBh, 0B0h, 0C2h, 64h, 9Bh, 0D4h, 0D2h
    db 0D3h, 86h, 78h, 0E2h, 0Ah, 0A0h, 1Ch, 0F2h, 2 dup(0BDh)
    db 4 dup(0), 1,    10h, 1,    99h, 1,    20h, 1,    82h, 0,    30h, 0
    db 1Bh,    1, 40h,    1, 0B4h, 0, 50h, 0, 2Dh, 0, 60h, 0, 36h
    db 1, 70h, 1, 0AFh, 1, 80h, 1, 0D8h, 0,    90h, 0,    41h, 0
    db 0A0h, 0, 5Ah, 1, 0B0h, 1, 0C3h, 0, 0C0h, 0, 6Ch, 1
    db 0D0h, 1, 0F5h, 1, 0E0h, 1, 0EEh, 0, 0F0h, 0,    77h

include NOTES                       ; looooooong FAQ 

.data?
    BigBuffer               db 50 dup (?)   ; universally used :)
ALIGN 4
    License_Part_1          dd ?
    License_Part_2          dd ?
    License_Part_3          dd ?
    License_Part_4          dd ?

    Check_Part_1            dd ?
    Check_Part_2            dd ?
    Check_Part_3            dd ?
    Check_Part_4            dd ?

    hInstance               HINSTANCE ?
    CommandLine             LPSTR ?
    hWindow                 DWORD ?

    lpTranslated            LPSTR ?         ; not really needed, but M$ Win wants it

    FILESIZE                equ 260        
    SIZEOFDAT               equ 1024        ; cdrwin.dat = 0400h bytes
    szFileNameBuffer        db FILESIZE dup(?)
    ofn                     OPENFILENAME<>
    lpNumberOfBytesRead     dd ?

    DatFileBuffer           db SIZEOFDAT dup(?) ; buffer to contain cdrwin.dat information

    st_                     SYSTEMTIME<>    ; systemtime structure

 .code

start:
    invoke GetModuleHandle, NULL
    mov hInstance, eax
    invoke GetCommandLine
    mov CommandLine, eax
    invoke DialogBoxParam, hInstance, IDD_DIALOG, NULL, addr DlgProc, NULL
    invoke ExitProcess,eax

; ########################################################################
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg == WM_INITDIALOG
        invoke GetDlgItem, hWnd, IDC_NAME
        invoke SetFocus, eax
        invoke LoadLibrary, addr userlib
        push eax
        invoke GetProcAddress, eax, addr userfunction
        mov dword ptr wsprintfa, eax
        pop eax
        invoke FreeLibrary, eax

        invoke SendDlgItemMessage, hWnd, IDC_NAME, EM_SETLIMITTEXT, MAXSIZE-1, 0
        invoke SendDlgItemMessage, hWnd, IDC_EMAIL, EM_SETLIMITTEXT, MAXSIZE-1, 0
        invoke SendDlgItemMessage, hWnd, IDC_MONTHSTART, EM_SETLIMITTEXT, 2, 0
        invoke SendDlgItemMessage, hWnd, IDC_YEARSTART, EM_SETLIMITTEXT, 4, 0

        invoke SetDlgItemInt, hWnd, IDC_MONTHSTART, Default_Month, FALSE
        invoke SetDlgItemInt, hWnd, IDC_YEARSTART, Default_Year, FALSE             

        invoke SendDlgItemMessage, hWnd, IDC_CDRWIN, BM_SETCHECK, 1, 0

        invoke SetDlgItemText, hWnd, IDC_EDITFAQ, addr FAQ_TEXT
    .ELSEIF uMsg == WM_CLOSE
        invoke SendMessage, hWnd, WM_COMMAND, IDM_EXIT, 0
    .ELSEIF uMsg == WM_COMMAND
        mov eax, wParam
        .IF lParam == 0
            .IF ax == IDM_EXIT
                invoke EndDialog, hWnd, NULL
            .ENDIF
        .ELSE
            mov edx, wParam
            shr edx, 16
            .IF dx == BN_CLICKED
                .IF ax == IDC_CDRWIN
                    jmp refresh_codes
                .ELSEIF ax == IDC_DAO
                refresh_codes:
                    mov dx, EN_CHANGE
                    shl edx, 16
                    mov dx, IDC_NAME
                    invoke SendMessage, hWnd, WM_COMMAND, edx, dx
                .ELSEIF ax == IDC_GETDAT
                    invoke dat_routine, hWnd 
                .ELSEIF ax == IDC_SAVE
                    invoke save_dat_routine, hWnd 
                .ENDIF
            .ELSEIF dx == EN_CHANGE
                cmp ax, IDC_NAME
                je proceed_info
                cmp ax, IDC_EMAIL
                je proceed_info
                cmp ax, IDC_MONTHSTART
                je proceed_info
                cmp ax, IDC_YEARSTART
                jne dont_proceed_info

proceed_info:
                invoke cdrwin_keyengine, hWnd
dont_proceed_info:
            .ENDIF
        .ENDIF
    .ELSE
        mov eax, FALSE
        ret
    .ENDIF
    mov eax, TRUE
    ret
DlgProc endp

; ########################################################################

cdrwin_keyengine proc hWnd:HWND
    pusha

; == Check Date Range and adjust Expiration Word
    invoke GetDlgItemInt, hWnd, IDC_YEARSTART, addr lpTranslated, FALSE
    cmp eax, Base_Year
    jae check_month
    invoke SetDlgItemText, hWnd, IDC_UNLOCKKEY, addr lpError5
    invoke SetDlgItemText, hWnd, IDC_CHECKKEY, addr lpError5
    invoke SetDlgItemInt, hWnd, IDC_YEAREND, 0, FALSE    
    invoke SetDlgItemInt, hWnd, IDC_MONTHEND, 0, FALSE   
    mov Valid_Data, 0
    jmp endof_keyengine   
check_month: 
    mov Default_Year, eax
    mov esi, eax
    invoke GetDlgItemInt, hWnd, IDC_MONTHSTART, addr lpTranslated, FALSE
    or eax, eax
    jne month_check_2
    jmp invalid_month
month_check_2:
    cmp eax, 12
    jbe done_date_check
invalid_month:
    invoke SetDlgItemText, hWnd, IDC_UNLOCKKEY, addr lpError5
    invoke SetDlgItemText, hWnd, IDC_CHECKKEY, addr lpError5
    invoke SetDlgItemInt, hWnd, IDC_YEAREND, 0, FALSE    
    invoke SetDlgItemInt, hWnd, IDC_MONTHEND, 0, FALSE   
    mov Valid_Data, 0
    jmp endof_keyengine   
done_date_check:
    mov Default_Month, eax

    mov edi, eax
    mov eax, esi
    mov ecx, 12
    mul ecx
    add eax, edi
    push eax
    add eax, Length_of_Validity     ; yes, 12 months...could've been done easier... 
                                    ; but we want to remain flexible in case of >12 months :)
    xor edx, edx
    mov edi, eax
    div ecx
    push eax
    mul ecx
    pop esi
    sub edi, eax
    jne not_end_of_year
    dec esi
    invoke SetDlgItemInt, hWnd, IDC_YEAREND, esi, FALSE    
    invoke SetDlgItemInt, hWnd, IDC_MONTHEND, 12, FALSE
    jmp done_date_check_2
not_end_of_year:
    invoke SetDlgItemInt, hWnd, IDC_YEAREND, esi, FALSE    
    invoke SetDlgItemInt, hWnd, IDC_MONTHEND, edi, FALSE       
               
done_date_check_2:
    pop eax
    sub eax, Base_Year*12-Base_Counter+Base_Month   ; calculate expiration word
    mov Expiration_Word, ax

; == Name/Company must be at least six characters long
    invoke GetDlgItemText, hWnd, IDC_NAME, addr szName, MAXSIZE
    .IF eax < 6
        invoke SetDlgItemText, hWnd, IDC_UNLOCKKEY, addr lpError1
        invoke SetDlgItemText, hWnd, IDC_CHECKKEY, addr lpError1
        mov Valid_Data, 0
    .ELSE
        invoke GetDlgItemText, hWnd, IDC_EMAIL, addr szEmail, MAXSIZE
        .IF eax < 6
            invoke SetDlgItemText, hWnd, IDC_UNLOCKKEY, addr lpError1
            invoke SetDlgItemText, hWnd, IDC_CHECKKEY, addr lpError1
            mov Valid_Data, 0
        .ELSE

; == Check if CDRWin or DAO Radiobutton

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -