www.pudn.com > UFSTool.rar > UFSTool.Asm


include	UFSTool.inc 
 
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD 
MainDlgFunc proto :HWND,:UINT,:WPARAM,:LPARAM 
WriteThenRead proto  :DWORD,:DWORD,:DWORD,:DWORD 
ReadBox proto :DWORD,:DWORD,:DWORD 
ProgressDlgFunc proto :DWORD,:DWORD,:DWORD,:DWORD 
FlashingFunc proto :DWORD 
CalcActCode proto :DWORD,:DWORD,:DWORD,:DWORD,:LPSTR,:DWORD 
CheckBoxType proto :DWORD 
Random	proto :DWORD 
 
include ufs2xx.inc 
includelib UFS2XX.lib 
 
include UFSToolData.inc 
 
include UFSToolBBS.inc 
  
.code 
 
SHA1_EnCode proc 
 
		pusha 
		mov	ESP_Saved,esp 
		cld 
		mov	ecx,[esp+28h] 
		mov	esi,[esp+2Ch] 
		mov	Total_Length,ecx 
		or		ComputeFlag,0FFFFFFFFh 
		mov	Message_Length,ecx 
		mov	Intermediate_Hash[00h],67452301h 
		mov	Intermediate_Hash[04h],0EFCDAB89h 
		mov	Intermediate_Hash[08h],98BADCFEh 
		mov	Intermediate_Hash[0Ch],10325476h 
		mov	Intermediate_Hash[10h],0C3D2E1F0h 
 
	L1:	 
		cmp	Message_Length,40h	;nSize必须以64字节(40h)对齐 
		jb		@F 
		mov	eax,Intermediate_Hash[00h] 
		mov	ebx,Intermediate_Hash[04h] 
		mov	ecx,Intermediate_Hash[08h] 
		mov	edx,Intermediate_Hash[0Ch] 
		mov	ebp,Intermediate_Hash[10h] 
		 
		SHA1FUNC1 Message_Block[00h],eax,ebp,ecx,edx,ebx 
		SHA1FUNC1 Message_Block[04h],ebp,edx,ebx,ecx,eax 
		SHA1FUNC1 Message_Block[08h],edx,ecx,eax,ebx,ebp 
		SHA1FUNC1 Message_Block[0Ch],ecx,ebx,ebp,eax,edx 
		SHA1FUNC1 Message_Block[10h],ebx,eax,edx,ebp,ecx 
		 
		SHA1FUNC1 Message_Block[14h],eax,ebp,ecx,edx,ebx 
		SHA1FUNC1 Message_Block[18h],ebp,edx,ebx,ecx,eax 
		SHA1FUNC1 Message_Block[1Ch],edx,ecx,eax,ebx,ebp 
		SHA1FUNC1 Message_Block[20h],ecx,ebx,ebp,eax,edx 
		SHA1FUNC1 Message_Block[24h],ebx,eax,edx,ebp,ecx 
		 
		SHA1FUNC1 Message_Block[28h],eax,ebp,ecx,edx,ebx 
		SHA1FUNC1 Message_Block[2Ch],ebp,edx,ebx,ecx,eax 
		SHA1FUNC1 Message_Block[30h],edx,ecx,eax,ebx,ebp 
		SHA1FUNC1 Message_Block[34h],ecx,ebx,ebp,eax,edx 
		SHA1FUNC1 Message_Block[38h],ebx,eax,edx,ebp,ecx 
		 
		SHA1FUNC1 Message_Block[3Ch],eax,ebp,ecx,edx,ebx 
		 
		SHA1FUNC2 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ebp,edx,ebx,ecx,eax 
		SHA1FUNC2 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],edx,ecx,eax,ebx,ebp 
		SHA1FUNC2 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ecx,ebx,ebp,eax,edx 
		SHA1FUNC2 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],ebx,eax,edx,ebp,ecx 
		 
		SHA1FUNC3 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC3 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC3 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC3 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ecx,ebx,edx,ebp,eax 
		SHA1FUNC3 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC3 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC3 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC3 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],edx,ecx,ebp,eax,ebx 
		SHA1FUNC3 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC3 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC3 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC3 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ebp,edx,eax,ebx,ecx 
		SHA1FUNC3 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC3 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC3 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC3 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],eax,ebp,ebx,ecx,edx 
		SHA1FUNC3 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC3 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC3 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC3 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC4 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC4 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC4 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC4 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],ecx,ebx,edx,ebp,eax 
		SHA1FUNC4 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC4 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC4 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC4 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],edx,ecx,ebp,eax,ebx 
		SHA1FUNC4 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC4 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC4 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC4 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],ebp,edx,eax,ebx,ecx 
		SHA1FUNC4 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC4 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC4 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC4 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],eax,ebp,ebx,ecx,edx 
		SHA1FUNC4 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC4 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC4 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC4 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC5 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC5 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC5 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC5 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ecx,ebx,edx,ebp,eax 
		SHA1FUNC5 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC5 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC5 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC5 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],edx,ecx,ebp,eax,ebx 
		SHA1FUNC5 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC5 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC5 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],eax,ebp,ebx,ecx,edx 
		SHA1FUNC5 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ebp,edx,eax,ebx,ecx 
		SHA1FUNC5 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC5 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC5 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ebx,eax,ecx,edx,ebp 
		 
		SHA1FUNC5 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],eax,ebp,ebx,ecx,edx 
		SHA1FUNC5 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ebp,edx,eax,ebx,ecx 
		SHA1FUNC5 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],edx,ecx,ebp,eax,ebx 
		SHA1FUNC5 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],ecx,ebx,edx,ebp,eax 
		SHA1FUNC5 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ebx,eax,ecx,edx,ebp 
		 
		add	Intermediate_Hash[00h],eax 
		add	Intermediate_Hash[04h],ebx 
		add	Intermediate_Hash[08h],ecx 
		add	Intermediate_Hash[0Ch],edx 
		add	Intermediate_Hash[10h],ebp 
		sub	Message_Length,40h	;每次64字节 
		jmp	L1 
	@@: 
		cmp	ComputeFlag,0 
		jz		@F 
		mov	esp,ESP_Saved 
		call	SHATail 
		jmp	L1 
	@@: 
		mov	esp,ESP_Saved 
		mov	edi,[esp+24h] 
		mov	esi,offset Intermediate_Hash[00h] 
		mov	ecx,5 
	@@:	 
		mov	eax,[esi+ecx*4-4] 
		bswap	eax 
		mov	[edi+ecx*4-4],eax 
		loop	@B 
		mov	ecx,19h 
		xor	eax,eax 
		mov	edi,offset Message_Block[00h] 
		rep stosd 
		popa 
		retn	0Ch 
SHA1_EnCode	endp 
 
SHATail	proc 
		mov	ecx,Message_Length 
		mov	ComputeFlag,0 
		mov	Message_Length,40h 
		mov	eax,ecx 
		mov	edi,offset Message_Block[00h] 
		test	eax,eax 
		jz		@F 
		rep movsb 
	@@: 
		mov	ecx,eax 
		mov	byte ptr [edi],80h 
		sub	ecx,37h 
		inc	edi 
		neg	ecx 
		jz		L1 
		jns	@F 
		add	Message_Length,40h 
		add	ecx,40h 
	@@: 
		xor	al,al 
		rep stosb 
	L1: 
		xor	edx,edx 
		mov	eax,Total_Length 
		mul	multiplier 
		bswap	eax 
		bswap	edx 
		mov	[edi],edx 
		mov	[edi+4],eax 
		mov	esi,offset Message_Block[00h] 
		ret 
SHATail	endp 
 
multiplier dd 8 
 
