原文:https://www.pediy.com/kssd/pediy12/131339.html
http://www.52pojie.cn/thread-84483-1-1.html
成品
动手给音速启动加点动力、
音速启动这玩艺我也用了好几年了、昨天上官网发现作者也很久不更新了- -
习惯了还是舍不得放弃,可是每当用它打开很多文件夹的时候,任务管理器里的explorer进程多到让人感觉蛋疼,今天我就动手来给他加点动力,让它打开文件夹的时候不再这么蛋疼。
原理是HookVB的rtcShell,执行我们指定的处理流程。
VB 里的Shell函数执行的这条命令,调用参数自己猜(=w=微软自然没有那么好心)、看了几个调用以后猜测应该是2个参数,第一个参数指向一个pParam结构体,第二个总是1(类似于SW_SHOW么?)
看一看调用
0012F658 00605B79 返回到 VStart_-.00605B79 来自 MSVBVM60.rtcShell
0012F65C 0012F74C
0012F660 00000001
rtcShell入口两个变量、
0012F664 0012F7E0
0012F668 0012F864
0012F66C 00000001
0012F670 00630069 VStart_-.00630069
0012F674 0049006B VStart_-.0049006B
0012F678 0064006E VStart_-.0064006E
我猜测的结构体信息
typedef struct
{
DWORD dwType;
DWORD pSelf;
PWCHAR pCommand;
}rtcParam;
函数类型
typedef HMODULE (WINAPI __pfnrtcShell)(rtcParam* pParam,DWORD unknow);
Hook以后用OutputDebugString格式化一些参数变量、然后多调用几次、寻找规律。
char temp[MAX_PATH]; sprintf(temp,"call from: 0x%.8X\nType:0x%X",RetAddr,pParam->pSelf); OutputDebugString(temp); OutputDebugStringW(pParam->pCommand);
void SelectByExplorer(LPWSTR lpPath) { LPSHELLFOLDER IpsfDeskTop; LPITEMIDLIST pidl; SHGetDesktopFolder(&IpsfDeskTop); IpsfDeskTop ->ParseDisplayName(NULL, NULL, lpPath, NULL, &pidl, NULL); IpsfDeskTop->Release(); // if (FAILED(hres)) return FALSE; SHOpenFolderAndSelectItems(pidl,0,NULL,NULL); }