windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/keisoku7.cpp
2020-09-26 16:20:57 +08:00

86 lines
1.8 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Keisoku7.cpp
Abstract:
The app has an executable bplayer.exe to launch its virtual CD driver. The
problem is bplayer.exe is put in start-group and will be launched by
explorer.exe, at the time the virtual CD driver is launched, explorer.exe
has already finished initialization and cached all local drive info. Fixing
this by broadcasting a WM_DEVICECHANGE message.
Notes:
This is an app specific shim.
History:
06/20/2001 xiaoz Created
--*/
#include "precomp.h"
#include "Dbt.h"
IMPLEMENT_SHIM_BEGIN(Keisoku7)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(StartServiceA)
APIHOOK_ENUM_END
/*++
Hook StartServiceA to broadcast a WM_DEVICECHANGE message
--*/
BOOL
APIHOOK(StartServiceA)(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
LPCSTR *lpServiceArgVectors
)
{
BOOL bRet;
DEV_BROADCAST_VOLUME devbVol;
bRet = ORIGINAL_API(StartServiceA)(hService, dwNumServiceArgs,
lpServiceArgVectors);
//
// If succeed, we will broadcast WM_DEVICECHANGE message
//
if (bRet)
{
devbVol.dbcv_size = sizeof(DEV_BROADCAST_VOLUME);
devbVol.dbcv_devicetype = DBT_DEVTYP_VOLUME;
devbVol.dbcv_reserved = 0;
devbVol.dbcv_unitmask = 0x3FFFFF8; // All drives except A: B: C:
devbVol.dbcv_flags = 0;
SendMessageTimeout(HWND_BROADCAST, WM_DEVICECHANGE, DBT_DEVICEARRIVAL,
(LPARAM) &devbVol, SMTO_NOTIMEOUTIFNOTHUNG, 1000, NULL);
LOGN(eDbgLevelWarning, "WM_DEVICECHANGE broadcasted");
}
return bRet;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(ADVAPI32.DLL, StartServiceA)
HOOK_END
IMPLEMENT_SHIM_END