SHA2_EnCode proc 
 
		pusha 
		mov	ESP_Saved,esp 
		cld 
		mov	ecx,[esp+28h] 
		mov	esi,[esp+2Ch] 
		mov	Total_Length,ecx 
		or		ComputeFlag,0FFFFFFFFh 
		mov	Message_Length,ecx 
		mov	Intermediate_Hash[00h],12A57023h 
		mov	Intermediate_Hash[04h],3EC24F15h 
		mov	Intermediate_Hash[08h],4641DCEFh 
		mov	Intermediate_Hash[0Ch],72354168h 
		mov	Intermediate_Hash[10h],55129475h 
	L1:	 
		cmp	Message_Length,40h 
		jb		@F 
		mov	eax,Intermediate_Hash[00h] 
		mov	ebx,Intermediate_Hash[04h] 
		mov	ecx,Intermediate_Hash[08h] 
		mov	edx,Intermediate_Hash[0Ch] 
		mov	ebp,Intermediate_Hash[10h] 
		 
		SHA2FUNC1 Message_Block[00h],eax,ebp,ecx,edx,ebx 
		SHA2FUNC1 Message_Block[04h],ebp,edx,ebx,ecx,eax 
		SHA2FUNC1 Message_Block[08h],edx,ecx,eax,ebx,ebp 
		SHA2FUNC1 Message_Block[0Ch],ecx,ebx,ebp,eax,edx 
		SHA2FUNC1 Message_Block[10h],ebx,eax,edx,ebp,ecx 
		 
		SHA2FUNC1 Message_Block[14h],eax,ebp,ecx,edx,ebx 
		SHA2FUNC1 Message_Block[18h],ebp,edx,ebx,ecx,eax 
		SHA2FUNC1 Message_Block[1Ch],edx,ecx,eax,ebx,ebp 
		SHA2FUNC1 Message_Block[20h],ecx,ebx,ebp,eax,edx 
		SHA2FUNC1 Message_Block[24h],ebx,eax,edx,ebp,ecx 
		 
		SHA2FUNC1 Message_Block[28h],eax,ebp,ecx,edx,ebx 
		SHA2FUNC1 Message_Block[2Ch],ebp,edx,ebx,ecx,eax 
		SHA2FUNC1 Message_Block[30h],edx,ecx,eax,ebx,ebp 
		SHA2FUNC1 Message_Block[34h],ecx,ebx,ebp,eax,edx 
		SHA2FUNC1 Message_Block[38h],ebx,eax,edx,ebp,ecx 
		 
		SHA2FUNC1 Message_Block[3Ch],eax,ebp,ecx,edx,ebx 
		 
		SHA2FUNC2 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ebp,edx,ebx,ecx,eax 
		SHA2FUNC2 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],edx,ecx,eax,ebx,ebp 
		SHA2FUNC2 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ecx,ebx,ebp,eax,edx 
		SHA2FUNC2 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],ebx,eax,edx,ebp,ecx 
		 
		SHA2FUNC3 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC3 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC3 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC3 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ecx,ebx,edx,ebp,eax 
		SHA2FUNC3 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC3 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC3 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC3 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],edx,ecx,ebp,eax,ebx 
		SHA2FUNC3 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC3 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC3 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC3 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ebp,edx,eax,ebx,ecx 
		SHA2FUNC3 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC3 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC3 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC3 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],eax,ebp,ebx,ecx,edx 
		SHA2FUNC3 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC3 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC3 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC3 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC4 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC4 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC4 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC4 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],ecx,ebx,edx,ebp,eax 
		SHA2FUNC4 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC4 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC4 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC4 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],edx,ecx,ebp,eax,ebx 
		SHA2FUNC4 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC4 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC4 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC4 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],ebp,edx,eax,ebx,ecx 
		SHA2FUNC4 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC4 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC4 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC4 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],eax,ebp,ebx,ecx,edx 
		SHA2FUNC4 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC4 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC4 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC4 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC5 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC5 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC5 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC5 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ecx,ebx,edx,ebp,eax 
		SHA2FUNC5 Message_Block[34h],Message_Block[20h],Message_Block[08h],Message_Block[00h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC5 Message_Block[38h],Message_Block[24h],Message_Block[0Ch],Message_Block[04h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC5 Message_Block[3Ch],Message_Block[28h],Message_Block[10h],Message_Block[08h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC5 Message_Block[00h],Message_Block[2Ch],Message_Block[14h],Message_Block[0Ch],edx,ecx,ebp,eax,ebx 
		SHA2FUNC5 Message_Block[04h],Message_Block[30h],Message_Block[18h],Message_Block[10h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC5 Message_Block[08h],Message_Block[34h],Message_Block[1Ch],Message_Block[14h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC5 Message_Block[0Ch],Message_Block[38h],Message_Block[20h],Message_Block[18h],eax,ebp,ebx,ecx,edx 
		SHA2FUNC5 Message_Block[10h],Message_Block[3Ch],Message_Block[24h],Message_Block[1Ch],ebp,edx,eax,ebx,ecx 
		SHA2FUNC5 Message_Block[14h],Message_Block[00h],Message_Block[28h],Message_Block[20h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC5 Message_Block[18h],Message_Block[04h],Message_Block[2Ch],Message_Block[24h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC5 Message_Block[1Ch],Message_Block[08h],Message_Block[30h],Message_Block[28h],ebx,eax,ecx,edx,ebp 
		 
		SHA2FUNC5 Message_Block[20h],Message_Block[0Ch],Message_Block[34h],Message_Block[2Ch],eax,ebp,ebx,ecx,edx 
		SHA2FUNC5 Message_Block[24h],Message_Block[10h],Message_Block[38h],Message_Block[30h],ebp,edx,eax,ebx,ecx 
		SHA2FUNC5 Message_Block[28h],Message_Block[14h],Message_Block[3Ch],Message_Block[34h],edx,ecx,ebp,eax,ebx 
		SHA2FUNC5 Message_Block[2Ch],Message_Block[18h],Message_Block[00h],Message_Block[38h],ecx,ebx,edx,ebp,eax 
		SHA2FUNC5 Message_Block[30h],Message_Block[1Ch],Message_Block[04h],Message_Block[3Ch],ebx,eax,ecx,edx,ebp 
		 
		add	Intermediate_Hash[00h],eax 
		add	Intermediate_Hash[04h],ebx 
		add	Intermediate_Hash[08h],ecx 
		add	Intermediate_Hash[0Ch],edx 
		add	Intermediate_Hash[10h],ebp 
		sub	Message_Length,40h 
		jmp	L1 
	@@: 
		cmp	ComputeFlag,0 
		jz		@F 
		mov	esp,ESP_Saved 
		call	SHATail 
		jmp	L1 
 
	@@: 
		mov	esp,ESP_Saved 
		mov	edi,[esp+24h] 
		mov	esi,offset Intermediate_Hash[00h] 
		mov	ecx,5 
 
	@@:	 
		mov	eax,[esi+ecx*4-4] 
		bswap	eax 
		mov	[edi+ecx*4-4],eax 
		loop	@B 
		mov	ecx,19h 
		xor	eax,eax 
		mov	edi,offset Message_Block[00h] 
		rep 	stosd 
		popa 
		ret 0Ch 
SHA2_EnCode	endp 
 
; --------------------------------------------------------------------------- 
 
start: 
	invoke GetModuleHandle,NULL 
	mov    hInstance,eax 
	invoke GetCommandLine 
	invoke InitCommonControls 
	mov    CommandLine,eax 
	invoke  LoadLibrary,addr LibFileName 
	.if (eax) 
		mov	hUFS2XXLibModule,eax 
		invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT 
		.if (ftHandle) 
			invoke FT_Close,ftHandle 
		.endif 
		invoke  FreeLibrary,hUFS2XXLibModule 
	.else 
		invoke  MessageBox,NULL,addr NoUFS2XX,addr szError,MB_OK or MB_ICONERROR 
	.endif 
 
	invoke ExitProcess,eax 
 
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
	LOCAL wc:WNDCLASSEX 
	LOCAL msg:MSG 
	 
	mov   wc.cbSize,SIZEOF WNDCLASSEX 
	mov   wc.style,CS_HREDRAW or CS_VREDRAW 
	mov   wc.lpfnWndProc,OFFSET MainDlgFunc 
	mov   wc.cbClsExtra,NULL 
	mov   wc.cbWndExtra,DLGWINDOWEXTRA 
	push  hInst 
	pop   wc.hInstance 
	mov   wc.hbrBackground,COLOR_BTNFACE+1 
	mov   wc.lpszMenuName,NULL 
	mov   wc.lpszClassName,OFFSET ClassName 
	 
	invoke LoadIcon,hInstance,IDI_ICON 
	mov   wc.hIcon,eax 
	mov   wc.hIconSm,eax 
	 
	invoke LoadCursor,NULL,IDC_ARROW 
	mov   wc.hCursor,eax 
	 
	invoke RegisterClassEx,addr wc 
	invoke  CreateDialogParam,hInstance,IDC_MainDlg,NULL,addr MainDlgFunc,NULL 
	mov   hWindow ,eax 
	 
	invoke ShowWindow,hWindow,SW_SHOWNORMAL 
	invoke UpdateWindow,hWindow  
	 
	.WHILE TRUE 
		invoke GetMessage,ADDR msg,NULL,0,0 
		.BREAK .IF (!eax) 
		invoke TranslateMessage,ADDR msg 
		invoke DispatchMessage,ADDR msg 
	.ENDW 
	 
	mov     eax,msg.wParam 
	ret 
WinMain endp 
 
MainDlgFunc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM 
	LOCAL i:DWord 
	LOCAL j:DWord 
	LOCAL SN_Extension:DWord 
	LOCAL BytesWriten:DWord 
	LOCAL FTDI_SN:DWORD 
	LOCAL EEP_SN:DWORD 
	 
	.IF uMsg==WM_INITDIALOG 
		push	hWnd 
		pop	hWindow 
		invoke CheckDlgButton,hWindow,IDC_CHK_EEPROM,BST_CHECKED 
		invoke  SendDlgItemMessage,hWindow,IDC_CBO_Firmware,CB_ADDSTRING,NULL,addr szFwV2_5 
		invoke  SendDlgItemMessage,hWindow,IDC_CBO_Firmware,CB_ADDSTRING,NULL,addr szFwV2_6 
		invoke  SendDlgItemMessage,hWindow,IDC_CBO_Firmware,CB_SETCURSEL,1,0 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo1 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo2 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo3 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo5 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo6 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo7 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szSpace 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo8 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szDasher 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo9 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo10 
		invoke  SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo11 
		;invoke  GetDlgItem,hWindow,IDC_CHK_HWK 
		;invoke  EnableWindow,eax,TRUE 
		xor	ecx,ecx 
		mov	ftHandle,ecx 
		mov	FuseBits,ecx 
		mov	dword_40D7A4,ecx 
@@:	invoke SendDlgItemMessage,hWindow,IDC_CBO_SelDevice,CB_RESETCONTENT,NULL,NULL  
		invoke FT_ListDevices,addr FTDeviceCount,NULL,FT_LIST_NUMBER_ONLY 
		.if (EAX) 
			xor eax,eax 
			.if (ftHandle != eax) 
				push ftHandle 
				mov ftHandle,eax 
				call FT_Close 
          .endif 
         invoke SetDlgItemText,hWindow,IDC_BTN_Connect,addr szConnect  
			invoke GetDlgItem,hWindow,IDC_BTN_Connect 
			invoke EnableWindow,eax,FALSE 
			invoke MessageBox,hWindow,addr szFT_ListDevices,addr szError,MB_OK or MB_ICONERROR 
		.else 
			mov i,eax 
			mov j,eax 
			mov eax,FTDeviceCount 
			.if (eax <= 0) 
				xor eax,eax 
				.if (ftHandle != eax) 
					push ftHandle 
					mov ftHandle,eax 
					call  FT_Close  
				.endif 
         	invoke SetDlgItemText,hWindow,IDC_BTN_Connect,addr szConnect  
				invoke GetDlgItem,hWindow,IDC_BTN_Connect 
				invoke EnableWindow,eax,FALSE 
				invoke MessageBox,hWindow,addr szUfxNotFound,addr szAttention,MB_OK or MB_ICONINFORMATION  
			.else 
				.REPEAT 
					xor eax,eax 
					mov ecx,50h 
					mov edi,offset FTDeviceStrSN 
					rep stosb 
					invoke FT_ListDevices,i,addr FTDeviceStrSN,FT_LIST_BY_INDEX or FT_OPEN_BY_SERIAL_NUMBER 
					.if (!EAX) 
						invoke FT_ListDevices,i,addr FTDeviceStrDES,FT_LIST_BY_INDEX or FT_OPEN_BY_DESCRIPTION 
						.if (!EAX) 
							mov eax,i 
							inc eax 
							invoke wsprintf,addr TempString ,addr szDesSN,eax,addr FTDeviceStrDES,addr FTDeviceStrSN 
							invoke SendDlgItemMessage,hWindow,IDC_CBO_SelDevice,CB_ADDSTRING,NULL,addr TempString  
							inc j 
						.endif 
					.endif 
					inc i 
					mov eax,i 
				.UNTIL (eax >= FTDeviceCount) 
				.if (j > 0) 
					invoke SendDlgItemMessage,hWindow,IDC_CBO_SelDevice,CB_SETCURSEL,0,NULL 
					invoke GetDlgItem,hWindow,IDC_BTN_Connect 
					invoke EnableWindow,eax,TRUE 
				.endif 
			.endif 
		.endif 
	.ELSEIF uMsg==WM_COMMAND 
		mov	eax,wParam 
		and	eax,0FFFFh 
		.if (eax == IDC_BTN_Close) 
			invoke SendMessage,hWindow,WM_CLOSE ,NULL,NULL 
		.elseif (eax == IDC_BTN_Refresh) 
			jmp @B 
		.elseif (eax == IDC_BTN_Connect) 
			mov eax,ftHandle 
			.if (EAX) 
		Init:	 
				invoke  FT_Close,ftHandle 
				.if (!EAX) 
					mov ftHandle,eax 
					invoke SetDlgItemText,hWindow,IDC_BTN_Connect,addr szConnect 
					invoke SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING ,0,addr szDeviceClosed 
					invoke SendDlgItemMessage,hWindow,IDC_EDT_SN ,EM_SETSEL,0,-1 
					invoke SendDlgItemMessage,hWindow,IDC_LST_Info,WM_CLEAR,0,0 
				.endif 
			.else 
				invoke SendDlgItemMessage,hWindow,IDC_LST_Info,LB_RESETCONTENT,0,0 
				invoke SendDlgItemMessage,hWindow,IDC_EDT_SN,EM_SETSEL,0,-1 
				invoke SendDlgItemMessage,hWindow,IDC_EDT_SN,WM_CLEAR,0,0 
				invoke SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,EM_SETSEL,0,-1 
				invoke SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,WM_CLEAR,0,0 
				invoke SendDlgItemMessage,hWindow,IDC_CBO_SelDevice,CB_GETCURSEL,0,0 
				mov	FTDeviceCount,eax 
				xor	eax,eax 
				mov	ecx,50h 
				mov	edi,offset FTDeviceStrSN 
				rep stosb 
				invoke	FT_ListDevices,FTDeviceCount,addr FTDeviceStrSN,FT_LIST_BY_INDEX or FT_OPEN_BY_SERIAL_NUMBER 
				or		eax,eax 
				jnz	Init 
				invoke	FT_ListDevices,FTDeviceCount,addr FTDeviceStrDES,FT_LIST_BY_INDEX or FT_OPEN_BY_DESCRIPTION	 
				or		eax,eax 
				jnz	Init 
				invoke	FT_OpenEx,addr FTDeviceStrSN,FT_OPEN_BY_SERIAL_NUMBER,addr ftHandle 
				.if (EAX) 
					invoke	FT_OpenEx,addr FTDeviceStrDES,FT_OPEN_BY_DESCRIPTION,addr ftHandle 
					.if (EAX) 
						invoke	MessageBox,hWindow,addr szCanNotOpen,addr szError,MB_OK or MB_ICONERROR 
						jmp Init  
					.endif	 
				.endif 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo1 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo2 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szInfo3 
				mov dword ptr TempString ,2D2D2Dh 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				invoke	wsprintf,addr TempString ,addr szSNOpened,addr FTDeviceStrDES,addr FTDeviceStrSN 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				lea eax,FTDeviceStrSN 
				call	Str2Int 
				invoke	CheckBoxType,eax 
				.if (eax == BalckListBox) 
					lea eax,szBlackListSN	 
				.elseif (eax == Tornado1Box) 
					lea eax,szTornado1 
				.elseif (eax == Tornado2Box) 
					lea eax,szTornado2 
				.elseif (eax == TwisterBox) 
					lea eax,szTwister 
				.elseif (eax == NBoxBox) 
					lea eax,szNBox 
				.elseif (eax == PowFlasherBox) 
					lea eax,szPowFlasher 
				.elseif (eax == SFlasherBox) 
					lea eax,szSFlasher 
				.else 
					lea eax,szUnknownBox 
				.endif 
				invoke	wsprintf,addr TempString ,addr szManufacturer,eax 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				invoke	FT_ResetDevice,ftHandle 
				or		eax,eax 
				jnz 	Connected 
				invoke	FT_SetTimeouts,ftHandle,2710h,2710h 
				or		eax,eax 
				jnz 	Connected 
				invoke	FT_ResetDevice,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetUSBParameters,ftHandle,8000h,8000h 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetEventNotification,ftHandle,FT_EVENT_RXCHAR,NULL 
				or 	eax,eax 
				jnz 	Connected 
				lea	eax,FTDeviceStrSN 
				call	Str2Int 
				lea	edi,dword_40D504 
				mov	[edi+0Ch],eax 
				mov	byte ptr [edi+0Fh],6 
				lea	edi,SHABuffer1 
				mov	[edi],eax 
				invoke	FT_SetDataCharacteristics,ftHandle,FT_DATA_BITS_8,FT_STOP_BITS_1,FT_PARITY_NONE 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetFlowControl,ftHandle,FT_FLOW_NONE,11h,13h 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetDivisor,ftHandle,4138h 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_ClrDtr,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_ClrRts,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
				or 		eax,eax 
				jnz 	Connected 
				invoke	Sleep,64h 
				invoke	FT_SetRts,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	Sleep,0C8h 
				invoke	FT_ClrRts,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetRts,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				invoke	FT_SetDtr,ftHandle 
				or 	eax,eax 
				jnz 	Connected 
				xor	edi,edi 
				lea	eax,FTInBuf 
				mov	[eax],edi 
				lea	eax,FTOutBuf 
				mov	dword ptr [eax],3Fh ;Enter to BOOT 
				.REPEAT 
					invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
					invoke	FT_Write,ftHandle,addr FTOutBuf,1,addr BytesWriten 
					invoke	ReadBox,addr FTInBuf,2,10 
					cmp 	eax,2 
					jz 	@F 
					inc	edi 
				.UNTIL (edi > 10) 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szCantIntoBoot 
				invoke	MessageBox,hWindow,addr szNotCompatDevice,addr szError,MB_OK or MB_ICONERROR 
				jmp	Init 
			@@: 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				movzx	ebx,byte ptr [esi+1] 
				invoke	wsprintf,addr TempString ,addr szInToBoot,eax,ebx 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				invoke 	SetDlgItemText,hWindow,IDC_EDT_SN,addr FTDeviceStrSN 
				invoke 	SetDlgItemText,hWindow,IDC_EDT_EnterSN,addr FTDeviceStrSN 
				lea	edi,dword_40D504 
				lea	esi,FTInBuf 
				mov	ax,[esi] 
				mov	[edi+4],ax 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],56h 
				invoke	WriteThenRead,1,40h,100,1 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr FTInBuf 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],41h 
				invoke	WriteThenRead,1,40h,100,1 
				lea	esi,FTInBuf 
				mov	al,[esi] 
				.if (al == 0FFh) 
					invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szFirmCleared 
					mov	FirmwareCleared,1 
				.else 
					invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr FTInBuf 
					mov	FirmwareCleared,0	 
				.endif 
				lea	edi,FTOutBuf 
				mov	word ptr [edi],1D55h	;Get Features 
				invoke	WriteThenRead,2,3,100,0 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi+1] 
				mov	ah,[esi] 
				invoke	wsprintf,addr TempString ,addr szFeatures,eax 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				lea	edi,FTOutBuf 
				mov	word ptr [edi],1F55h	;Get 1F Section 
				invoke	WriteThenRead,2,3,100,0 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi+1] 
				mov	ah,[esi] 
				invoke	wsprintf,addr TempString ,addr szSection,eax 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				lea	edi,FTOutBuf 
				mov	word ptr [edi],1C55h	;Get EEProm_SN_extension 
				invoke	WriteThenRead,2,3,100,0 
				lea	esi,FTInBuf 
				movzx	ecx,byte ptr [esi+1] 
				mov	ch,[esi] 
				push  ecx 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],54h	;Get EEProm_SN 
				invoke	WriteThenRead,1,3,100,0 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi+1] 
				mov	ah,[esi] 
				push	eax 
				invoke	wsprintf,addr TempString ,addr szEEPromSN,eax,eax,ecx 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				pop	ecx 
				pop	eax 
				imul	eax,0FDE8h 
				add	eax,ecx 
				invoke	wsprintf,addr TempString ,addr szEESN,eax,eax 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],53h	;Get FuseBits 
				invoke	WriteThenRead,1,10,50,0 
				lea	esi,FTInBuf 
				mov	eax,[esi] 
				and	eax,0FFFFFFh 
				mov	FuseBits,eax 
				movzx	eax,byte ptr [esi] 
				movzx	ebx,byte ptr [esi+1] 
				movzx	ecx,byte ptr [esi+2] 
				lea	edi,dword_40D504 
				mov	[edi+6],al 
				mov	[edi+7],bl 
				mov	[edi+8],cl 
				invoke	wsprintf,addr TempString ,addr szFuseBits,eax,ebx,ecx 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				lea	edi,FTOutBuf 
				mov	word ptr [edi],1042h 
				invoke	FT_Write,ftHandle,edi,2,addr BytesWriten 
				invoke	Sleep,8 
				invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
				invoke	FT_SetDivisor,ftHandle,50001Ah 
				invoke	Sleep,32h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh	;'>' 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],1F1D1D4Ch 
				mov	dword ptr [edi+4],980D02h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],283EDC4Ch 
				mov	dword ptr [edi+4],470D6Ah 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],283EDC4Ch 
				mov	dword ptr [edi+4],480C6Ah 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],6D43D94Ch 
				mov	dword ptr [edi+4],510224h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],6D43D94Ch 
				mov	dword ptr [edi+4],520124h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],91EF8C4Ch 
				mov	dword ptr [edi+4],0FD06F1h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],91EF8C4Ch 
				mov	dword ptr [edi+4],0FE05F1h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],4152454Ch 
				mov	dword ptr [edi+4],0D30154h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],4152454Ch 
				mov	dword ptr [edi+4],0D20254h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jz		@F 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],54h 
				invoke	WriteThenRead,1,3,10,1 
				lea	esi,FTInBuf 
				xor	eax,eax 
				mov	ah,[esi] 
				mov	al,[esi+1] 
				invoke	CalcActCode,eax,eax,FreiaActSeed,13,addr FTInBuf,0 
				lea	esi,dword_40D8DC 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],80DA54Eh 
				add	edi,4 
				mov	ecx,8 
				mov	i,0BAh 
				.Repeat 
					movzx	eax,byte ptr [esi] 
					add	i,eax 
					mov	[edi],al 
					inc	esi 
					inc	edi 
					dec	ecx 
				.Until (ecx == 0) 
				xor	eax,eax 
				sub	eax,i 
				mov	[edi],al 
				invoke	WriteThenRead,13,1,20,1 
				lea	edi,FTOutBuf 
				mov	dword ptr [edi],1F1D1D4Ch 
				mov	dword ptr [edi+4],980D02h 
				invoke	WriteThenRead,7,1,20,1 
				lea	esi,FTInBuf 
				movzx	eax,byte ptr [esi] 
				cmp	al,3Eh 
				jnz	Connected 
			@@: 
				mov	dword ptr [edi],787F31h 
				invoke	WriteThenRead,3,10,100,1 
				lea	edi,FTOutBuf 
				invoke	FT_GetModemStatus,ftHandle,edi	 
				or	eax,eax 
				jnz	Connected 
				mov	eax,[edi] 
				and	eax,80h 
				.if (eax != 80h) 
					lea	edi,FTOutBuf 
					mov	byte ptr [edi],58h 
					invoke	WriteThenRead,1,10,100,0 
					jmp	Connected 
				.endif 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szHwkFound 
				mov	byte ptr [edi],58h 
				invoke	WriteThenRead,1,2,50h,0	 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],36h 
				invoke	WriteThenRead,1,1,200h,0 
				dec	eax 
				jnz	Connected 
				lea	esi,FTInBuf 
				cmp	byte ptr [esi],54h 
				jnz	Connected 
				mov	byte ptr [edi],30h 
				invoke	WriteThenRead,1,1,10,0 
				dec	eax 
				jnz	Connected 
				lea	esi,FTInBuf 
				cmp	byte ptr [esi],54h 
				jnz	Connected 
				mov	byte ptr [edi],32h 
				invoke	WriteThenRead,1,1,200h,0 
				dec	eax 
				jnz	Connected 
				lea	esi,FTInBuf 
				cmp	byte ptr [esi],0A5h 
				jnz	Connected 
				mov	dword ptr [edi],1010336h 
				invoke	WriteThenRead,4,5,300h,0 
				cmp	eax,5 
				jnz	Connected 
				lea	esi,FTInBuf 
				cmp	byte ptr [esi],54h 
				jnz	Connected 
				cmp	byte ptr [esi+3],0A5h 
				jnz	Connected 
				cmp	byte ptr [esi+4],54h 
				jnz	Connected 
				movzx	eax,word ptr [esi+1] 
				mov	HWK_Number ,eax 
				mov	dword ptr [edi],2031136h 
				mov	word ptr [edi+4],1000h 
				invoke	WriteThenRead,6,19,500h,0 
				cmp	eax,13h 
				jnz	Connected 
				lea	esi,FTInBuf 
				cmp	byte ptr [esi],54h 
				jnz	Connected 
				cmp	byte ptr [esi+11h],0A5h 
				jnz	Connected 
				cmp	byte ptr [esi+12h],54h 
				jnz	Connected 
				lea	esi,FTInBuf 
				inc	esi 
				lea	edi,HID  
				mov	ecx,10h 
				cld 
				rep movsb 
				lea	edi,FTOutBuf 
				mov	byte ptr [edi],31h 
				invoke	WriteThenRead,1,1,10,0 
				lea	esi,FTInBuf 
				mov	byte ptr [edi],39h 
				invoke	WriteThenRead,1,10,100,0 
				mov	byte ptr [edi],58h 
				invoke	WriteThenRead,1,1,20,0 
				lea	esi,HID  
				mov	edx,[esi+0Ch] 
				bswap	edx 
				mov	ecx,[esi+8] 
				bswap	ecx 
				mov	ebx,[esi+4] 
				bswap	ebx 
				mov	eax,[esi] 
				bswap	eax 
				invoke	wsprintf,addr TempString ,addr szHid,eax,ebx,ecx,edx 
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
				invoke	wsprintf,addr TempString ,addr szHwk,HWK_Number  
				invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr TempString  
			Connected: 
				invoke	SetDlgItemText,hWindow,IDC_BTN_Connect,addr szDisconnect 
			.endif 
		.elseif (eax == IDC_BTN_Backup) 
			mov	eax,ftHandle 
			or		eax,eax 
			jz		@F 
			invoke MessageBox,hWindow,addr szReadFirmware,addr AppName,MB_ICONINFORMATION or MB_OK 
		@@:	 
		.elseif (eax == IDC_BTN_Restore) 
			mov	RestoreOrFix,0 
			mov	eax,ftHandle 
			.if (eax) 
				mov	OFNA.lStructSize,SIZEOF OPENFILENAMEA 
				push	hWindow 
				pop	OFNA.hwndOwner 
				push	hInstance 
				pop	OFNA.hInstance 
				mov	OFNA.lpstrFilter,offset szBinFiles 
				mov	OFNA.nFilterIndex,0 
				mov	OFNA.lpstrFile,offset FileName 
				mov	OFNA.lpstrDefExt,offset szBinFileExt 
				mov	OFNA.nMaxFile,104h 
				mov	OFNA.Flags,OFN_LONGNAMES or OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY 
				invoke	GetOpenFileName,addr OFNA 
				.if eax == 1 
					invoke	CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL 
					.if eax != -1 
						mov	hFile,eax 
						xor	eax,eax 
						mov	ecx,2000h 
						mov	edi,offset FirmWareBuffer 
						rep 	stosb 
						mov	ecx,80h 
						mov	edi,offset EE93c46Buffer 
						rep 	stosb 
						dec	eax 
						mov	ecx,200h 
						mov	edi,offset EEPROMBuffer 
						rep 	stosb 
						invoke	ReadFile,hFile,addr FirmWareBuffer,2280h,addr NumberOfBytesRead,NULL 
						invoke	CloseHandle,hFile 
						invoke	DialogBoxParam,hInstance,addr ProgressDlg,hWindow,addr ProgressDlgFunc,addr FlashingFunc 
						.if eax == 1 
							invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szUpdateSuccesfull 
							invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szChangSNWarning 
							invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szPressRefresh 
							jmp	Init 
						.else 
							invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szUpdateFail 
						.endif 
					.else 
						invoke	MessageBox,hWindow,addr szErrOpenFile,szError,MB_ICONERROR or MB_OK 
					.endif 
				.endif 
			.endif 
		.elseif (eax == IDC_BTN_Fix)	;3F4h 
			pusha 
			mov	RestoreOrFix,1 
			mov	eax,ftHandle 
			.if (eax) 
				invoke	SendDlgItemMessage,hWindow,IDC_CBO_Firmware,CB_GETCURSEL,NULL,NULL  
				.if (!eax) 
					mov	dword ptr dword_40D51B,0E637DD09h 
					lea	esi,FirmWare2_5Data 
				.else 
					mov	dword ptr dword_40D51B,0B16C8E48h 
					lea	esi,FirmWare2_6Data	 
				.endif 
				lea	edi,FirmWareBuffer 
				mov	ecx,2280h 
				cld 
				rep 	movsb 
				invoke	GetDlgItemText,hWindow,IDC_EDT_SN,addr TempString ,1Eh  
				invoke	lstrlen,addr TempString  
				cmp	eax,8 
				jb		@F 
				lea	edi,TempString  
				mov	dword ptr [edi+7],0 
			@@: 
				lea	eax,TempString  
				call 	Str2Int  
				and	eax,7FFFFFh 
				mov	Box_SN,eax 
				mov	ecx,0FDE8h 
				cdq 
				idiv	ecx 
				mov	SN_Extension,eax 
				mov	EEProm_SN,edx 
				invoke	wsprintf,addr FTDeviceStrSN,szFmt1,Box_SN 
				invoke	SetDlgItemText,hWindow,IDC_EDT_SN,addr FTDeviceStrSN  
				invoke	CheckBoxType,Box_SN 
				cmp	eax,-1 
				jnz	@F 
				invoke	MessageBox,hWindow,addr szBlackListSN2,szWarning,MB_ICONWARNING or MB_OKCANCEL 
				.if (eax != IDCANCEL) 
				@@: 
					mov	[edi+6],ax 
					shr	eax,10h 
					mov	[edi+8],al 
					invoke	GetTickCount 
					xor	al,ah 
					and	al,7Fh 
					mov	[edi+16h],al 
					mov	byte ptr [edi+15h],3Eh 
					lea	edi,SHABuffer1 
					mov	dword ptr [edi],1A992E25h 
					xor	[edi],ebx 
					mov	dword ptr [edi+4],0AA761E09h 
					mov	eax,EEProm_SN 
					mov	[edi+8],eax 
					mov	eax,Box_SN 
					shr	eax,10h 
					mov	[edi+0Ah],al 
					mov	byte ptr [edi+0Bh],0C6h 
					mov	ebx,FuseBits 
					or		ebx,ebx 
					jnz	@F 
					mov	ebx,0C82ECCh 
				@@: 
					mov	[edi+0Ch],ebx 
					mov	byte ptr [edi+0Fh],5Ah 
					mov	byte ptr [edi+10h],62h 
					mov	byte ptr [edi+11h],0CFh 
					mov	eax,EEProm_SN 
					mov	[edi+12h],ah 
					mov	[edi+13h],al 
					lea	esi,SHABuffer2 
					mov	eax,EEProm_SN 
					mov	[esi+8],ah 
					mov	[esi+9],al 
					mov	byte ptr [esi+0Bh],0A5h 
					mov	eax,[edi] 
					mov	[esi],eax 
					mov	eax,[edi+8] 
					mov	[esi+4],eax 
					call	GetTickCount 
					xor	al,ah 
					and	al,7Fh 
					mov	[esi+0Ah],al 
					lea	eax,SHABuffer2 
					push	eax 
					push	0Ch 
					add	eax,0Ch 
					push	eax 
					call	SHA1_EnCode 
					lea	esi,SHABuffer2 
					lea	edi,FTInBuf 
					mov	ecx,20h 
					cld 
					rep 	movsb 
					lea	esi,byte_40805F 
					lea	edi,FTInBuf 
					movzx	ebx,byte ptr [edi+0Ah] 
					add	esi,ebx 
					xor	ecx,ecx 
				@@: 
					mov	al,[ecx+esi] 
					xor	[ecx+edi],al 
					inc	ecx 
					cmp	ecx,20h 
					jb		@B 
					mov	[edi+0Ah],bl 
					lea	edi,EEPROMBuffer 
					mov	eax,EEProm_SN 
					mov	[edi+2],ah 
					mov	[edi+3],al 
					mov	eax,SN_Extension 
					mov	[edi+148h],ah 
					mov	[edi+149h],al 
					add	edi,1E0h 
					xor	ecx,ecx 
				@@: 
					lea	esi,byte_40819F 
					movzx	ebx,byte ptr [ecx+esi] 
					lea	esi,FTInBuf 
					add	esi,ebx 
					mov	al,[esi] 
					mov	[ecx+edi],al 
					inc	ecx 
					cmp	ecx,20h 
					jb		@B 
					lea	eax,SHABuffer1 
					push	eax 
					push	14h 
					add	eax,14h 
					push	eax 
					call	SHA1_EnCode 
					lea	eax,SHABuffer1 
					push	eax 
					push	28h 
					add	eax,28h 
					push	eax 
					call	SHA2_EnCode 
					mov	ecx,14h 
					lea	esi,SHABuffer1 
					add	esi,28h 
					lea	edi,EEPROMBuffer 
					add	edi,1C0h 
					cld 
					rep 	movsb 
					mov	ecx,0Ch 
					lea	esi,SHABuffer1 
					add	esi,14h 
					lea	edi,EEPROMBuffer 
					add	edi,1D4h 
					cld 
					rep 	movsb 
					lea	eax,dword_40D504 
					push	eax 
					push	2Ch 
					add	eax,2Ch 
					push	eax 
					call	SHA2_EnCode 
					lea	esi,dword_40D504 
					lea	edi,FTInBuf 
					mov	ecx,40h 
					cld 
					rep 	movsb 
					lea	esi,byte_40805F 
					lea	edi,FTInBuf 
					movzx	ebx,byte ptr [edi+16h] 
					add	esi,ebx 
					xor	ecx,ecx 
				@@: 
					mov	al,[ecx+esi] 
					xor	[ecx+edi],al 
					inc	ecx 
					cmp	ecx,40h 
					jb		@B 
					mov	[edi+16h],bl 
					lea	edi,FirmWareBuffer 
					add	edi,17C0h 
					xor	ecx,ecx 
				@@: 
					lea	esi,byte_40815F 
					movzx	ebx,byte ptr [ecx+esi] 
					lea	esi,FTInBuf 
					add	esi,ebx 
					mov	al,[esi] 
					mov	[ecx+edi],al 
					inc	ecx 
					cmp	ecx,40h 
					jb		@B 
					invoke	CalcActCode,Box_SN,Box_SN,NokiaActSeed,5,addr FTInBuf,1 
					lea	esi,dword_40D8DC 
					lea	edi,EEPROMBuffer+38h 
					mov	ecx,8 
					cld 
					rep movsb 
					invoke	CalcActCode,Box_SN,Box_SN,EricssonActSeed,1,addr FTInBuf,1 
					lea	esi,dword_40D8DC 
					lea	edi,EEPROMBuffer+18h 
					mov	ecx,8 
					cld 
					rep movsb 
					invoke	CalcActCode,Box_SN,Box_SN,SamsungActSeed,12,addr FTInBuf,1 
					lea	esi,dword_40D8DC 
					lea	edi,EEPROMBuffer+70h 
					mov	ecx,8 
					cld 
					rep movsb 
					invoke	CalcActCode,Box_SN,Box_SN,FreiaActSeed,13,addr FTInBuf,0 
					lea	esi,dword_40D8DC 
					lea	edi,EEPROMBuffer+78h 
					mov	ecx,8 
					cld 
					rep movsb 
					invoke	CalcActCode,Box_SN,Box_SN,MotorolaActSeed,6,addr FTInBuf,1 
					lea	esi,dword_40D8DC 
					lea	edi,EEPROMBuffer+40h 
					mov	ecx,8 
					cld 
					rep movsb 
					lea	eax,EEPROMBuffer 
					invoke	DialogBoxParam,hInstance,addr ProgressDlg,hWindow,addr ProgressDlgFunc,addr FlashingFunc 
					.if eax == 1 
						invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szUpdateSuccesfull 
						invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szChangSNWarning 
						invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szPressRefresh 
						jmp	Init 
					.else 
						invoke	SendDlgItemMessage,hWindow,IDC_LST_Info,LB_ADDSTRING,NULL,addr szUpdateFail 
					.endif 
				.endif 
			.endif 
			popa 
			 
		.elseif (eax == IDC_BTN_Calculator)	;3F9h 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Info,EM_SETSEL ,0,-1 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Info,WM_CLEAR,NULL,NULL 
			invoke	GetDlgItemText,hWindow,IDC_EDT_EnterSN,addr FTInBuf,16 
			.if (!eax) 
				invoke	lstrcpy,addr TempString ,addr szEnterSerial 
			.else 
				mov	ecx,eax 
				lea	edi,FTInBuf 
				xor	eax,eax 
				mov	EEP_SN,eax 
				mov	al,2Bh	;FTDI_SN+EEP_SN 
				cld 
				repne scasb 
				jnz	@F 
				mov	byte ptr [edi-1],0 
				mov	eax,edi 
				call	Str2Int 
				and	eax,0FFFFFFh 
				mov	EEP_SN,eax 
			@@: 
				lea	eax,FTInBuf 
				call	Str2Int 
				and	eax,0FFFFFFh 
				mov	ecx,eax 
				mov	FTDI_SN,eax 
				mov	eax,EEP_SN 
				or		eax,eax 
				jnz	@F 
				mov	EEP_SN,ecx 
			@@: 
				invoke	CheckBoxType,ecx 
				.if (eax==-1) 
					lea	eax,szBlackListBox 
				.elseif (eax==1) 
					lea	eax,szTornado1 
				.elseif (eax==2) 
					lea	eax,szTornado2 
				.elseif (eax==3) 
					lea	eax,szTwister 
				.elseif (eax==4) 
					lea	eax,szNBox 
				.elseif (eax==5) 
					lea	eax,szPowFlasher 
				.elseif (eax==6) 
					lea	eax,szSFlasher 
				.else 
					lea	eax,szUnknownBox 
				.endif 
				mov	edx,EEP_SN 
				.if (FTDI_SN == edx) 
					invoke	wsprintf,addr FTOutBuf,addr szActStrFor,ecx,ecx,eax 
				.else 
					invoke	wsprintf,addr FTOutBuf,addr szFTDI_SN,ecx,ecx,edx,edx,eax 
				.endif 
				 
				invoke	lstrcpy,addr TempString,addr szReseller 
				invoke	GetDlgItemText,hWindow,IDC_EDT_Reseller,addr FTInBuf,30h 
				.if (!eax) 
					mov	dword ptr TempString,eax 
					invoke	lstrcat,addr TempString ,addr FTOutBuf 
				.else 
					invoke	lstrcat,addr TempString ,addr FTInBuf 
					invoke	lstrcat,addr TempString ,addr szCRLF 
					invoke	wsprintf,addr FTInBuf,addr szFmt1,FTDI_SN 
					invoke	lstrcat,addr TempString ,addr szSn 
					invoke	lstrcat,addr TempString ,addr FTInBuf 
					invoke	lstrcat,addr TempString ,addr szCRLF 
				.endif 
				 
				invoke	IsDlgButtonChecked,hWindow,IDC_CHK_HWK 
				cmp	eax,BST_CHECKED 
				jz		@F 
				invoke	CalcActCode,FTDI_SN,EEP_SN,NokiaActSeed,5,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szNokia 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,EricssonActSeed,1,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szEricsson 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,SamsungActSeed,12,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szSamsung 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,FreiaActSeed,13,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szFreia 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
					 
				invoke	CalcActCode,FTDI_SN,EEP_SN,MotorolaActSeed,6,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szMotorola 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	lstrcat,addr TempString ,addr szOldActStr	; Activation strings for old versions 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,NokiaActSeed,5,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szNokia 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,EricssonActSeed,1,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szEricsson 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,SamsungActSeed,12,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szSamsung 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,FreiaActSeed,13,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szFreia 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
					 
				invoke	CalcActCode,FTDI_SN,EEP_SN,MotorolaActSeed,6,addr FTInBuf,0 
				invoke	lstrcat,addr TempString ,addr szMotorola 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				invoke	lstrcat,addr TempString ,addr szCRLF 
			@@:		 
				invoke	lstrcat,addr TempString ,addr szForModHwk 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,Dctx1HwkActSeed,30,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szNok_hwk 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,Kfz1HwkActSeed,29,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szSe_hwk 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	CalcActCode,FTDI_SN,EEP_SN,Sams1HwkActSeed,28,addr FTInBuf,1 
				invoke	lstrcat,addr TempString ,addr szSam_hwk 
				invoke	lstrcat,addr TempString ,addr FTInBuf 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				invoke	lstrcat,addr TempString ,addr szCRLF 
				invoke	IsDlgButtonChecked,hWindow,IDC_CHK_SaveLOG 
				.if (eax == BST_CHECKED) 
					invoke	CreateFile,addr szLogFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL 
					.if (eax != -1) 
						mov	hFile,eax 
						invoke	SetFilePointer,hFile,0,0,FILE_END 
						invoke	lstrlen,addr TempString  
						invoke	WriteFile,hFile,addr TempString ,eax,addr NumberOfBytesRead,NULL 
						invoke	CloseHandle,hFile 
					.endif 
				.endif 
			.endif 
			invoke	SetDlgItemText,hWindow,IDC_EDT_Info,addr TempString  
			 
		.elseif (eax == IDC_BTN_Clipboard) 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Info,EM_SETSEL,0,-1 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Info,WM_COPY,NULL,NULL 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Info,EM_SETSEL,0,0 
			 
		.elseif (eax == IDC_BTN_Reseller) 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Reseller,EM_SETSEL,0,-1 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Reseller,WM_CLEAR,NULL,NULL 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Reseller,EM_SETSEL,0,0 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_Reseller,WM_PASTE,NULL,NULL 
			 
		.elseif (eax == IDC_BTN_EnterSN) 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,EM_SETSEL,0,-1 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,WM_CLEAR,NULL,NULL 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,EM_SETSEL,0,0 
			invoke	SendDlgItemMessage,hWindow,IDC_EDT_EnterSN,WM_PASTE,NULL,NULL 
			 
		.elseif (eax == IDC_BTN_FBI) 
			call	FBICalc	 
		.endif 
	.ELSEIF uMsg==WM_CLOSE 
		.if ftHandle != 0 
			invoke	FT_Close,ftHandle 
			mov	ftHandle,0 
		.endif 
		invoke 	DestroyWindow,hWnd 
	.ELSEIF uMsg==WM_DESTROY 
		invoke PostQuitMessage,NULL 
	.ELSE 
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam		 
		ret 
	.ENDIF 
 
	xor eax,eax 
	ret 
