; Program written with FASM for the password creation. Passwords consist of characters
; belonging to any combination of these four predefined categories:
;
; * letters A, ..., Z,
; * letters a, ..., z,
; * digits 0, ..., 9,
; * underscore symbol '_'
;
; and the user-defined character set. Number of all possible non-empty character sets
; is equal to 2^224-1 (number of all non-empty subsets of the set containing symbols
; with hexadecimal codes from 0x20 to 0xFF). Maximal length of the generated password is
; equal to 9999 characters. Created password is copied into the clipboard by pushing the
; button with icon.
;
; Special hotkey WIN + F12 defined by application, generates a new password and copies
; it into the clipboard (also if the application window is not active)
;
; Program settings such as length of the created passwords and password character set
; are saved in the registry key
;
; HKEY_CURRENT_USER\Software\SimPaGen\<program_version>
;
; when the application ends.
;
; Application uses CryptoAPI functions from 'advapi32.dll' library in order to gain
; "cryptographically random" sequence of the password characters.
;
; This source file of the application contains embedded data of the manifest and the
; program icons.
;
; Program is an example of the edit fields subclassing method.
;
; (C) Mikołaj Hajduk, 11.09.2008.
;
; Homepage: http://mikhajduk.houa.org
; E-mail: mikhajduk@gmail.com
;
format PE GUI 4.0
; Include the file containing all necessary FASM macros used in the program.
;
include 'win32wx.inc'
; Select the code page used to encoding the source file.
;
include '\ENCODING\utf8.inc'
; Information about the actual version of the application.
;
PROG_VERSION equ '2008.09.11.0'
; Definition of the global data.
;
section '.data' data readable writeable
; Strings containing names of the classes predefined in Windows system.
;
_edit du 'EDIT', 0
_button du 'BUTTON', 0
_static du 'STATIC', 0
; Strings containing names of the classes defined in the program.
;
_MainClass du 'SimPaGen', 0
_PassPanelClass du 'PassPanel', 0
_CharPanelClass du 'CharPanel', 0
; Definitions of the window classes used in the program.
;
MainClass WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _MainClass
PassPanelClass WNDCLASS 0, PassPanelProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _PassPanelClass
CharPanelClass WNDCLASS 0, CharPanelProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _CharPanelClass
; Handle to the font used to print strings in the program controls.
;
Font dd ?
; Structure containing information about the processed message.
;
msg MSG
; Handle to the application module.
;
hInstance dd ?
; Handle to the password panel where passwords are created.
;
PassPanel dd ?
; Handle to the character panel where character set for the created
; passwords is defined.
;
CharPanel dd ?
; Array which defines the characteristic function of the password character set.
;
CharFun rd 7
; Array which contains string representation of created passwords length.
;
PassLen du '10'
rb 6
; Set of flags informing about state of the check boxes corresponding to the
; predefined categories of characters.
;
Flags dw 0
; Section containing executable code.
;
section '.code' code readable writeable executable
start:
; We make sure of the 'comctl32.dll' library loading. It's necessary
; for proper work of the manifest.
;
invoke InitCommonControls
; Get the application module handle.
;
invoke GetModuleHandle, 0
test eax, eax
jz error
mov [hInstance], eax
invoke LoadIcon, eax, ID_MAINICON
test eax, eax
jz error
mov [MainClass.hIcon], eax
invoke LoadCursor, 0, IDC_ARROW
test eax, eax
jz error
mov [MainClass.hCursor], eax
; Register the window classes used in the program.
;
invoke RegisterClass, MainClass
test ax, ax
jz error
invoke RegisterClass, CharPanelClass
test ax, ax
jz error
invoke RegisterClass, PassPanelClass
test ax, ax
jz error
invoke CreateWindowEx, 0, _MainClass, <"SimPaGen v.", PROG_VERSION>, WS_VISIBLE + WS_SYSMENU + WS_CAPTION + WS_MINIMIZEBOX,\
144, 128, 300, 332, NULL, 0, [hInstance], NULL
test eax, eax
jz error
; Message processing loop.
;
msg_loop:
invoke GetMessage, msg, NULL, 0, 0
cmp eax, -1
je error
cmp eax, 1
jb end_loop
jne msg_loop
; Determine if given message is intended for any panel. If yes then
; message is processed in order to proper reaction to TAB and cursor
; keys pressing (selection of the panel controls).
;
invoke IsDialogMessage, [PassPanel], msg
test eax, eax
jnz msg_loop
invoke IsDialogMessage, [CharPanel], msg
test eax, eax
jnz msg_loop
invoke TranslateMessage, msg
invoke DispatchMessage, msg
jmp msg_loop
error:
stdcall ShowLastError, NULL
end_loop:
invoke ExitProcess, [msg.wParam]
; Application window procedure.
;
proc WindowProc, hwnd, wmsg, wparam, lparam
locals
Disposition dd ?
endl
push ebx esi edi
cmp [wmsg], WM_CREATE
je .wmcreate
cmp [wmsg], WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
.wmcreate:
; Create the font used in labels, buttons and edit controls.
;
invoke CreateFont, 16, 0, 0, 0, 0, FALSE, FALSE, FALSE,\
DEFAULT_CHARSET, OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY, FIXED_PITCH + FF_DONTCARE, "Tahoma"
test eax, eax
jz .failed
mov [Font], eax
; Create registry key (or open it if already exists) associated with application.
;
lea ebx, [Disposition]
invoke RegCreateKeyEx, HKEY_CURRENT_USER, .KeyName, 0, 0, REG_OPTION_NON_VOLATILE,\
KEY_ALL_ACCESS, 0, .hKey, ebx
test eax, eax
jnz .failed
; Check if value returned by the function 'RegCreateKeyEx' in the variable
; 'Disposition' informs about the new registry key creation.
;
cmp dword [ebx], REG_CREATED_NEW_KEY
jne .CreatePanels
; If the new registry key has been created then default values (defining
; password length and password characters set) are saved in the registry key.
;
.SaveStartRegValues:
; Allocate a memory block used as a buffer for registry key values.
;
invoke LocalAlloc, LMEM_ZEROINIT, 29
test eax, eax
jz .failed
xchg ebx, eax
; Save the set of flags determining state of the check boxes associated
; with the predefined categories of characters (letters A-Z and digits 0-9
; are used by default).
;
mov byte [ebx], 5 ; [A-Z] + [0-9]
invoke RegSetValueEx, [.hKey], .FlagsRegVal, 0, REG_BINARY, ebx, 2
test eax, eax
jnz .failed
lea eax, [ebx + 1] ; eax := ebx + 1
; Save the characteristic function of the password characters set (excluding
; the predefined categories of characters).
;
invoke RegSetValueEx, [.hKey], .CharFunRegVal, 0, REG_BINARY, eax, 28
test eax, eax
jnz .failed
; Free a memory block used as a buffer.
;
invoke LocalFree, ebx
test eax, eax
jnz .failed
; Save string defining default password length.
;
invoke RegSetValueEx, [.hKey], .PassLenRegVal, 0, REG_SZ, PassLen, 10
test eax, eax
jnz .failed
.CreatePanels:
; Create the password panel where passwords are generated.
;
invoke CreateWindowEx, NULL,\
_PassPanelClass, 0,\
WS_VISIBLE + WS_CHILD,\
15, 10, 265, 172, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
mov [PassPanel], eax
; Create the character panel where we define the character set for
; created passwords.
;
invoke CreateWindowEx, NULL,\
_CharPanelClass, 0,\
WS_VISIBLE + WS_CHILD,\
15, 192, 265, 95, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
mov [CharPanel], eax
; Load the characteristic function of the password characters set
; from the registry key associated with application.
;
invoke RegQueryValueEx, [.hKey], .CharFunRegVal, 0, 0, CharFun, .CharFunBufSize
test eax, eax
jnz .failed
; Load the string representation of the password length.
;
invoke RegQueryValueEx, [.hKey], .PassLenRegVal, 0, 0, PassLen, .PassLenBufSize
test eax, eax
jnz .failed
; Copy this string into the 'ID_PASSLEN' edit field.
;
invoke SendDlgItemMessage, [PassPanel], ID_PASSLEN, WM_SETTEXT, 0, PassLen
; Allocate a memory block for the user-defined character set.
;
invoke LocalAlloc, LMEM_ZEROINIT, 450
test eax, eax
jz .failed
xchg edi, eax
mov esi, edi
; Loop for the conversion of the characteristic function into the Unicode
; string consisting of user-defined characters.
;
mov eax, 31
xor ebx, ebx
.CreateOtherLoop:
inc al
bt [CharFun - 4], eax
setc bl ; CharTab[x] := al
mov byte [edi], al ; x := x + 2*CharFun[eax - 32]
adc edi, ebx
test al, al
jnz .CreateOtherLoop
; Copy this string into the 'ID_PASSCHARS' edit field.
;
invoke SendDlgItemMessage, [CharPanel], ID_PASSCHARS, WM_SETTEXT, 0, esi
; Load from the registry key the set of flags determining state of the check
; boxes associated with predefined categories of the characters.
;
invoke RegQueryValueEx, [.hKey], .FlagsRegVal, 0, 0, esi, .FlagsBufSize
test eax, eax
jnz .failed
movzx ebx, word [esi]
; In dependence of the flag values set the state of the check boxes.
;
.CheckBox_AZ:
bt ebx, 0
jnc .CheckBox_az
invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX1, BM_CLICK, 0, 0
.CheckBox_az:
bt ebx, 1
jnc .CheckBox_09
invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX2, BM_CLICK, 0, 0
.CheckBox_09:
bt ebx, 2
jnc .CheckBox__
invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX3, BM_CLICK, 0, 0
.CheckBox__:
bt ebx, 3
jnc .FreeMem
invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX4, BM_CLICK, 0, 0
.FreeMem:
; Free a memory block where the user-defined characters were stored.
;
invoke LocalFree, esi
test eax, eax
jnz .failed
; Simulation of pressing the 'Create' button in order to create
; an exemplary password.
;
invoke SendDlgItemMessage, [PassPanel], ID_GENBTN, BM_CLICK, 0, 0
xor eax, eax
jmp .finish
.failed:
stdcall ShowLastError, [hwnd]
or eax, -1
jmp .finish
.wmdestroy:
;
; Save the program settings in the registry key associated with
; the application.
;
; Load to the 'CharFun' array the characteristic function of the password
; characters set.
;
invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0
; In dependency of the flag values some predefined categories of the
; characters are excluded from the characteristic function.
;
movzx ebx, [Flags]
.Modify_AZ:
bt ebx, 0
jnc .Modify_az
xor [CharFun + 4], 07FFFFFEh
.Modify_az:
bt ebx, 1
jnc .Modify_09
xor [CharFun + 8], 07FFFFFEh
.Modify_09:
bt ebx, 2
jnc .Modify__
xor [CharFun], 03FF0000h
.Modify__:
bt ebx, 3
jnc .SaveRegKeyVals
btr dword [CharFun + 4], 31
; Save the string representation of password length, the modified characteristic
; function and set of the flags in the registry key.
;
.SaveRegKeyVals:
invoke RegSetValueEx, [.hKey], .CharFunRegVal, 0, REG_BINARY, CharFun, 28
test eax, eax
jnz .failed
invoke SendDlgItemMessage, [PassPanel], ID_PASSLEN, WM_GETTEXT, 5, PassLen
invoke RegSetValueEx, [.hKey], .PassLenRegVal, 0, REG_SZ, PassLen, 10
test eax, eax
jnz .failed
invoke RegSetValueEx, [.hKey], .FlagsRegVal, 0, REG_BINARY, Flags, 2
test eax, eax
jnz .failed
; Close the registry key associated with the application.
;
invoke RegCloseKey, [.hKey]
test eax, eax
jnz .failed
; Destroy the previously created font.
;
invoke DeleteObject, [Font]
test eax, eax
jz .failed
invoke PostQuitMessage, 0
xor eax, eax
.finish:
pop edi esi ebx
ret
align 4
; Variables used for operations on the registry key.
;
.CharFunBufSize dd 28
.PassLenBufSize dd 10
.FlagsBufSize dd 2
.hKey dd ?
.KeyName du 'Software\SimPaGen\', PROG_VERSION, 0
.CharFunRegVal du 'CharFun', 0
.PassLenRegVal du 'PassLen', 0
.FlagsRegVal du 'Flags', 0
endp
; Password panel window procedure.
;
proc PassPanelProc, hwnd, wmsg, wparam, lparam
locals
Password dd ?
PassLen dd ?
CharTabLen dd ?
endl
; Cryptographic Service Provider's type used in application for
; generation the random sequence of the password characters.
;
PROV_RSA_FULL = 1
; Definition of constants equal to the identifiers of the panel
; controls.
;
ID_GENBTN = 101
ID_CLIPBTN = 102
ID_PASSEDIT = 201
ID_PASSLEN = 202
; Hotkey WIN + F12 identifier.
;
ID_HOTKEY = 1
; Definition of the user messages used for communication with the
; program edit fields.
;
; Constants are defined as WM_USER + 2 in order to avoid possible
; conflicts with the messages DM_GETDEFID and DM_SETDEFID equal to
; WM_USER and WM_USER + 1 respectively which could be sent by the
; 'IsDialogMessage' function.
;
WM_GETPASSLEN = WM_USER + 2
WM_GETCHARSET = WM_USER + 2
push ebx ecx edx esi edi
cmp [wmsg], WM_CREATE
je .wmcreate
cmp [wmsg], WM_COMMAND
je .wmcommand
cmp [wmsg], WM_HOTKEY
je .wmhotkey
cmp [wmsg], WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
.wmcreate:
; Get the Cryptographic Service Provider handle which is assigned
; to the '.hProv' local variable.
;
invoke CryptAcquireContext, .hProv, NULL, NULL, PROV_RSA_FULL, 0
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_GROUPBOX,\
0, 0, 265, 172, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "Password"
test eax, eax
jz .failed
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
_edit, 0,\
WS_VISIBLE + WS_CHILD + WS_VSCROLL + ES_READONLY + ES_AUTOVSCROLL + ES_MULTILINE,\
15, 25, 235, 80, [hwnd], ID_PASSEDIT, [hInstance], NULL
test eax, eax
jz .failed
invoke SendMessage, eax, WM_SETFONT, [Font], FALSE
invoke CreateWindowEx, NULL,\
_static, 0,\
WS_VISIBLE + WS_CHILD + SS_RIGHT,\
15, 128, 50, 20, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "Length:"
test eax, eax
jz .failed
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
_edit, 0,\
WS_VISIBLE + WS_CHILD + ES_RIGHT + WS_TABSTOP,\
70, 128, 50, 20, [hwnd], ID_PASSLEN, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
; Exchange default 'ID_PASSLEN' edit field procedure to the defined in the program
;
invoke SetWindowLong, ebx, GWL_WNDPROC, PassLenEditProc
test eax, eax
jz .failed
mov [PassLenEditProc.OldWndProc], eax
; Maximal length of the input text is set to 4 characters.
;
invoke SendMessage, ebx, EM_SETLIMITTEXT, 4, 0
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + WS_TABSTOP + BS_ICON,\
133, 120, 36, 36, [hwnd], ID_CLIPBTN, [hInstance], NULL
test eax, eax
jz .failed
; Load an icon and set it on the button used for copying generated passwords
; to the clipboard.
;
invoke LoadIcon, [hInstance], ID_COPYICON
test eax, eax
jz .failed
invoke SendDlgItemMessage, [hwnd], ID_CLIPBTN, BM_SETIMAGE, IMAGE_ICON, eax
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + WS_TABSTOP + BS_DEFPUSHBUTTON,\
180, 119, 70, 38, [hwnd], ID_GENBTN, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "Create"
test eax, eax
jz .failed
; Allocate the memory block for the character set used for password
; creation.
;
invoke LocalAlloc, LMEM_ZEROINIT, 224
test eax, eax
jz .failed
mov [.CharTab], eax
; Register the WIN + F12 hot key and associate it with the application window.
;
invoke RegisterHotKey, [hwnd], ID_HOTKEY, MOD_WIN, VK_F12
test eax, eax
jz .failed
xor eax, eax
jmp .finish
.failed:
stdcall ShowLastError, [hwnd]
or eax, -1
jmp .finish
.wmcommand:
mov eax, [wparam]
and eax, 0FFFFh
cmp eax, ID_CLIPBTN
je .copy
cmp eax, ID_GENBTN
jne .defwndproc
; Actions performed if the 'Create' button is hit.
;
.GenBtn:
; Send the user message to the 'ID_PASSLEN' edit field in order to determine
; length of the generated password.
;
invoke SendDlgItemMessage, [hwnd], ID_PASSLEN, WM_GETPASSLEN, 0, 0
test eax, eax
jz .clear
mov [PassLen], eax
; Send the user message to the character panel in order to determine user
; defined character set.
;
invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0
; Loop for transformation the characteristic function of the password character set
; into the array of symbols for created passwords.
;
mov edi, [.CharTab]
mov eax, 31
.FillCharTabLoop:
inc al
bt [CharFun - 4], eax
mov byte [edi], al ; CharTab[x] := al
adc edi, 0 ; x := x + CharFun[eax - 32]
test al, al
jnz .FillCharTabLoop
; Determine length of the character array.
;
sub edi, [.CharTab]
test edi, edi
jz .clear
mov [CharTabLen], edi
; Transform the password length into the number of bytes of the memory
; block needed for the created password.
;
mov ebx, [PassLen]
shl ebx, 1
mov eax, ebx
add eax, 2
; Allocate the memory block for the generated password.
;
invoke LocalAlloc, LMEM_ZEROINIT, eax
test eax, eax
jz .failed
mov [Password], eax
; Fill the allocated buffer with random bytes.
;
invoke CryptGenRandom, [.hProv], ebx, eax
test eax, eax
jz .failed
; Loop for transformation of the generated password bytes into the symbols
; from the defined character set.
;
mov ecx, [PassLen]
mov esi, [Password]
mov edi, esi
mov ebx, [.CharTab]
cld
.GenPasswordLoop:
xor edx, edx
lodsw ;
div [CharTabLen] ;
movzx ax, byte [ebx + edx] ; Password[x] := CharTab[Password[x] mod CharTabLen]
stosw ;
loop .GenPasswordLoop
; Show the generated password in the 'ID_PASSEDIT' edit field.
;
invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, [Password]
; Free the memory block allocated as a buffer for the generated password.
;
invoke LocalFree, [Password]
test eax, eax
jnz .failed
jmp .finish
; Operations performed if the WIN + F12 hotkey is pressed.
;
.wmhotkey:
cmp [wparam], ID_HOTKEY
jne .finish
; New password creation.
;
invoke SendDlgItemMessage, [hwnd], ID_GENBTN, BM_CLICK, 0, 0
; Copy the password if the button with icon was pressed or the hotkey WIN + F12 was used.
;
.copy:
; Determine length of the password in characters and calculate number
; of bytes needed for the copied password.
;
invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXTLENGTH, 0, 0
inc eax
mov ebx, eax
shl eax, 1
; Allocate a memory block for the copied password.
;
invoke GlobalAlloc, GHND + GMEM_DDESHARE, eax ; GHND = GMEM_MOVEABLE + GMEM_ZEROINIT
test eax, eax
jz .failed
; Lock a memory block and return a pointer to its first byte.
;
invoke GlobalLock, eax
test eax, eax
jz .failed
xchg esi, eax
; Open the clipboard and prevent other application from modifying clipboard
; content.
;
invoke OpenClipboard, [hwnd]
test eax, eax
jz .failed
; Clean clipboard, free all handles to data placed in there and associate
; the clipboard with the application window.
;
invoke EmptyClipboard
test eax, eax
jz .failed
; Copy the password to the given buffer.
;
invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXT, ebx, esi
; Place the password on the clipboard in the Unicode format.
;
invoke SetClipboardData, CF_UNICODETEXT, esi
test eax, eax
jz .failed
; Unlock the memory block used as a buffer for the copied password.
;
invoke GlobalUnlock, esi
test eax, eax
jz .failed
; Close the clipboard and enable other applications to access this.
;
invoke CloseClipboard
test eax, eax
jz .failed
jmp .finish
; Clear the 'ID_PASSEDIT' edit field if the character set is empty or length of the password
; is equal to 0.
;
.clear:
invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, 0
jmp .finish
.wmdestroy:
; Free the hotkey WIN + F12 associated with this window.
;
invoke UnregisterHotKey, [hwnd], ID_HOTKEY
test eax, eax
jz .failed
; Free the memory block allocated for the character array.
;
invoke LocalFree, [.CharTab]
test eax, eax
jnz .failed
; Release the handle to the Cryptographic Service Provider.
;
invoke CryptReleaseContext, [.hProv], 0
test eax, eax
jz .failed
xor eax, eax
.finish:
pop edi esi edx ecx ebx
ret
align 4
; Handle to the character array.
;
.CharTab dd ?
; Handle to the Cryptographic Service Provider.
;
.hProv dd ?
endp
; New window procedure of the 'ID_PASSLEN' edit field which allows to determine
; length of the generated password.
;
proc PassLenEditProc, hwnd, wmsg, wparam, lparam
cmp [wmsg], WM_CHAR
je .wmchar
cmp [wmsg], WM_GETPASSLEN
je .wmuser
cmp [wmsg], WM_PASTE ; Block any possibility of pasting
je .finish ; the text into the edit field.
.defwndproc:
invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
; Edit field accepts only the '0', ..., '9' and 'backspace' characters.
;
.wmchar:
mov eax, [wparam]
cmp eax, VK_BACK
je .defwndproc
cmp eax, '0'
jb .finish
cmp eax, '9'
ja .finish
jmp .defwndproc
; If edit field received WM_GETPASSLEN message then numerical value of the stored
; sequence of the decimal digits is calculated. Result value is returned in the eax
; register to the procedure which send user message.
;
.wmuser:
push ebx esi
; Get edit field content.
;
lea esi, [PassLen]
invoke SendMessage, [hwnd], WM_GETTEXT, 5, esi
; Loop for calculation numerical value of the sequence of the decimal
; digits.
;
xor eax, eax
xor ebx, ebx
cld
.Loop:
lodsw
test eax, eax
jz .LoopEnd
; ebx := 10*ebx + (eax - '0')
;
lea ebx, [ebx + 4*ebx] ; ebx := ebx + 4*ebx = 5*ebx
shl ebx, 1 ; ebx := 2*ebx
sub al, '0' ;
add ebx, eax ; ebx := ebx + (eax - '0')
jmp .Loop
.LoopEnd:
xchg eax, ebx
pop esi ebx
.finish:
ret
align 4
; Handle to the old (default) edit field procedure.
;
.OldWndProc dd ?
endp
; Window procedure of the character panel where we define the character set
; for the created passwords.
;
proc CharPanelProc, hwnd, wmsg, wparam, lparam
; Definitions of constants equal to the identifiers of the panel
; controls.
;
ID_CHKBOX1 = 1
ID_CHKBOX2 = 2
ID_CHKBOX3 = 3
ID_CHKBOX4 = 4
ID_PASSCHARS = 101
push ebx
cmp [wmsg], WM_CREATE
je .wmcreate
cmp [wmsg], WM_COMMAND
je .wmcommand
cmp [wmsg], WM_GETCHARSET
je .wmuser
cmp [wmsg], WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
.wmcreate:
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_GROUPBOX,\
0, 0, 265, 95, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "Used chars"
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\
27, 25, 40, 17, [hwnd], ID_CHKBOX1, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "A-Z"
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\
87, 25, 40, 17, [hwnd], ID_CHKBOX2, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "a-z"
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\
147, 25, 40, 17, [hwnd], ID_CHKBOX3, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "0-9"
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_button, 0,\
WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\
207, 25, 40, 17, [hwnd], ID_CHKBOX4, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "_"
test eax, eax
jz .failed
invoke CreateWindowEx, NULL,\
_static, 0,\
WS_VISIBLE + WS_CHILD + SS_RIGHT,\
27, 60, 50, 20, [hwnd], 0, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
invoke SetWindowText, ebx, "Other:"
test eax, eax
jz .failed
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
_edit, 0,\
WS_VISIBLE + WS_CHILD + ES_AUTOHSCROLL + WS_TABSTOP,\
82, 60, 155, 20, [hwnd], ID_PASSCHARS, [hInstance], NULL
test eax, eax
jz .failed
xchg ebx, eax
invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE
; Exchange default window procedure of 'ID_PASSCHARS' edit field to the new
; procedure defined in the program.
;
invoke SetWindowLong, ebx, GWL_WNDPROC, PassCharsEditProc
test eax, eax
jz .failed
mov [PassCharsEditProc.OldWndProc], eax
xor eax, eax
jmp .finish
.failed:
stdcall ShowLastError, [hwnd]
or eax, -1
jmp .finish
; If received message applies to any check box, then value of the proper flag
; is changed.
;
.wmcommand:
mov eax, [wparam]
and eax, 0FFFFh
jz .defwndproc
cmp eax, ID_CHKBOX4
ja .defwndproc
dec eax
btc [Flags], ax
jmp .defwndproc
; If panel received WM_GETCHARSET message then it transmits the same message
; to the 'ID_PASSCHARS' edit field in order to add symbols defined by the user
; to the character set.
;
.wmuser:
invoke SendDlgItemMessage, [hwnd], ID_PASSCHARS, WM_GETCHARSET, 0, 0
jmp .finish
.wmdestroy:
xor eax, eax
.finish:
pop ebx
ret
endp
; New window procedure of the 'ID_PASSCHARS' edit field which allows to determine
; the user defined character set.
;
proc PassCharsEditProc, hwnd, wmsg, wparam, lparam
locals
Buffer dd ?
endl
cmp [wmsg], WM_CHAR
je .wmchar
cmp [wmsg], WM_GETCHARSET
je .wmuser
cmp [wmsg], WM_PASTE ; Block any possibility of pasting
je .finish ; the text into the edit field.
.defwndproc:
invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
; Edit field accepts only characters with hex codes from 20h to FFh and the 'backspace'
; character.
;
.wmchar:
mov eax, [wparam]
cmp eax, VK_BACK
je .defwndproc
cmp eax, 20h
jb .finish
cmp ax, 0FFh
ja .finish
jmp .defwndproc
.failed:
stdcall ShowLastError, [hwnd]
or eax, -1
jmp .finish
; If the edit field received the WM_GETCHARSET message then the characteristic
; function of the character set is completed with information about the user
; defined symbols.
;
.wmuser:
push ebx ecx esi edi
; Fill with zeros the array which defines characteristic function
; of character set.
;
xor eax, eax
mov ecx, 7
mov edi, CharFun
cld
rep stosd
; Copy an information about the state of check boxes to the ebx register.
;
movzx ebx, [Flags]
; If the flag corresponding to the some check box is set, then the characteristic
; function is completed with the proper predefined category of symbols.
;
.Check_AZ:
bt ebx, 0
jnc .Check_az
or [CharFun + 4], 07FFFFFEh
.Check_az:
bt ebx, 1
jnc .Check_09
or [CharFun + 8], 07FFFFFEh
.Check_09:
bt ebx, 2
jnc .Check__
or [CharFun], 03FF0000h
.Check__:
bt ebx, 3
jnc .OtherChars
bts dword [CharFun + 4], 31
; Completion of the characteristic function of the character set
; with user-defined symbols.
;
.OtherChars:
; Get the text length stored in the edit field.
;
invoke SendMessage, [hwnd], WM_GETTEXTLENGTH, 0, 0
inc eax
mov ebx, eax
shl eax, 1
; Allocation of the memory block for the text get from the edit field.
;
invoke LocalAlloc, LMEM_ZEROINIT, eax
test eax, eax
jz .failed
mov [Buffer], eax
; Place the content of the edit field in the reserved buffer.
;
invoke SendMessage, [hwnd], WM_GETTEXT, ebx, eax
; Loop in which we set bits adequate to user-defined chars in the array
; representing characteristic function of the password character set.
;
xor eax, eax
mov esi, [Buffer]
cld
.Loop:
lodsw
test eax, eax
jz .LoopEnd
bts [CharFun - 4], eax ; CharFun[eax - 32] := 1
jmp .Loop
.LoopEnd:
; Free the memory block allocated for the text get from the edit field.
;
invoke LocalFree, [Buffer]
test eax, eax
jnz .failed
pop edi esi ecx ebx
.finish:
ret
align 4
; Handle to the old (default) edit field procedure.
;
.OldWndProc dd ?
endp
; Procedure used to show message box with the information about the last error which occurred
; during the program execution.
;
proc ShowLastError, hwnd
locals
Buffer dd ?
endl
push ebx
invoke GetLastError
lea ebx, [Buffer]
invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM, 0, eax, LANG_NEUTRAL, ebx, 0, 0
invoke MessageBox, [hwnd], [Buffer], NULL, MB_ICONERROR + MB_OK
invoke LocalFree, [Buffer]
pop ebx
ret
endp
.end start
; Section containing definitions of the application resources.
;
section '.rsrc' resource data readable
RT_MANIFEST = 24
ID_MANIFEST = 1
ID_MAINICON = 1
ID_COPYICON = 2
directory RT_ICON, icons,\
RT_GROUP_ICON, icon_groups,\
RT_VERSION, versions,\
RT_MANIFEST, manifest
resource icons,\
1, LANG_NEUTRAL, main_icon_data,\
2, LANG_NEUTRAL, copy_icon_data
resource icon_groups,\
ID_MAINICON, LANG_NEUTRAL, main_icon_grp_data,\
ID_COPYICON, LANG_NEUTRAL, copy_icon_grp_data
resource versions,\
1, LANG_NEUTRAL, version
resource manifest,\
ID_MANIFEST, LANG_NEUTRAL, man
versioninfo version, VOS__WINDOWS32, VFT_APP, VFT2_UNKNOWN, LANG_ENGLISH + SUBLANG_DEFAULT, 0,\
'FileDescription', 'Simple password generator.',\
'LegalCopyright', '(C) Mikołaj Hajduk, 2008',\
'FileVersion', PROG_VERSION,\
'ProductVersion', PROG_VERSION,\
'OriginalFilename', 'SimPaGen.exe'
; Data of the program main icon embedded directly into the source file.
;
main_icon_data dd RVA main_idata, 0x2E8, 0, 0
main_idata db 0x28, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0
db 0x40, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0xF9, 0x0, 0xC, 0x0
db 0xE9, 0x0, 0x2B, 0x0, 0xDC, 0x0, 0x46, 0x0
db 0xD4, 0x0, 0x56, 0x0, 0xCC, 0x0, 0x67, 0x0
db 0xC4, 0x0, 0x77, 0x0, 0xBB, 0x0, 0x88, 0x0
db 0xB3, 0x0, 0x98, 0x0, 0xAB, 0x0, 0xA9, 0x0
db 0xA3, 0x0, 0xB9, 0x0, 0x9B, 0x0, 0xC9, 0x0
db 0x92, 0x0, 0xDA, 0x0, 0x8A, 0x0, 0xEA, 0x0
db 0x82, 0x0, 0xFB, 0x0, 0x0, 0xFF, 0xFF, 0x0
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE
db 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF
db 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD
db 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDF
db 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD
db 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDF
db 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC
db 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF
db 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC
db 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF
db 0xFB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB
db 0xBB, 0xBB, 0xBB, 0xBB, 0xBF, 0xFB, 0xBB, 0xBF
db 0xFB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB
db 0xBB, 0xBB, 0xBB, 0xBB, 0xBF, 0xFB, 0xBB, 0xBF
db 0xFA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
db 0xAA, 0xAA, 0xAA, 0xAA, 0xAF, 0xFA, 0xAA, 0xAF
db 0xFA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
db 0xAA, 0xAA, 0xAA, 0xAA, 0xAF, 0xFA, 0xAA, 0xAF
db 0xF9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99
db 0x99, 0x99, 0x99, 0x99, 0x9F, 0xF9, 0x99, 0x9F
db 0xF9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99
db 0x99, 0x99, 0x99, 0x99, 0x9F, 0xF9, 0x99, 0x9F
db 0xF8, 0x88, 0x88, 0x88, 0xFF, 0x88, 0x88, 0x88
db 0x88, 0xFF, 0x88, 0x88, 0x8F, 0xF8, 0x88, 0x8F
db 0xF8, 0x88, 0x8F, 0xF8, 0xFF, 0x8F, 0xF8, 0x8F
db 0xF8, 0xFF, 0x8F, 0xF8, 0x8F, 0xF8, 0x88, 0x8F
db 0xF7, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0x77, 0x77
db 0xFF, 0xFF, 0xFF, 0x77, 0x7F, 0xF7, 0x77, 0x7F
db 0xF7, 0x77, 0x77, 0x7F, 0xFF, 0xF7, 0x77, 0x77
db 0x7F, 0xFF, 0xF7, 0x77, 0x7F, 0xF7, 0x77, 0x7F
db 0xF6, 0x66, 0x66, 0x6F, 0xFF, 0xF6, 0x66, 0x66
db 0x6F, 0xFF, 0xF6, 0x66, 0x6F, 0xF6, 0x66, 0x6F
db 0xF6, 0x66, 0x66, 0xFF, 0xFF, 0xFF, 0x66, 0x66
db 0xFF, 0xFF, 0xFF, 0x66, 0x6F, 0xF6, 0x66, 0x6F
db 0xF5, 0x55, 0x5F, 0xF5, 0xFF, 0x5F, 0xF5, 0x5F
db 0xF5, 0xFF, 0x5F, 0xF5, 0x5F, 0xF5, 0x55, 0x5F
db 0xF5, 0x55, 0x55, 0x55, 0xFF, 0x55, 0x55, 0x55
db 0x55, 0xFF, 0x55, 0x55, 0x5F, 0xF5, 0x55, 0x5F
db 0xF4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
db 0x44, 0x44, 0x44, 0x44, 0x4F, 0xF4, 0x44, 0x4F
db 0xF4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
db 0x44, 0x44, 0x44, 0x44, 0x4F, 0xF4, 0x44, 0x4F
db 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33
db 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF3, 0x33, 0x3F
db 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33
db 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF3, 0x33, 0x3F
db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
db 0x22, 0x22, 0x22, 0x22, 0x2F, 0xF2, 0x22, 0x2F
db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
db 0x22, 0x22, 0x22, 0x22, 0x2F, 0xF2, 0x22, 0x2F
db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F
db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F
db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F
db 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F
db 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
align 4
main_icon_grp_data dd RVA main_icon_grp_header, 20, 0, 0
main_icon_grp_header dw 0, 1, 1
dd 0x102020, 0x40001, 0x2E8
dw main_icon_data.resid
align 4
; Data of the icon showed on the button used for copying generated password to the
; clipboard.
;
copy_icon_data dd RVA copy_idata, 0x2E8, 0, 0
copy_idata db 0x28, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0
db 0x40, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x31, 0x2D, 0x2C, 0x0, 0x96, 0x60, 0x29, 0x0
db 0xC4, 0x9F, 0x57, 0x0, 0x38, 0x3C, 0x8F, 0x0
db 0x97, 0x6D, 0xA9, 0x0, 0x4A, 0x92, 0xAF, 0x0
db 0xAB, 0xA4, 0x9B, 0x0, 0xDE, 0xB3, 0x97, 0x0
db 0xB1, 0xCE, 0xAA, 0x0, 0xE8, 0xDC, 0xAE, 0x0
db 0x99, 0xAA, 0xDB, 0x0, 0xA0, 0xD0, 0xF4, 0x0
db 0xC0, 0xC0, 0xC0, 0x0, 0xFE, 0xFE, 0xFE, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x50, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xEE, 0xEE
db 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x0, 0x0, 0x8, 0xFF, 0xF5
db 0x4C, 0x20, 0x97, 0xF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8E, 0xEE, 0xE8, 0xFF, 0xF9
db 0xFD, 0x8F, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xF7
db 0x0, 0xA, 0x53, 0xDF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x58, 0xFF, 0xF2
db 0x2, 0x33, 0x70, 0xBF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x98, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFC, 0xBF, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x78, 0xFF, 0xF3
db 0x57, 0x22, 0x36, 0x5F, 0xFE, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xF8, 0x0, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x5, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x28, 0xFF, 0xFF
db 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0x88, 0x88
db 0x88, 0x88, 0x88, 0x88, 0x5, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x35, 0x72, 0x23
db 0x65, 0xFF, 0xE0, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFF, 0x80, 0x0, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFF, 0x8F, 0x80, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF
db 0xFF, 0x88, 0x5, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x88, 0x88, 0x88, 0x88, 0x88
db 0x88, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
align 4
copy_icon_grp_data dd RVA copy_icon_grp_header, 20, 0, 0
copy_icon_grp_header dw 0, 1, 1
dd 0x102020, 0x40001, 0x2E8
dw copy_icon_data.resid
align 4
; Data of the manifest embedded directly into the source file.
;
resdata man
db '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
db '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">'
db '<assemblyIdentity '
db 'version="', PROG_VERSION, '" '
db 'processorArchitecture="X86" '
db 'name="Mikołaj Hajduk.SimPaGen" '
db 'type="win32"'
db '/>'
db '<description>Simple password generator.</description>'
db '<dependency>'
db '<dependentAssembly>'
db '<assemblyIdentity '
db 'type="win32" '
db 'name="Microsoft.Windows.Common-Controls" '
db 'version="6.0.0.0" '
db 'processorArchitecture="X86" '
db 'publicKeyToken="6595b64144ccf1df" '
db 'language="*"'
db '/>'
db '</dependentAssembly>'
db '</dependency>'
db '</assembly>'
endres