无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
12
返回列表 发新帖
楼主: yyz2191958
打印 上一主题 下一主题

[已解决] 赏1000币解决 10 PE 百分浏览器下载完成无“咚”声

  [复制链接]
31#
 楼主| 发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 15:36
找到问题了。问题出在PE中,winmm.dll库里面的函数PlaySound不管用,而浏览器在下载结束后播放音效会用到 ...

好的 我现在就试一试 谢谢
回复

使用道具 举报

32#
发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 15:36
找到问题了。问题出在PE中,winmm.dll库里面的函数PlaySound不管用,而浏览器在下载结束后播放音效会用到 ...


如果确实是winmm.dll导致的问题,那我估计补全 winmm.dll 的software注册表,应该能解决问题
回复

使用道具 举报

33#
 楼主| 发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 15:36
找到问题了。问题出在PE中,winmm.dll库里面的函数PlaySound不管用,而浏览器在下载结束后播放音效会用到 ...

确实是这个问题,现在可以了

非常感谢

点评

恭喜恭喜 但我猜就是因为注册表过于精简的原因  详情 回复 发表于 4 天前
回复

使用道具 举报

34#
发表于 4 天前 | 只看该作者
yyz2191958 发表于 2025-8-15 15:46
确实是这个问题,现在可以了

非常感谢


恭喜恭喜

但我猜就是因为注册表过于精简的原因

点评

非常感谢  详情 回复 发表于 4 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

35#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-8-15 15:49
恭喜恭喜

但我猜就是因为注册表过于精简的原因

非常感谢
回复

使用道具 举报

36#
发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 10:54
找到问题了。问题出在PE中,winmm.dll库里面的函数PlaySound不管用,而浏览器在下载结束后播放音效会用到 ...