MainDlgFunc endp 
 
Str2Int	proc uses ebx edi esi 
 
	mov	edi,eax 
	xor	eax,eax 
	mov	ecx,0Ah 
@@: 
	movzx	edx,byte ptr [edi] 
	or		dl,dl 
	jz		@F 
	lea	eax,[eax+eax*4] 
	lea	eax,[edx+eax*2-30h] 
	inc	edi 
	loop 	@B 
@@: 
	ret 
Str2Int	endp 
 
ReadBox	proc uses ebx ecx esi,InBufAddr:DWORD,BytesToRead:DWORD,QueuedTimes:DWORD 
;Read from UFS Box and caculate the Checksum 
 
	LOCAL BytesReturned:DWORD 
 
		mov	ebx,QueuedTimes 
		.if (!ebx) 
			mov	ebx,BytesToRead	 
		.endif 
		shl	ebx,3 
		invoke	GetTickCount 
		add	ebx,eax 
@@:	 
		invoke	FT_GetQueueStatus,ftHandle,addr BytesReturned 
		or		eax,eax 
		jnz	@F 
		invoke	GetTickCount 
		cmp 	eax,ebx 
		ja	 	@F 
		mov	eax,BytesReturned 
		cmp 	eax,BytesToRead 
		jl		@B	 
