利用apihook,实现微信电脑版音量放大

微信电脑版,pc上运行。工作聊天利器。但是用下来发现,播放语音音量很小,如果把系统音量调大最大,凑合能听到,但是其他app的音量又太大,闲来无事,就写了音量放大器。

背景分析:

经过od分析,微信电脑版,播放声音调用的waveout打头的一系列api,播放用的是waveOutWrite,该函数原型如下:

MMRESULT mywaveOutWrite(
    HWAVEOUT  hwo,
    LPWAVEHDR pwh,
    UINT      cbwh
)

/* wave data block header */
typedef struct wavehdr_tag {
    LPSTR       lpData;                 /* pointer to locked data buffer */
    DWORD       dwBufferLength;         /* length of data buffer */
    DWORD       dwBytesRecorded;        /* used for input only */
    DWORD_PTR   dwUser;                 /* for client's use */
    DWORD       dwFlags;                /* assorted flags (see defines) */
    DWORD       dwLoops;                /* loop control counter */
    struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
    DWORD_PTR   reserved;               /* reserved for driver */
} WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;

其中pwh即为音频相关数据,其中dwBufferLength为音频长度,lpData为音频数据,pcm原始数据,一般为16位的立体声数据

遂写一个apihook,hook该api的调用,然后在hook函数中,将lpData乘以放大倍数即可实现音量放大。核心代码如下:

MMRESULT mywaveOutWrite(
    HWAVEOUT  hwo,
    LPWAVEHDR pwh,
    UINT      cbwh
)
{
    _hooks.End(_hwaveOutWrite);

    int v = GetVolumnFromMain();
    if (v != -1)
    {
        double vol = (double)v;
        short* lpData = (short*)pwh->lpData;
        for (int i = 0; i < pwh->dwBufferLength / 2; i++)
        {
            int nd = lpData[i] * vol;
            if (nd > 32767)
                nd = 32767;
            else if (nd < -32768)
                nd = -32768;
            lpData[i] = nd;
        }
    }
    MMRESULT res = waveOutWrite(hwo, pwh, cbwh);
    _hooks.Begin(_hwaveOutWrite);
    return res;
}

apihook相关代码请参考附件代码,欢迎指正。

https://pan.baidu.com/s/1SvksGd8FydMmiO6-qfp96w

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值