能不能帮忙写个hook.dll,就是在我的PE( Bone_PE_wifi_26100.4770_zh-CN.wim http://bbs.wuyou.net/forum.php?mod=viewthread&tid=446700)中,当原生explorer.exe双击bitlocker分区(上锁状态)时,能自动调用system32文件夹下的unlock.cmd

点评

您这个PE能不能提供一个临时的其他下载途径,比如分卷上传到4275.com(最大200M)或者pan.huang1111.cn,这两个网盘我现在下载不到  详情 回复 发表于 4 天前
回复

使用道具 举报

37#
发表于 4 天前 | 只看该作者
刚刚那个是测试版,这个是最终版,之前那个代码没有等待音效播放完成后就停止了,音效可能会不完整,我又改了一下,顺便去除了日志记录功能(之前那个版本会在X:\ChromeFix_Logs里记录日志)。
pan.huang1111.cn/s/P6BjyFm?password=wavv63
最终版代码:
  1. // dllmain.cpp : Defines the entry point for the DLL application.
  2. // References: blog.csdn.net/king110_1/article/details/121170336
  3. #include "pch.h"
  4. #include "Detours/include/detours.h"
  5. #include <stdio.h>
  6. #include <mmsystem.h>
  7. #include <mmdeviceapi.h>
  8. #include <Audioclient.h>

  9. #pragma comment(lib, "winmm.lib")

  10. #if !defined(_WIN64)
  11. #        if defined(_DEBUG)
  12. #                pragma comment(lib, "Detours/lib.X86Debug/detours.lib")
  13. #        else
  14. #                pragma comment(lib, "Detours/lib.X86/detours.lib")
  15. #        endif
  16. #else
  17. #        if defined(_DEBUG)
  18. #                pragma comment(lib, "Detours/lib.X64Debug/detours.lib")
  19. #        else
  20. #                pragma comment(lib, "Detours/lib.X64/detours.lib")
  21. #        endif
  22. #endif

  23. #ifdef DEBUG
  24. static FILE* filelog = NULL;

  25. #define OutputLog(...) (filelog ? (fprintf(filelog, __VA_ARGS__), fflush(filelog)) : (printf(__VA_ARGS__), fflush(stdout)))
  26. #else
  27. #define OutputLog(...)
  28. #endif

  29. typedef BOOL(WINAPI* FuncPlaySoundW)(
  30.         LPCWSTR pszSound,
  31.         HMODULE hmod,
  32.         DWORD fdwSound
  33. );

  34. FARPROC pfOrigPlaySoundW = NULL;

  35. #define EXIT_ON_ERROR(hres, step) if (FAILED(hres)) { goto Exit; }

  36. #define REFTIMES_PER_SEC 5000000

  37. int SetFormat(WAVEFORMATEX* wfex)
  38. {
  39.         wfex->wFormatTag = 1;
  40.         wfex->nChannels = 2;
  41.         wfex->cbSize = 0;
  42.         wfex->nSamplesPerSec = 44100;
  43.         wfex->nAvgBytesPerSec = 44100 * 2 * 2;
  44.         wfex->wBitsPerSample = 16;
  45.         wfex->nBlockAlign = 4;
  46.         return 0;
  47. }

  48. const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
  49. const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
  50. const IID IID_IAudioClient = __uuidof(IAudioClient);
  51. const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient);

  52. HRESULT AudioClientPlayAudio(INT16* wav_buf, LONG64  dataSize)
  53. {
  54.         int sk = 0;
  55.         HRESULT hr;
  56.         IMMDevice* pDevice;
  57.         IMMDeviceEnumerator* pEnumerator = NULL;
  58.         IAudioClient* pAudioClient = NULL;
  59.         IAudioRenderClient* pRenderClient = NULL;
  60.         REFERENCE_TIME hnsRequestedDuration = REFTIMES_PER_SEC;

  61.         UINT32 bufferSizeInFrames;
  62.         DWORD initStreamFlags = (AUDCLNT_STREAMFLAGS_RATEADJUST | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY);
  63.         WAVEFORMATEX pwfx;
  64.         INT16* pData = NULL;

  65.         IAudioClock* audioClock;
  66.         UINT64 audioPlaybackFreq;
  67.         UINT64 audioPlaybackPos;
  68.         UINT64 audioPlaybackPosInSeconds;
  69.         UINT64 audioPlaybackPosInSamples;
  70.         UINT32 wavPlaybackSample = 0;
  71.         UINT32 bufferPadding;
  72.         UINT32 soundBufferLatency;
  73.         UINT32 numFramesToWrite;
  74.         int read = 0, n = 0;

  75.         UINT32 numWavSamples = (UINT32)(dataSize / (2 * sizeof(UINT16)));
  76.         DWORD num = 0;

  77.         hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  78.         EXIT_ON_ERROR(hr, "CoInitializeEx()");
  79.         hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator);
  80.         EXIT_ON_ERROR(hr, "CoCreateInstance()");
  81.         hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
  82.         EXIT_ON_ERROR(hr, "pEnumerator->GetDefaultAudioEndpoint()");
  83.         hr = pDevice->Activate(IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pAudioClient);
  84.         EXIT_ON_ERROR(hr, "pDevice->Activate()");
  85.         hr = SetFormat(&pwfx);
  86.         EXIT_ON_ERROR(hr, "SetFormat()");
  87.         hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, initStreamFlags, hnsRequestedDuration * 40, 0, &pwfx, NULL);
  88.         EXIT_ON_ERROR(hr, "pAudioClient->Initialize()");
  89.         hr = pAudioClient->GetService(__uuidof(IAudioRenderClient), (LPVOID*)(&pRenderClient));
  90.         EXIT_ON_ERROR(hr, "pAudioClient->GetService()");
  91.         hr = pAudioClient->GetBufferSize(&bufferSizeInFrames);
  92.         EXIT_ON_ERROR(hr, "pAudioClient->GetBufferSize()");
  93.         hr = pAudioClient->Start();
  94.         EXIT_ON_ERROR(hr, "pAudioClient->Start()");

  95.         while (read < dataSize / 2)
  96.         {
  97.                 hr = pAudioClient->GetCurrentPadding(&bufferPadding);
  98.                 EXIT_ON_ERROR(hr, "pAudioClient->GetCurrentPadding()");
  99.                 soundBufferLatency = bufferSizeInFrames / 50;
  100.                 numFramesToWrite = soundBufferLatency - bufferPadding;
  101.                 hr = pRenderClient->GetBuffer(numFramesToWrite, (BYTE**)(&pData));
  102.                 EXIT_ON_ERROR(hr, "pRenderClient->GetBuffer()");
  103.                 for (UINT32 i = 0; i < numFramesToWrite; i++)
  104.                 {
  105.                         pData[2 * i] = wav_buf[sk++];
  106.                         pData[2 * i + 1] = wav_buf[sk++];
  107.                         read = read + 2;
  108.                 }
  109.                 hr = pRenderClient->ReleaseBuffer(numFramesToWrite, 0);
  110.                 EXIT_ON_ERROR(hr, "pRenderClient->ReleaseBuffer()");
  111.                 hr = pAudioClient->GetService(__uuidof(IAudioClock), (LPVOID*)(&audioClock));
  112.                 EXIT_ON_ERROR(hr, "pAudioClient->GetService()");
  113.                 audioClock->GetFrequency(&audioPlaybackFreq);
  114.                 audioClock->GetPosition(&audioPlaybackPos, 0);
  115.                 audioClock->Release();
  116.                 audioPlaybackPosInSeconds = audioPlaybackPos / audioPlaybackFreq;
  117.                 audioPlaybackPosInSamples = audioPlaybackPosInSeconds * 44100;
  118.         }

  119.         UINT32 padding;
  120.         while (1)
  121.         {
  122.                 pAudioClient->GetCurrentPadding(&padding);
  123.                 if (padding == 0) break;
  124.                 Sleep(100);
  125.         }

  126. Exit:
  127.         pAudioClient->Stop();
  128.         pAudioClient->Release();
  129.         pRenderClient->Release();
  130.         CoUninitialize();

  131.         return hr;
  132. }

  133. // Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
  134. unsigned char AudioData[349532] = {
  135.         ... // 这里面是完成音效的数据,需要按照要求的格式从wav音频里提取出数据
  136. };

  137. HANDLE g_hPlayEvent;

  138. DWORD WINAPI AudioThread(LPVOID lpParameter)
  139. {
  140.         while (1)
  141.         {
  142.                 WaitForSingleObject(g_hPlayEvent, INFINITE);
  143.                 AudioClientPlayAudio((INT16*)AudioData, sizeof(AudioData));
  144.                 ResetEvent(g_hPlayEvent);
  145.         }
  146. }

  147. BOOL
  148. WINAPI
  149. MyPlaySoundW(
  150.         LPCWSTR pszSound,
  151.         HMODULE hmod,
  152.         DWORD fdwSound
  153. )
  154. {
  155.         OutputLog("PlaySoundW(%ls, %d)\n", pszSound, fdwSound);
  156.         if (pszSound && !wcscmp(pszSound, L"complete.wav") && !hmod && fdwSound == 131075)
  157.         {
  158.                 OutputLog("Intercepted, calling AudioClient to play the audio.\n");
  159.                 SetEvent(g_hPlayEvent);
  160.                 return TRUE;
  161.         }
  162.         return ((FuncPlaySoundW)pfOrigPlaySoundW)(pszSound, hmod, fdwSound);
  163. }

  164. void StartHook()
  165. {
  166.         DetourRestoreAfterWith();

  167.         DetourTransactionBegin();
  168.         DetourUpdateThread(GetCurrentThread());

  169.         HMODULE hWinmm = LoadLibraryW(L"winmm.dll");
  170.         if (hWinmm)
  171.                 pfOrigPlaySoundW = GetProcAddress(hWinmm, "PlaySoundW");
  172.         if (pfOrigPlaySoundW)
  173.                 DetourAttach(&(PVOID&)pfOrigPlaySoundW, MyPlaySoundW);
  174.         else
  175.                 OutputLog("Could not find PlaySoundW in winmm.dll\n");

  176.         LONG error = DetourTransactionCommit();
  177.         if (error == NO_ERROR)
  178.         {
  179.                 OutputLog("Hooked functions\n");
  180.         }
  181.         else
  182.         {
  183.                 OutputLog("Error hooking functions: %ld\n", error);
  184.         }
  185. }

  186. BOOL APIENTRY DllMain( HMODULE hModule,
  187.                        DWORD  ul_reason_for_call,
  188.                        LPVOID lpReserved
  189.                      )
  190. {
  191.     if (DetourIsHelperProcess())
  192.     {
  193.         return TRUE;
  194.     }
  195.     switch (ul_reason_for_call)
  196.     {
  197.     case DLL_PROCESS_ATTACH:
  198.         {
  199.                 WCHAR lpExeFilePath[MAX_PATH];
  200.                 GetModuleFileNameW(GetModuleHandle(NULL), lpExeFilePath, MAX_PATH);
  201.                 WCHAR* lpExeFileName = wcsrchr(lpExeFilePath, L'\\');
  202.                 if (lpExeFileName == NULL)
  203.                         lpExeFileName = lpExeFilePath;
  204.                 else
  205.                         lpExeFileName++;
  206.                 if (!_wcsicmp(lpExeFileName, L"chrome.exe"))
  207.                 {
  208. #ifdef DEBUG
  209.                         char logfile[MAX_PATH];
  210.                         sprintf_s(logfile, MAX_PATH, "X:\\ChromeFix_Logs\\Chromefix-%d.log", GetCurrentProcessId());
  211.                         if (fopen_s(&filelog, logfile, "a+"))
  212.                                 filelog = NULL;
  213.                         OutputLog("Attached to process %d, command line: %ls\n", GetCurrentProcessId(), GetCommandLineW());
  214. #endif
  215.                         g_hPlayEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  216.                         CreateThread(NULL, 0, AudioThread, NULL, 0, NULL);
  217.                         StartHook();
  218.                 }
  219.                 break;
  220.         }
  221.     case DLL_THREAD_ATTACH:
  222.     case DLL_THREAD_DETACH:
  223.     case DLL_PROCESS_DETACH:
  224.         break;
  225.     }
  226.     return TRUE;
  227. }

