
Получение метаданных WMA-файлов на Ассемблере

Получение метаданных WMA-файлов на Ассемблере
В этой статье разберем способы, как можно получить информацию из метаданных Windows Media Files, к которым относятся такие форматы, как WMV, ASF и WMA. По структуре они все очень похожи, поэтому работать будем с чем-то одним, например, с Windows Media Audio. И хоть разбирать вручную внутренности файлов гораздо интереснее, это тот случай, когда лучше поручить всю грязную работу самой системе.
Традиционно начнем с описания данных, про которые не знает FASM. Это GUID'ы и интерфейсы для работы с COM-объектами.
Code (Assembler) : Убрать нумерацию
- ; IID_IWMMetadataEditor Interface
- struct IWMMetadataEditor
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWMMetadataEditor
- Open dd ? ; 00Ch
- Close dd ? ; 010h
- Flush dd ? ; 014h
- ends
- ; GUID {15CC68E3-27CC-4ECD-B222-3F5D02D80BD5}
- IID_IWMHeaderInfo3 dd 015CC68E3h
- dw 027CCh
- dw 04ECDh
- db 0B2h, 022h, 03Fh, 05Dh, 002h, 0D8h, 00Bh, 0D5h
- ; IID_IWMHeaderInfo3 Interface
- struct IWMHeaderInfo3
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWMHeaderInfo3
- GetAttributeCount dd ? ; 00Ch
- GetAttributeByIndex dd ? ; 010h
- GetAttributeByName dd ? ; 014h
- SetAttribute dd ? ; 018h
- GetMarkerCount dd ? ; 01Ch
- GetMarker dd ? ; 020h
- AddMarker dd ? ; 024h
- RemoveMarker dd ? ; 028h
- GetScriptCount dd ? ; 02Ch
- GetScript dd ? ; 030h
- AddScript dd ? ; 034h
- RemoveScript dd ? ; 038h
- GetCodecInfoCount dd ? ; 03Ch
- GetCodecInfo dd ? ; 040h
- GetAttributeCountEx dd ? ; 044h
- GetAttributeIndices dd ? ; 048h
- GetAttributeByIndexEx dd ? ; 04Ch
- ModifyAttribute dd ? ; 050h
- AddAttribute dd ? ; 054h
- DeleteAttribute dd ? ; 058h
- AddCodecInfo dd ? ; 05Ch
- ends
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- invoke WMCreateEditor,pEditor
Code (Assembler) : Убрать нумерацию
- mov eax,[pEditor]
- mov eax,[eax]
- stdcall dword [eax+IWMMetadataEditor.Open],[pEditor],sample
- mov eax,[pEditor]
- mov eax,[eax]
- stdcall dword [eax+IWMMetadataEditor.QueryInterface],[pEditor],\
- IID_IWMHeaderInfo3,pHdrInfo
Code (Assembler) : Убрать нумерацию
- szAuthor du 'Author',0
- ...
- ...
- ; Узнать наличие и размер тега Author
- mov [wStream],0
- mov [wSize],0
- mov eax,[pHdrInfo]
- mov eax,[eax]
- stdcall dword [eax+IWMHeaderInfo3.GetAttributeByName],[pHdrInfo],\
- wStream,szAuthor,dType,NULL,wSize
- ; Длина данных нулевая?
- cmp [wSize],0
- je @f
- ; Прочитать значение тега Author
- mov eax,[pHdrInfo]
- mov eax,[eax]
- stdcall dword [eax+IWMHeaderInfo3.GetAttributeByName],[pHdrInfo],\
- wStream,szAuthor,dType,artist,wSize
- @@:
Когда все необходимые данные получены, закрываем файл и освобождаем занятые ресурсы. Если дальнейшая работа с COM-объектами не планируется, то вызываем функцию CoUninitialize.
Code (Assembler) : Убрать нумерацию
- ; Закрыть файл
- mov eax,[pEditor]
- mov eax,[eax]
- stdcall dword [eax+IWMMetadataEditor.Close],[pEditor]
- ; Прибраться за собой
- mov eax, [pHdrInfo]
- mov eax, [eax]
- stdcall dword [eax+IWMHeaderInfo3.Release],[pHdrInfo]
- mov eax, [pEditor]
- mov eax, [eax]
- stdcall dword [eax+IWMMetadataEditor.Release],[pEditor]
- ; Удалить объект
- invoke CoUninitialize
В приложении пример программы с исходным текстом, которая получает метаданные из WMA-файла и выводит их.
Просмотров: 527 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий
Заполните форму для добавления комментария