@@: 
		mov	ebx,BytesReturned 
		test	ebx,ebx 
		jle	Done 
		cmp	ebx,BytesToRead 
		jl		@F 
		mov	ebx,BytesToRead 
@@: 
		invoke	FT_Read,ftHandle,InBufAddr,ebx,addr BytesReturned 
		or		eax,eax 
		jz		@F	 
		xor	ebx,ebx 
		jmp	Done 
@@: 
		mov	ebx,BytesReturned 
		dec	ebx 
		test	ebx,ebx 
		jl		Done 
		inc	ebx 
		mov	eax,InBufAddr 
		lea	esi,CheckSum 
@@: 
		mov	cl,[eax] 
		add	[esi],cl 
		inc	eax 
		dec	ebx 
		jnz	@B 
		mov	ebx,BytesReturned 
Done: 
		mov	eax,ebx 
		ret 
ReadBox	endp 
 
WriteThenRead	proc uses esi edi ecx,BytesToWrite:DWORD,BytesToRead:DWORD,QueuedTimes:DWORD,ClearInBufFlag:DWORD 
	 
	LOCAL	BytesWritten: DWORD 
 
		invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
		invoke	FT_Write,ftHandle,addr FTOutBuf,BytesToWrite,addr BytesWritten  
		mov	eax,ClearInBufFlag 
		.if (EAX) 
			xor	eax,eax 
			mov	ecx,100h 
			mov	edi,offset FTInBuf 
			rep stosb	 
		.endif 
		invoke	ReadBox,addr FTInBuf,BytesToRead,QueuedTimes 
		ret 