复制代码

点评

再次感谢  详情 回复 发表于 4 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

38#
 楼主| 发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 16:02
刚刚那个是测试版,这个是最终版,之前那个代码没有等待音效播放完成后就停止了,音效可能会不完整,我又改 ...

再次感谢
回复

使用道具 举报

39#
发表于 4 天前 | 只看该作者
martin313 发表于 2025-8-15 16:00
能不能帮忙写个hook.dll,就是在我的PE( Bone_PE_wifi_26100.4770_zh-CN.wim http://bbs.wuyou.net/fo ...

您这个PE能不能提供一个临时的其他下载途径,比如分卷上传到4275.com(最大200M)或者pan.huang1111.cn,这两个网盘我现在下载不到

点评

123网盘与百度网盘,都不行?  详情 回复 发表于 4 天前
回复

使用道具 举报

40#
发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 16:21
您这个PE能不能提供一个临时的其他下载途径,比如分卷上传到4275.com(最大200M)或者pan.huang1111.cn, ...


123网盘与百度网盘,都不行?
回复

使用道具 举报

41#
发表于 4 天前 | 只看该作者
太强了,学习学习

点评

我也觉得是,论坛有高手  详情 回复 发表于 4 天前
回复

使用道具 举报

42#
 楼主| 发表于 4 天前 | 只看该作者
nining376 发表于 2025-8-15 17:05
太强了,学习学习

我也觉得是,论坛有高手
回复

使用道具 举报

43#
发表于 4 天前 | 只看该作者
YWFhYmJi 发表于 2025-8-15 10:54
找到问题了。问题出在PE中,winmm.dll库里面的函数PlaySound不管用,而浏览器在下载结束后播放音效会用到 ...

学习了
回复

使用道具 举报

44#
发表于 3 天前 | 只看该作者
感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-8-19 21:15

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表