· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Вытащить midi-музыку из игрушки

Посл.отвђт Сообщенiе


Дата: Июн 28, 2004 10:54:59 · Поправил: Rustem

Как ещё можно вытаскивать музыку из игр\програм?

Мои эксперименты показали следующее:
1. В одном случае помог файловый монитор (создавался файл *.mid, из которого потом игралась музыка).
2. Сканировал файл экзешника\данных в поиске сигнатуры midi (MThd)

Еще один метод. По-моему самый красивый:
3. Как я понимаю, в основном юзается WINMM.DLL и её семейство midi**** функций.

Так вот вопрос: как найти буфер с миди файлом в памяти, файле. Какая именно функция отвечает за него.

Заранее спасибо!


Дата: Июн 28, 2004 14:22:38

Сначала заполняется структура:
typedef struct {
    DWORD        dwCallback;   
    MCIDEVICEID  wDeviceID; 
    LPCSTR       lpstrDeviceType; 
    LPCSTR       lpstrElementName; <- OFFSET FileName 
    LPCSTR       lpstrAlias; 
} MCI_OPEN_PARMS;


Потом вызываем mciSendCommand для проигрывания, где-то так(выдрал из какого-то
исходника):
.data
SoundName db "TDSound",0                  ;sound name in resource
MB1Titel  db "Program Error",0            ;message box name
MB1Text   db "Bad work ...",0             ;message box text
MB2Titel  db "End of Program",0           ;message box name
MB2Text   db "Do you here the sound ?",0  ;message box text
FileName  db "temp.mid",0                 ;temporary filename

.data?
hInstance               dd ?
handleResource          dd ?
sizeResource            dd ?
pointerResource         dd ?

handleFile              dd ?
returnFile              dd ?

align 4
; - MCI_OPEN_PARMS Structure ( API=mciSendCommand ) -
open_dwCallback         dd ?
open_wDeviceID          dd ?
open_lpstrDeviceType    dd ?
open_lpstrElementName   dd ?
open_lpstrAlias         dd ?

align 4
; - MCI_GENERIC_PARMS Structure ( API=mciSendCommand ) -
generic_dwCallback      dd ?

align 4
; - MCI_PLAY_PARMS Structure ( API=mciSendCommand ) -
play_dwCallback         dd ?
play_dwFrom             dd ?
play_dwTo               dd ?


.code
start:
invoke GetModuleHandle,NULL
       mov hInstance,eax
invoke FindResource,hInstance,OFFSET SoundName,10
test eax, eax
jz ErrorPrg
mov     handleResource,eax
invoke SizeofResource,hInstance,handleResource
test eax, eax
jz ErrorPrg
mov     sizeResource,eax
invoke LoadResource,hInstance,handleResource
test eax, eax
jz ErrorPrg
invoke LockResource,eax
test eax, eax
jz ErrorPrg
mov     pointerResource,eax
invoke CreateFile,OFFSET FileName,40000000h,0h,0h,2h,80h,0h
cmp     eax,-1
je      ErrorPrg
mov     handleFile,eax
invoke WriteFile,handleFile,pointerResource,sizeResource,\
                 OFFSET returnFile,0h
test eax, eax
jz ErrorPrg
invoke CloseHandle,handleFile
test eax, eax
jz ErrorPrg

;--------------------------------------------------------------------- ---------
; API "mciSendCommandA" here opens the device
;--------------------------------------------------------------------- ---------
mov     open_lpstrDeviceType,0h                 ;fill MCI_OPEN_PARMS structure
mov     open_lpstrElementName,OFFSET FileName

invoke mciSendCommand,0h,0803h,0200h,OFFSET open_dwCallback
test eax, eax
jnz ErrorPrg

;--------------------------------------------------------------------- ---------
; API "mciSendCommandA", MCI_PLAY command begins transmitting output data
;--------------------------------------------------------------------- ---------

invoke mciSendCommand,open_wDeviceID,0806h,0h,OFFSET play_dwCallback
test eax, eax
jnz ErrorPrg

invoke MessageBox,NULL,OFFSET MB2Text,OFFSET MB2Titel,MB_OK