WriteThenRead	endp 
 
ProgressDlgFunc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM 
 
	.if uMsg==WM_INITDIALOG 
		.if lParam != 0 
			mov	FlashNoCompleted,0 
			invoke	CreateThread,NULL,0,lParam,hWnd,THREAD_PRIORITY_NORMAL,addr ThreadId	 
		.endif 
			 
	.elseif uMsg==WM_CLOSE 
		invoke	EndDialog,hWnd,lParam 
				 
	.elseif uMsg==WM_COMMAND 
		mov 	eax,wParam 
		mov	edx,eax 
		and	eax,0FFFFh 
		shr	edx,10h 
		.if (!edx) 
			.if eax == IDC_BTN_Break 
				mov	FlashNoCompleted,1	 
			.endif	 
		.endif 
	.else 
		mov	eax,0 
		ret	 
	.endif 
	mov	eax,1 
	ret 
ProgressDlgFunc	endp 
 
	;invoke	SendMessage,hWnd,WM_CLOSE,0,eax 
	;invoke	ExitThread,0 
	;ret 
		 
FlashingFunc	proc hWnd:DWORD 
 
	LOCAL CKSum:DWORD 
 
		invoke	Sleep,100 
		invoke	SetDlgItemText,hWnd,IDC_LBL_ReadAddr,addr szErasingFirmware 
		invoke	SendDlgItemMessage,hWnd,IDC_PGB_Flash,PBM_SETRANGE,0,17C00000h  
		mov	eax,ftHandle 
		or		eax,eax 
		jz		ErrDone 
		invoke	FT_Purge,ftHandle,FT_PURGE_RX or FT_PURGE_TX 
		invoke	IsDlgButtonChecked,hWindow,IDC_CHK_Firmware 
		cmp	eax,BST_CHECKED 
		jnz	EEPROM 
		lea	edi,FTOutBuf 
		mov	dword ptr [edi],0C355AA5Ah	;Erasing Firmware 
		invoke	WriteThenRead,4,1,800,1 
		lea	esi,FTInBuf 
		movzx	eax,byte ptr [esi] 
		cmp	al,3Eh 
		jz		@F 
		invoke	MessageBox,hWnd,addr szErasingError,addr szError,MB_OK or MB_ICONERROR 
		jmp	ErrDone 
		 
	@@: 
		lea	edi,FTOutBuf 
		mov	dword ptr [edi],43h 
		mov	dword ptr [edi+4],0 
		invoke	WriteThenRead,8,20,110,1 
		lea	esi,FTInBuf 
		movzx	eax,byte ptr [esi] 
		cmp	al,3Eh 
		jz		@F 
		invoke	MessageBox,hWnd,addr szDecryptionKeyErr,addr szError,MB_OK or MB_ICONERROR 
		jmp	ErrDone 
 
	@@: 
		xor	ecx,ecx 
 
		.Repeat 
			mov	eax,FlashNoCompleted 
			or		eax,eax 
			jnz	ErrDone 
			mov	CKSum,0 
			push	ecx 
			lea	edi,FTOutBuf 
			mov	byte ptr [edi],46h 
			mov	[edi+1],ch 
			mov	[edi+2],cl 
			movzx	eax,ch 
			add	CKSum,eax 
			movzx	eax,cl 
			add	CKSum,eax 
			mov	byte ptr [edi+3],40h 
			add	CKSum,40h 
			push	ecx 
			lea	esi,FirmWareBuffer 
			add	esi,ecx 
			add	edi,4 
			mov	ecx,40h 
			xor 	eax,eax 
			cld 
		@@: 
			lodsb 
			add	CKSum,eax 
			stosb 
			loop	@B 
			xor	eax,eax 
			sub	eax,CKSum 
			mov	[edi],al 
			mov	ecx,[esp] 
			invoke	SendDlgItemMessage,hWnd,IDC_PGB_Flash,PBM_SETPOS,ecx,0 
			pop	ecx 
			invoke	wsprintf,addr TempString ,addr szProgramBlock,ecx 
			invoke	SetDlgItemText,hWnd,IDC_LBL_ReadAddr,addr TempString  
			invoke	WriteThenRead,45h,1,1000,1 
			pop	ecx 
			lea	eax,FTInBuf 
			movzx	eax,byte ptr [eax] 
			cmp	al,3Eh 
			jz		@F 
			invoke	MessageBox,hWnd,addr szErrFlashingFirmware,addr szError,MB_OK or MB_ICONERROR 
			jmp	ErrDone 
		@@: 
			add	ecx,40h 
		.Until (ecx >= 1800h) 
 
