procedure
TForm1
.
FormCreate(Sender: TObject);
var
hDSound:
Cardinal
;
pDirectSoundCreate:
Pointer
;
hWinmm:
Cardinal
;
pmidiStreamOpen:
Pointer
;
pwaveOutWrite:
Pointer
;
lp:
Cardinal
;
begin
hDSound := LoadLibrary(
'DSound.dll'
);
if
hDSound >
0
then
pDirectSoundCreate := GetProcAddress(hDSound,
'DirectSoundCreate'
);
if
pDirectSoundCreate <>
nil
then
begin
VirtualProtect(pDirectSoundCreate,
3
, PAGE_EXECUTE_READWRITE, lp);
Move(#
$C2
#
$0C
#
$00
, pDirectSoundCreate^,
3
);
end
;
hWinmm := LoadLibrary(
'Winmm.dll'
);
if
hWinmm >
0
then
pmidiStreamOpen := GetProcAddress(hWinmm,
'midiStreamOpen'
);
if
pmidiStreamOpen <>
nil
then
begin
VirtualProtect(pmidiStreamOpen,
3
, PAGE_EXECUTE_READWRITE, lp);
Move(#
$C2
#
$04
#
$00
, pmidiStreamOpen^,
3
);
end
;
if
hWinmm >
0
then
pwaveOutWrite := GetProcAddress(hWinmm,
'waveOutWrite'
);
if
pwaveOutWrite <>
nil
then
begin
VirtualProtect(pwaveOutWrite,
3
, PAGE_EXECUTE_READWRITE, lp);
Move(#
$C2
#
$0C
#
$00
, pwaveOutWrite^,
3
);
end
;
end
;
你的方法的确可以达到我的目的,我把原的来函数地址保存下来还可以随时恢愎(恢愎完要刷新网页)。真是太好了,十分感谢你。
另外:1,Move(#$C2#$0C#$00, pDirectSoundCreate^, 3);//这句里的#$C2#$0C#$00参数有没有什么讲究,难道不怕正好是另一个函数的地址吗?
2,我给您网页之后您就找到了waveOutWrite这个函数,请问您是用什么工具找的,谢谢!
1、是机器码,对应汇编语言是retn 0c。
2、可通过反汇编工具,如windbg或者ollydbg找出。
楼上的是属于挂接API 了 只不过是没有转发 而已。 有是一种方法啊