17,17 → 17,18 |
tag_format_text equ 2 ;ascii string |
tag_format_ui2b equ 3 ;unsigned integer 2 byte |
tag_format_ui4b equ 4 ;unsigned integer 4 byte |
tag_format_ui8b equ 5 ;unsigned integer 8 byte |
tag_format_urb equ 5 ;unsigned integer 4/4 byte |
tag_format_si1b equ 6 ;signed integer 1 byte |
tag_format_undef equ 7 ;undefined |
tag_format_si2b equ 8 ;signed integer 2 byte |
tag_format_si4b equ 9 ;signed integer 4 byte |
tag_format_si8b equ 10 ;signed integer 8 byte |
tag_format_srb equ 10 ;signed integer 4/4 byte |
tag_format_f4b equ 11 ;float 4 byte |
tag_format_f8b equ 12 ;float 8 byte |
|
align 4 |
txt_dp db ': ',0 |
txt_div db '/',0 |
|
; |
align 4 |
52,6 → 53,36 |
|
db 0x88,0x25,'GPS Info',0 |
|
db 0xa4,0x01,'Custom rendered',0 |
db 0xa4,0x02,'Exposure mode',0 |
db 0xa4,0x03,'White balance',0 |
db 0xa4,0x04,'Digital zoom ratio',0 |
db 0xa4,0x05,'Focal length in 35mm format',0 |
db 0xa4,0x06,'Scene capture type',0 |
db 0xa4,0x07,'Gain control',0 |
db 0xa4,0x08,'Contrast',0 |
db 0xa4,0x09,'Saturation',0 |
db 0xa4,0x0a,'Sharpness',0 |
db 0xa4,0x0b,'Device setting description',0 |
db 0xa4,0x0c,'Subject distance range',0 |
db 0xa4,0x20,'Image unique ID',0 |
db 0xa4,0x30,'Owner name',0 |
db 0xa4,0x31,'Serial number',0 |
db 0xa4,0x32,'Lens info',0 |
db 0xa4,0x33,'Lens make',0 |
db 0xa4,0x34,'Lens model',0 |
db 0xa4,0x35,'Lens serial number',0 |
db 0xa4,0x80,'GDAL metadata',0 |
db 0xa4,0x81,'GDAL no data',0 |
db 0xa5,0x00,'Gamma',0 |
db 0xaf,0xc0,'Expand software',0 |
db 0xaf,0xc1,'Expand lens',0 |
db 0xaf,0xc2,'Expand film',0 |
db 0xaf,0xc3,'Expand filterLens',0 |
db 0xaf,0xc4,'Expand scanner',0 |
db 0xaf,0xc5,'Expand flash lamp',0 |
|
db 0xea,0x1c,'Padding',0 |
dw 0 |
|
|
158,6 → 189,12 |
add esi,2 |
stdcall str_n_cat,edi,esi,[t_max] |
|
jmp @f |
.tag_unknown: |
mov dword[edi],'???' |
mov byte[edi+3],0 |
@@: |
|
;ç¨â ¥¬ ¨ä®à¬ æ¨î ¢ ⥣¥ |
mov bx,tag_format_text |
bt edx,0 |
167,14 → 204,7 |
cmp word[eax+2],bx |
jne .tag_02 |
stdcall str_n_cat,edi,txt_dp,[t_max] |
;¯à®¢¥à塞 ¤«¨ã áâப¨ |
mov ebx,dword[eax+4] |
bt edx,0 |
jnc @f |
ror bx,8 |
ror ebx,16 |
ror bx,8 |
@@: |
call get_tag_data_size ;¯à®¢¥à塞 ¤«¨ã áâப¨ |
cmp ebx,4 |
jg @f |
;¥á«¨ áâப ¯®¬¥é ¥âáï ¢ 4 ᨬ¢®« |
194,24 → 224,129 |
add esi,offs_m_or_i |
add esi,[app1] |
stdcall str_n_cat,edi,esi,[t_max] |
;;;jmp .end_f |
jmp .end_f |
.tag_02: |
|
mov bx,tag_format_ui2b |
bt edx,0 |
jnc @f |
ror bx,8 |
@@: |
cmp word[eax+2],bx |
jne .tag_03 |
stdcall str_n_cat,edi,txt_dp,[t_max] |
call get_tag_data_size |
cmp ebx,1 |
jg .over4b_03 |
;¥á«¨ ®¤® 2 ¡ ©â®¢®¥ ç¨á«® |
movzx ebx,word[eax+8] |
bt edx,0 |
jnc @f |
ror bx,8 |
@@: |
stdcall str_len,edi |
add edi,eax |
mov eax,ebx |
call convert_int_to_str ;[t_max] |
.over4b_03: |
;... |
jmp .end_f |
.tag_unknown: |
mov dword[edi],'???' |
mov byte[edi+3],0 |
.tag_03: |
|
mov bx,tag_format_ui4b |
bt edx,0 |
jnc @f |
ror bx,8 |
@@: |
cmp word[eax+2],bx |
jne .tag_04 |
stdcall str_n_cat,edi,txt_dp,[t_max] |
call get_tag_data_size |
cmp ebx,1 |
jg .over4b_04 |
;¥á«¨ ®¤® 4 ¡ ©â®¢®¥ ç¨á«® |
mov ebx,dword[eax+8] |
bt edx,0 |
jnc @f |
ror bx,8 |
ror ebx,16 |
ror bx,8 |
@@: |
stdcall str_len,edi |
add edi,eax |
mov eax,ebx |
call convert_int_to_str ;[t_max] |
.over4b_04: |
;... |
jmp .end_f |
.tag_04: |
|
mov bx,tag_format_urb |
bt edx,0 |
jnc @f |
ror bx,8 |
@@: |
cmp word[eax+2],bx |
jne .tag_05 |
stdcall str_n_cat,edi,txt_dp,[t_max] |
;call get_tag_data_size |
;cmp ebx,1 |
;jg .over4b_05 |
mov ebx,dword[eax+8] |
bt edx,0 |
jnc @f |
ror bx,8 |
ror ebx,16 |
ror bx,8 |
@@: |
stdcall str_len,edi |
add edi,eax |
add ebx,offs_m_or_i |
add ebx,[app1] |
mov eax,[ebx] |
bt edx,0 |
jnc @f |
ror ax,8 |
ror eax,16 |
ror ax,8 |
@@: |
call convert_int_to_str ;áâ ¢¨¬ 1-¥ ç¨á«® |
stdcall str_n_cat,edi,txt_div,[t_max] ;áâ ¢¨¬ § ª ¤¥«¥¨ï |
stdcall str_len,edi |
add edi,eax |
mov eax,[ebx+4] |
bt edx,0 |
jnc @f |
ror ax,8 |
ror eax,16 |
ror ax,8 |
@@: |
call convert_int_to_str ;áâ ¢¨¬ 2-¥ ç¨á«® |
;.over4b_05: |
;... |
;jmp .end_f |
.tag_05: |
|
.end_f: |
popad |
ret |
endp |
|
;input: |
; eax - tag pointer |
; edx - 1 if 'MM', 0 if 'II' |
;output: |
; ebx - data size |
align 4 |
proc exif_get_image_160_120 uses edi, app1:dword |
mov edi,[app1] |
|
get_tag_data_size: |
mov ebx,dword[eax+4] |
bt edx,0 |
jnc @f |
ror bx,8 |
ror ebx,16 |
ror bx,8 |
@@: |
ret |
endp |
|
align 4 |
proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword |
241,13 → 376,42 |
ret |
endp |
|
;input: |
; eax = value |
; edi = string buffer |
;output: |
align 4 |
convert_int_to_str: |
pushad |
mov dword[edi+1],0 |
mov dword[edi+5],0 |
call .str |
popad |
ret |
|
align 4 |
.str: |
mov ecx,0x0a ;§ ¤ ¥âáï á¨á⥬ áç¨á«¥¨ï ¨§¬¥ïîâáï ॣ¨áâàë ebx,eax,ecx,edx ¢å®¤ë¥ ¯ à ¬¥âàë eax - ç¨á«® |
;¯à¥à¥¢®¤ ç¨á« ¢ ASCII áâப㠢§®¤ë¥ ¤ ë¥ ecx=á¨á⥬ áç¨á«¥ï edi ¤à¥á ªã¤ § ¯¨áë¢ âì, ¡ã¤¥¬ áâபã, ¯à¨ç¥¬ ª®¥æ ¯¥à¥¬¥®© |
cmp eax,ecx ;áà ¢¨âì ¥á«¨ ¢ eax ¬¥ìè¥ ç¥¬ ¢ ecx â® ¯¥à¥©â¨ @@-1 â.¥. pop eax |
jb @f |
xor edx,edx ;®ç¨áâ¨âì edx |
div ecx ;à §¤¥«¨âì - ®áâ ⮪ ¢ edx |
push edx ;¯®«®¦¨âì ¢ á⥪ |
;dec edi ;ᬥ饨¥ ¥®¡å®¤¨¬®¥ ¤«ï § ¯¨á¨ á ª®æ áâப¨ |
call .str ;¯¥à¥©â¨ á ¬ã ᥡï â.¥. ¢ë§¢ âì á ¬ã á¥¡ï ¨ â ª ¤® ⮣® ¬®¬¥â ¯®ª ¢ eax ¥ á⠥⠬¥ìè¥ ç¥¬ ¢ ecx |
pop eax |
@@: ;cmp al,10 ;¯à®¢¥à¨âì ¥ ¬¥ìè¥ «¨ § 票¥ ¢ al 祬 10 (¤«ï á¨á⥬ë áç¨á«¥ï 10 ¤ ï ª®¬ ¤ - «¨è ï)) |
or al,0x30 ;¤ ï ª®¬ ¤ ª®à®ç¥ 祬 ¤¢¥ ¢ëè¥ |
stosb ;§ ¯¨á âì í«¥¬¥â ¨§ ॣ¨áâà al ¢ ï祪㠯 ¬ï⨠es:edi |
ret ;¢¥àãâìáï ç¥ì ¨â¥à¥áë© å®¤ â.ª. ¯®ª ¢ á⥪¥ åà ¨âìáï ª®«-¢® ¢ë§®¢®¢ â® á⮫쪮 à § ¬ë ¨ ¡ã¤¥¬ ¢ë§ë¢ âìáï |
|
|
|
align 16 |
EXPORTS: |
dd sz_exif_get_app1, exif_get_app1 |
dd sz_exif_get_app1_tag, exif_get_app1_tag |
;dd sz_exif_get_image_160_120, exif_get_image_160_120 |
dd 0,0 |
sz_exif_get_app1 db 'exif_get_app1',0 |
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 |
;sz_exif_get_image_160_120 db 'exif_get_image_160_120',0 |
|