EEPROM: 
		invoke	IsDlgButtonChecked,hWindow,IDC_CHK_EEPROM 
		cmp	eax,BST_CHECKED 
		jnz	EE93c46 
		invoke	SetDlgItemText,hWnd,IDC_LBL_ReadAddr,addr szFlashingEEProm 
		invoke	SendDlgItemMessage,hWnd,IDC_PGB_Flash,PBM_SETRANGE,0,1C00000h 
		invoke	SendDlgItemMessage,hWnd,IDC_PGB_Flash,PBM_SETPOS,0,0 
		xor	ecx,ecx 
 
		.Repeat 
			mov	eax,FlashNoCompleted 
			or		eax,eax 
			jnz	ErrDone 
			mov	CKSum,0 
			push	ecx 
			lea	edi,FTOutBuf 
			mov	byte ptr [edi],50h 
			mov	[edi+1],ch 
			mov	[edi+2],cl 
			movzx	eax,ch 
			add	CKSum,eax 
			movzx	eax,cl 
			add	CheckSum,eax 
			mov	byte ptr [edi+3],10h 
			add	CKSum,10h 
			lea	esi,EEPROMBuffer 
			add	esi,ecx 
			add	edi,4 
			pusha 
			invoke	SendDlgItemMessage,hWnd,IDC_PGB_Flash,PBM_SETPOS,ecx,0 
			popa 
			mov	ecx,10h 
			xor	eax,eax 
			cld 
		@@:	 
			lodsb 
			add	CKSum,eax 
			stosb 
			loop	@B 
			xor	eax,eax 
			sub	eax,CKSum 
			mov	[edi],al 
			invoke	WriteThenRead,21,1,1000,1 
			pop	ecx 
			lea	eax,FTInBuf 
			movzx	eax,byte ptr [eax] 
			cmp	al,3Eh 
			jz		@F 
			invoke	MessageBox,hWnd,addr szErrFlashingEEPROM,addr szError,MB_OK or MB_ICONERROR 
			jmp	ErrDone 
		@@: 
			or		ecx,ecx 
			jnz	@F 
			mov	eax,RestoreOrFix 
			or		eax,eax 
			jnz	@F 
			add	ecx,0F0h 
		@@: 
			add	ecx,10h 
		.Until (ecx >= 200h) 
 