;--------------------------------------------------------------------- ---------
; API "mciSendCommandA" here closes the device
;--------------------------------------------------------------------- ---------

invoke mciSendCommand,open_wDeviceID,804h,0h,OFFSET generic_dwCallback

ExitPrg:

invoke ExitProcess,0

ErrorPrg:

invoke MessageBox,NULL,OFFSET MB1Text,OFFSET MB1Titel,MB_OK
jmp     ExitPrg

end start


Дата: Июн 28, 2004 17:57:59

Asterix
По-моему, человек немножко не то хотел :-)

Rustem
2. А может, разобрать/поискать в сети сам формат файла данных игрушки? - практичней ж будет.

3. Недавно вроде бы обсуждался вопрос о внедрении своего кода в чужую ДЛЛ. Может, вариант?


Кстати, про сигнатуры: раньше использовался еще один формат, почти начисто содранный с MIDI, а именно MUS, у него сигнатура заголовка "MUS\x1A". Если игрушка старая и от ID Software, то там точно этот формат =))


Дата: Июн 28, 2004 18:10:12 · Поправил: Asterix

Anonimka
Возможно, я только потом глянул что проигрывать midi можно и через другие API, поэтому подход к поиску будет другой.


Дата: Июн 28, 2004 18:53:08

Как я понимаю, в основном юзается WINMM.DLL и её семейство midi**** функций.

Рустем, твоя проблема в том, что ты слишком много понимаешь :)
А ты тупо бери BC, дави на кнопочки. Читай лог. Бери MSDN. Бери detours и лепи вывод в файл. Усе :)


Дата: Июн 28, 2004 18:59:52

Конечно, знать формат файлов игрушки хорошо, но ,наверно,
не для всех игрушек он описан (или для всех ? ;)))) )

Хотелось бы методы, чтобы не зная формата.

Хотя о самом формате данных игры приблизительно можно догадаться, изучая логи файлового монитора...

Нашел тут в SDK интересную структурку MIDIHDR, в некоторых midi функциях используется.


Дата: Июн 28, 2004 19:04:26

2 Volodya
BC неперехватывает функции WINMM. Хотя они точно используются (их перехватывает Olly )
Так, что пока обходимся без BC.

P.S. Просвети, что такое detours


Дата: Июн 28, 2004 19:05:50

P.S. Просвети, что такое detours
посмотри на research.microsoft.com


Дата: Июн 28, 2004 19:21:34 · Поправил: volodya

BC неперехватывает функции WINMM. Хотя они точно используются (их перехватывает Olly )
Так, что пока обходимся без BC.]


Ну... ОК, пиши свой движок. С detours это будут минуты.

ssx

Ты его не на research.microsoft.com отправляй, а на WASM FAQ, который ты и сам не читаешь :)


Дата: Июн 28, 2004 19:49:44

Rustem
Многие игрушки используют около-WAV-ный формат, как то: wav, mp3, xm, voc, ...


Дата: Июн 28, 2004 20:04:57

2 Anonimka

Спасибо за сигнатурку для ДУМА.

Музыку вытащил, буду заливать её в мобилу.


Дата: Июн 28, 2004 20:13:07

А вот я что-то не сумел достать музыку из кваки, мож там тоже формат с сигнатурой MUS\x1A ;-) или запаковано чем?
на такую мысль наводят файлы с расширением .pk3


Дата: Июн 28, 2004 20:14:05 · Поправил: Asterix

Зы: ещё хотел как-то достать ролик из "Enter the Matrix", но тоже так и не нашёл..


Дата: Июн 28, 2004 20:38:39

Asterix
В общем, .pk3 - это обныкновенный zip-архив %-), а музыка там, если правильно помню, в wav-формате.

Rustem
Для Doom, Doom2, Hexen, Heretic и Strife есть хороший распаковщик DeuTex - в сети много где лежит. Кстати, этот распаковщик _не_ понимает музыки в midi-формате (экстрактит только как lump), а понимает лишь mus.


Дата: Июн 28, 2004 21:36:29

Anonimka
> В общем, .pk3 - это обныкновенный zip-архив %-)

Точно! И я даже где-то читал об этом ранее и забыл ;-)

Осталось разобраться с "Enter the Matrix".


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.042