EE93c46: 
		invoke	IsDlgButtonChecked,hWindow,IDC_CHK_93c46 
		cmp	eax,BST_CHECKED 
		jnz	OKDone 
		mov	eax,RestoreOrFix 
		or		eax,eax 
		jz		@F 
		lea	eax,Manufacturer 
		mov	pProgramData.Manufacturer,eax 
		lea	eax,ManufacturerID 
		mov	pProgramData.ManufacturerID,eax 
		lea	eax,Description 
		mov	pProgramData.Description,eax 
		lea	eax,SerialNumber 
		mov	pProgramData.SerialNumber,eax 
		lea	eax,pProgramData 
		mov	dword ptr [eax],0	;Signature1 
		mov	dword ptr [eax+4],0FFFFFFFFh	;Signature2 
		mov	dword ptr [eax+8],0	;Version 
		invoke	FT_EE_Read,ftHandle,eax 
		or		eax,eax 
		jnz	ErrDone 
		lea	eax,szUfs3	 
		mov	pProgramData.Manufacturer,eax 
		lea	eax,szUfs3Sarassoft 
		mov	pProgramData.Description,eax 
		lea	eax,FTDeviceStrSN 
		mov	pProgramData.SerialNumber,eax 
		movzx	eax,word ptr [eax] 
		mov	dword ptr ManufacturerID,eax 
		lea	eax,pProgramData 
		mov	dword ptr [eax],0	;Signature1 
		mov	dword ptr [eax+4],0FFFFFFFFh	;Signature2 
		mov	dword ptr [eax+8],0	;Version 
		invoke	FT_EE_Program,ftHandle,eax  
		or	eax,eax 
		jnz	ErrDone 
		jmp	short OKDone 
	@@:	 
		invoke	SetDlgItemText,hWnd,IDC_LBL_ReadAddr,addr szFlashing93c46 
		xor	ecx,ecx 
		lea	edi,EE93c46Buffer 
 
		.Repeat 
			push	ecx 
			mov	ax,[edi+ecx*2] 
			invoke	FT_WriteEE,ftHandle,ecx,eax 
			pop	ecx 
			or	eax,eax 
			jnz	ErrDone 
			inc	ecx 
		.Until (ecx >= 40h) 
 
OKDone:	 
		mov	eax,1 
		jmp	short loc_405FE9 
 
ErrDone:	 
		xor	eax,eax 
 
loc_405FE9: 
		push	eax	 
		invoke	MessageBeep,MB_OK 
		pop	eax 
		invoke	SendMessage,hWnd,WM_CLOSE,NULL,eax 
		invoke	ExitThread,0 
		ret 
FlashingFunc	endp 
 
CalcActCode proc arg_0:DWORD,SN:DWORD,Seed:DWORD,arg_C:DWORD,lpBuffer:LPSTR,Ver:DWORD 
 
	LOCAL var_4:DWORD 
	LOCAL EEP_SN:DWORD 
	LOCAL SN_EXT:DWORD 
	 
		pusha 
		mov	SN_EXT,0 
		mov	eax,SN 
		mov	EEP_SN,eax 
		and	eax,0FFFFFFh 
		mov	ecx,0FDE8h 
		cdq 
		idiv	ecx 
		mov	SN_EXT,eax 
		mov	EEP_SN,edx 
		mov	eax,Seed 
		mov	var_4,eax 
		mov	eax,Ver 
		or		eax,eax 
		jz		@F 
		mov	eax,SN 
		lea	edi,FTInBuf 
		mov	[edi],eax 
		shr	eax,18h 
		mov	ecx,arg_C 
		add	ecx,SN_EXT 
		xor	eax,ecx 
		mov	[edi+3],al 
		mov	eax,arg_0 
		shr	eax,5 
		mov	[edi+4],al 
		mov	eax,arg_0 
		xor	al,0CAh 
		mov	[edi+5],al 
		mov	eax,arg_0 
		shr	eax,11h 
		mov	[edi+6],al 
		mov	eax,arg_0 
		shr	eax,17h 
		mov	ecx,arg_C 
		add	ecx,SN_EXT 
		xor	eax,ecx 
		xor	al,0DAh 
		mov	[edi+7],al 
		push	edi 
		push	8 
		push	edi 
		call	SHA2_EnCode 
		mov	ebx,arg_C 
		add	ebx,SN_EXT 
		imul	ebx,4217853h 
		xor	[edi],ebx 
		shr	ebx,0Fh 
		xor	[edi+7],bl 
		mov	al,[edi+2] 
		shl	eax,8 
		mov	al,[edi+1] 
		shl	eax,8 
		mov	al,[edi] 
		shl	eax,8 
		mov	al,[edi+7] 
		xor	eax,Seed 
		mov	var_4,eax 
	@@: 
		mov	eax,EEP_SN 
		mov	ebx,0FFh 
		sub	bl,ah 
		xor	bl,al 
		movzx	eax,bl 
		mov	ecx,8 
	Lop1:	 
		shr	eax,1 
		jnb	@F 
		xor	eax,var_4 
	@@: 
		loop	Lop1 
		lea	edi,dword_40D8DC 
		mov	[edi],eax 
		mov	ebx,eax 
		mov	eax,arg_C 
		mov	[edi+8],al 
		mov	eax,EEP_SN 
		movzx	eax,al 
		mov	ecx,8 
	Lop2:	 
		shr	eax,1 
		jnb	@F 
		xor	eax,var_4 
	@@: 
		loop	Lop2 
		mov	[edi+4],eax 
		mov	edx,lpBuffer 
		or		edx,edx 
		jz		@F 
		mov	ecx,arg_C 
		and	ecx,0FFh 
		bswap	ebx 
		bswap	eax 
		invoke	wsprintf,lpBuffer,addr szFmt2,ecx,ebx,eax 
@@: 
		popa 
		ret 
CalcActCode	endp 
 
FBICalc	proc  
 
	LOCAL var_4:dword 
 
		mov	OFNA .lStructSize,SIZEOF OPENFILENAMEA 
		push	hWindow 
		pop	OFNA .hwndOwner 
		push	hInstance 
		pop	OFNA .hInstance 
		mov	OFNA .lpstrFilter,offset szReqFile ; "Request files (*.req)" 
		mov	OFNA .nFilterIndex,0 
		mov	OFNA .lpstrFile,offset FileName 
		mov	OFNA .nMaxFile,104h 
		mov	OFNA .Flags,OFN_LONGNAMES or OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY 
		invoke	GetOpenFileName,addr OFNA  
		cmp	eax,1 
		jnz	Done 
		invoke	CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL 
		cmp	eax,-1 
		jz		ErrorCreateFile 
		mov	hFile,eax 
		invoke	GetFileSize,hFile,0 
		cmp	eax,100h 
		jz		@F 
		invoke	CloseHandle,hFile 
		invoke 	MessageBox,hWindow,addr szErrBadSizeOfReqFile,addr szError,MB_ICONERROR or MB_OK 
		jmp	Done 
 
@@: 
		invoke	ReadFile,hFile,addr ReqFileBuffer,100h,addr NumberOfBytesRead,0 
		invoke	CloseHandle,hFile 
		lea	esi,ReqFileBuffer+0A0h 
		lea	edi,FTInBuf 
		xor	ecx,ecx 
 
@@: 
		mov	al,[ecx+esi] 
		lea	ebx,byte_40819F 
		movzx	ebx,byte ptr [ecx+ebx] 
		mov	[ebx+edi],al 
		inc	ecx 
		cmp	ecx,20h 
		jb		@B 
		lea	esi,byte_40805F 
		lea	edi,FTInBuf 
		movzx	ebx,byte ptr [edi+0Ah] 
		add	esi,ebx 
		xor	ecx,ecx 
 
@@:	 
		mov	al,[ecx+esi] 
		xor	[ecx+edi],al 
		inc	ecx 
		cmp	ecx,20h 
		jb		@B 
		mov	[edi+0Ah],bl 
		lea	esi,FTInBuf 
		lea	edi,ReqFileBuffer+0A0h 
		mov	ecx,20h 
		cld 
		rep 	movsb 
		lea	eax,FTInBuf 
		push	eax 
		push	0Ch 
		add	eax,0Ch 
		push	eax 
		call	SHA1_EnCode 
		lea	esi,ReqFileBuffer+0A0h 
		lea	edi,FTInBuf 
		mov	ecx,20h 
		repe 	cmpsb 
		jz		@F 
		invoke 	MessageBox,hWindow,addr szErrReqFileCorrupted,addr szError,MB_ICONERROR or MB_OK 
		jmp	Done 
 
@@: 
		lea	esi,ReqFileBuffer+40h 
		lea	edi,FTInBuf 
		xor	ecx,ecx 
 
@@:	 
		mov	al,[ecx+esi] 
		lea	ebx,byte_40815F 
		movzx	ebx,byte ptr [ecx+ebx] 
		mov	[ebx+edi],al 
		inc	ecx 
		cmp	ecx,40h 
		jb		@B 
		lea	esi,byte_40805F 
		lea	edi,FTInBuf 
		movzx	ebx,byte ptr [edi+16h] 
		add	esi,ebx 
		xor	ecx,ecx 
 
@@:	 
		mov	al,[ecx+esi] 
		xor	[ecx+edi],al 
		inc	ecx 
		cmp	ecx,40h 
		jb		@B 
		mov	[edi+16h],bl 
		lea	esi,FTInBuf 
		lea	edi,ReqFileBuffer+40h 
		mov	ecx,40h 
		cld 
		rep 	movsb 
		lea	eax,FTInBuf 
		push	eax 
		push	2Ch 
		add	eax,2Ch 
		push	eax 
		call	SHA2_EnCode 
		lea	esi,ReqFileBuffer+40h 
		lea	edi,FTInBuf 
		mov	ecx,40h 
		repe 	cmpsb 
		jz		@F 
		invoke 	MessageBox,hWindow,addr szErrReqFileCorrupted,addr szError,MB_ICONERROR or MB_OK 
		jmp	Done 
 
@@:	 
		lea	esi,ReqFileBuffer+0A0h 
		lea	edi,FTInBuf 
		mov	eax,[esi] 
		mov	[edi],eax 
		mov	eax,[esi+4] 
		mov	[edi+8],eax 
		movzx	ebx,ax 
		movzx	eax,byte ptr [esi+6] 
		imul	eax,0FDE8h 
		add	eax,ebx 
		mov	[ebp+var_4],eax 
		mov	ax,[esi+8] 
		mov	[edi+12h],ax 
		lea	esi,ReqFileBuffer+40h 
		mov	eax,[esi+1Bh] 
		mov	[edi+4],eax 
		mov	eax,[esi+6] 
		mov	[edi+0Ch],eax 
		mov	byte ptr [edi+0Fh],5Ah 
		mov	ax,[esi+4] 
		mov	[edi+10h],ax 
		lea	eax,FTInBuf 
		push	eax 
		push	14h 
		add	eax,14h 
		push	eax 
		call	SHA1_EnCode 
		lea	eax,FTInBuf 
		push	eax 
		push	28h 
		add	eax,28h 
		push	eax 
		call	SHA2_EnCode 
		lea	esi,dword_410768 
		lea	edi,FTInBuf 
		mov	ecx,14h 
		cld 
		rep movsb 
 
Lop1: 
		call	GetTickCount 
		mov	RandomSeed,eax 
		lea	edi,FTOutBuf 
		mov	ecx,100h 
 
@@: 
		invoke	Random,100h 
		or		al,al 
		jz		@B 
		mov	[ecx+edi-1],al 
		loop	@B 
		lea	edi,FTOutBuf 
		movzx	ecx,byte ptr [edi] 
		and	ecx,3Eh 
		or	ecx,1 
		mov	byte ptr [ecx+edi],36h 
		mov	edx,80h 
		sub	edx,ecx 
		mov	byte ptr [edx+edi],5Ah 
		mov	al,[edi] 
		xor	al,69h 
		mov	[edx+edi-1],al 
		push	ebx 
		xor	ebx,8463h 
		mov	[ecx+edi+0A0h],bh 
		mov	[ecx+edi+0A2h],bl 
		pop	ebx 
		mov	eax,ecx 
		lea	esi,FTInBuf 
		lea	edi,dword_410BC0 
		mov	ecx,20h 
		cld 
		rep movsb 
		lea	edi,dword_410BC0 
		lea	esi,FTOutBuf[eax] 
		mov	ecx,20h 
 
@@:	 
		mov	al,[esi] 
		xor	[edi],al 
		inc	esi 
		inc	edi 
		loop	@B 
		lea	eax,FTOutBuf 
		push	eax 
		push	0ECh 
		add	eax,0ECh 
		push	eax 
		call	SHA2_EnCode 
		xor	edx,edx 
		lea	esi,FTOutBuf 
		mov	ecx,80h 
 
Lop2:	 
		cmp	byte ptr [esi],0 
		jnz	@F 
		inc	edx 
 
@@:	 
		inc	esi 
		loop	Lop2 
		lea	esi,FTOutBuf 
		mov	ecx,4 
 
Lop3:	 
		cmp	byte ptr [esi],0 
		jnz	@F 
		inc	edx 
 
@@:	 
		inc	esi 
		loop	Lop3 
		lea	esi,dword_410BE0 
		mov	ecx,60h 
 
Lop4:	 
		cmp	byte ptr [esi],0 
		jnz	@F 
		inc	edx 
 
@@:	 
		inc	esi 
		loop	Lop4 
		lea	esi,FTOutBuf 
		cmp	byte ptr [esi],0 
		jnz	@F 
		inc	edx 
 
@@:	 
		cmp	byte ptr [esi+0A0h],0 
		jnz	@F 
		inc	edx 
 
@@: 
		cmp	edx,5 
		jg		Lop1 
		invoke	CheckBoxType,ebx 
		cmp	eax,-1 
		jnz	@F 
		invoke 	MessageBox,hWindow,addr szBlackListSN1,addr szWarning,MB_ICONWARNING or MB_OK 
 
@@: 
		movzx	eax,ReqFileBuffer+46h 
		and	al,33h 
		jz		@F 
		invoke 	MessageBox,hWindow,addr szReqFileNotProtected,addr szWarning,MB_ICONWARNING or MB_OKCANCEL 
		cmp	eax,IDOK 
		jz		@F 
		jmp	Done 
 
@@: 
		invoke	lstrlen,addr FileName 
		pushf 
		lea	edi,FileName 
		add	edi,eax 
		mov	al, '\' 
		std 
		repne scasb 
		inc	edi 
		inc	edi 
		mov	dword ptr [edi],0 
		popf 
		invoke	wsprintf,addr TempString ,szFBIFile,var_4 
		invoke	lstrcat,addr FileName,addr TempString  
		mov	OFNA .lStructSize,SIZEOF OPENFILENAMEA 
		push	hWindow 
		pop	OFNA .hwndOwner 
		push	hInstance 
		pop	OFNA .hInstance 
		mov	OFNA .lpstrFilter,offset szUfsUpFile	;"UFS updates files (*.fbi)" 
		mov	OFNA .nFilterIndex,0 
		mov	OFNA .lpstrFile,offset FileName 
		mov	OFNA .lpstrDefExt,offset szFbiFileExt	;".fbi" 
		mov	OFNA .nMaxFile,104h 
		mov	OFNA .Flags,OFN_LONGNAMES or OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY 
		invoke	GetSaveFileName,addr OFNA 
		cmp	eax,1 
		jnz	Done 
		invoke	CreateFile,addr FileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL 
		cmp	eax,-1 
		jz		ErrorCreateFile 
		mov	hFile,eax 
		invoke	WriteFile,hFile,addr FTOutBuf,100h,addr NumberOfBytesRead,NULL 
		invoke	CloseHandle,hFile 
		jmp	Done 
 
ErrorCreateFile: 
		invoke 	MessageBox,hWindow,addr szErrCreatFile,addr szError,MB_ICONERROR or MB_OK 
 
Done: 
		ret 
FBICalc	endp 
 
Random	proc uses edx ecx,Range:DWORD 
 
		mov	eax,RandomSeed 
		xor	edx,edx 
		mov	ecx,1F31Dh 
		div	ecx 
		mov	ecx,eax 
		mov	eax,41A7h 
		mul	edx 
		mov	edx,ecx 
		mov	ecx,eax 
		mov	eax,0B14h 
		mul	edx 
		sub	ecx,eax 
		xor	edx,edx 
		mov	eax,ecx 
		mov	RandomSeed,ecx 
		div	Range 
		mov	eax,edx 
		ret 
Random	endp 
 
CheckBoxType	proc uses ecx,arg:DWORD 
 
		xor	eax,eax 
		xor	ecx,ecx 
		mov	BoxType,eax 
		mov	eax,arg 
		cmp	eax,15518 
		jnz	@F 
		inc	ecx 
@@: 
		cmp	eax,10 
		jl		@F 
		cmp	eax,5888 
		jge	@F 
		cmp	dword_40D7A4,1 
		jnz	@F 
		inc	ecx 
@@: 
		cmp	eax,5889 
		jl		@F 
		cmp	eax,6000 
		jge	@F 
		cmp	dword_40D7A4,1 
		jnz	@F 
		inc	ecx 
@@: 
		cmp	eax,6021 
		jl		@F 
		cmp	eax,65535 
		jge	@F 
		cmp	dword_40D7A4,1 
		jnz	@F 
		inc	ecx 
@@: 
		cmp	eax,100 
		jl		@F 
		cmp	eax,2000 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,2000 
		jl		@F 
		cmp	eax,2700 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,3157 
		jl		@F 
		cmp	eax,4000 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,4601 
		jl		@F 
		cmp	eax,5000 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,4000 
		jl		@F 
		cmp	eax,4600 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,5010 
		jl		@F 
		cmp	eax,6000 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,6020 
		jl		@F 
		cmp	eax,7999 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,8000 
		jl		@F 
		cmp	eax,10000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,10000 
		jl		@F 
		cmp	eax,11000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,11000 
		jl		@F 
		cmp	eax,14000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,14000 
		jl		@F 
		cmp	eax,16000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,16000 
		jl		@F 
		cmp	eax,17000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,17000 
		jl		@F 
		cmp	eax,17600 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,17600 
		jl		@F 
		cmp	eax,18000 
		jge	@F 
		inc	ecx 
@@: 
		cmp	eax,18000 
		jl		@F 
		cmp	eax,20000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,20000 
		jl		@F 
		cmp	eax,21000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,21000 
		jl		@F 
		cmp	eax,23000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,23000 
		jl		@F 
		cmp	eax,25000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,25000 
		jl		@F 
		cmp	eax,27000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,27000 
		jl		@F 
		cmp	eax,29000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,29000 
		jl		@F 
		cmp	eax,30000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,30000 
		jl		@F 
		cmp	eax,31000 
		jge	@F 
		mov	BoxType,NBoxBox 
@@: 
		cmp	eax,31000 
		jl		@F 
		cmp	eax,32000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,33000 
		jl		@F 
		cmp	eax,34000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,34000 
		jl		@F 
		cmp	eax,35000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,35000 
		jl		@F 
		cmp	eax,37000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,38000 
		jl		@F 
		cmp	eax,39000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,39000 
		jl		@F 
		cmp	eax,40000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,40000 
		jl		@F 
		cmp	eax,41000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,41000 
		jl		@F 
		cmp	eax,42000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,42000 
		jl		@F 
		cmp	eax,43000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,43000 
		jl		@F 
		cmp	eax,44000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,44000 
		jl		@F 
		cmp	eax,45000 
		jge	@F 
		mov	BoxType,NBoxBox 
@@: 
		cmp	eax,45000 
		jl		@F 
		cmp	eax,47000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,47000 
		jl		@F 
		cmp	eax,49000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,49000 
		jl		@F 
		cmp	eax,51000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,51000 
		jl		@F 
		cmp	eax,53000 
		jge	@F 
		mov	BoxType,NBoxBox 
@@: 
		cmp	eax,54000 
		jl		@F 
		cmp	eax,56000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,56000 
		jl		@F 
		cmp	eax,58000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,58000 
		jl		@F 
		cmp	eax,59000 
		jge	@F 
		mov	BoxType,PowFlasherBox 
@@: 
		cmp	eax,59000 
		jl		@F 
		cmp	eax,61000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,61000 
		jl		@F 
		cmp	eax,62000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,62000 
		jl		@F 
		cmp	eax,63000 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,63000 
		jl		@F 
		cmp	eax,64000 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,64000 
		jl		@F 
		cmp	eax,65000 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,65000 
		jl		@F 
		cmp	eax,65500 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,70000 
		jl		@F 
		cmp	eax,79999 
		jge	@F 
		mov	BoxType,Tornado1Box 
@@: 
		cmp	eax,80000 
		jl		@F 
		cmp	eax,89999 
		jge	@F 
		mov	BoxType,Tornado2Box 
@@: 
		cmp	eax,90000 
		jl		@F 
		cmp	eax,99999 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,100000 
		jl		@F 
		cmp	eax,109999 
		jge	@F 
		mov	BoxType,NBoxBox 
@@: 
		cmp	eax,110000 
		jl		@F 
		cmp	eax,119999	 
		jge	@F 
		mov	BoxType,PowFlasherBox 
@@: 
		cmp	eax,120000 
		jl		@F 
		cmp	eax,129999 
		jge	@F 
		mov	BoxType,SFlasherBox 
@@: 
		cmp	eax,130000 
		jl		@F 
		cmp	eax,139999 
		jge	@F 
		mov	BoxType,TwisterBox 
@@: 
		cmp	eax,140000 
		jl		@F 
		inc	ecx 
@@: 
		cmp	eax,0 
		jnz	@F 
		inc	ecx 
@@: 
		cmp	eax,65535 
		jnz	@F 
		inc	ecx 
@@: 
		mov	eax,BoxType 
		or	ecx,ecx 
		jz		@F 
		mov	eax,0FFFFFFFFh 
@@: 
		ret 
CheckBoxType	endp 
 
end start