#include #include #include #include #include #include #include #include #include #include #include #include #include
#define SHM_FLAG 0666
// 模拟系统进程的窗口类名和标题 #define WINDOW_CLASSNAME "Shell_TrayWnd" #define WINDOW_TITLE "任务栏"
typedef struct { DWORD pid; int sockfd; } share_data;
// 关闭相邻进程 void CloseAdjacentProcess(DWORD pid);
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
void* thread_func(void* arg) { // 创建Socket并绑定 int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = IN_ANY; servaddr.sin_port = htons(0); if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind error"); exit(1); }
// 获取已分配的端口号
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
getsockname(sockfd, (struct sockaddr*)&addr, &len);
int port = ntohs(addr.sin_port);
// 创建Socket并连接到服务器
const char* server_ip = "127.0.0.1";
int server_port = 12345;
int server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
connect(server_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// 发送自己的Socket端口号
share_data share_data;
share_data.pid = 0;
share_data.sockfd = sockfd;
write(server_sockfd, &share_data, sizeof(share_data));
// 监听Socket
listen(sockfd, 1);
// 接受客户端连接
int connfd = accept(sockfd, (struct sockaddr*)NULL, NULL);
// 读取共享内存中PID
DWORD pid = 0;
read(connfd, &pid, sizeof(DWORD));
// 写入当前程序的PID
DWORD my_pid = GetCurrentProcessId();
write(connfd, &my_pid, sizeof(DWORD));
// 执行1 + 1操作
int a = 1, b = 1;
int sum = a + b;
// 判断结果是否等于2,如果等于2则关闭相邻进程
if (sum == 2) {
// 获取共享内存中的数据,判断是否已经在其他线程中关闭了相邻进程
share_data other_share_data;
read(connfd, &other_share_data, sizeof(other_share_data));
DWORD other_pid = other_share_data.pid;
if (other_pid != 0 && other_pid != pid) {
// 关闭相邻进程
CloseAdjacentProcess(other_pid);
// 发送自己的PID到对方进程
share_data.pid = my_pid;
write(other_share_data.sockfd, &share_data, sizeof(share_data));
// 将程序窗口图标置灰
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnap, &entry)) {
do {
if (entry.th32ProcessID == other_pid) {
// 枚举进程的所有窗口,并将图标置灰
EnumWindows(EnumWindowsProc, (LPARAM)other_pid);
break;
}
} while (Process32Next(hSnap, &entry));
}
CloseHandle(hSnap);
}
// 分离共享内存
close(other_share_data.sockfd);
close(connfd);
close(sockfd);
return NULL;
}
// 发送共享内存中的PID到下一个线程
share_data.pid = pid;
write(server_sockfd, &share());
// 分离共享内存
shmdt(ptr);
return NULL;
}
int main() { const int NUM_THREADS = 5; const int port = 12345; const char* server_ip = "127.0.0.1";
// 请求管理员权限
char path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
ShellExecute(NULL, "runas", path, NULL, NULL, SW_SHOW);
// 创建Socket并连接到服务器
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, server_ip, &servaddr.sin_addr);
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
// 创建共享内存
int shmid = shmget(IPC_PRIVATE, sizeof(share_data), IPC_CREAT | SHM_FLAG);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
// 获取共享内存指针
share_data* ptr = (share_data*)shmat(shmid, NULL, 0);
if (ptr == (void*) -1) {
perror("shmat failed");
exit(1);
}
// 初始化共享内存
ptr->pid = 0;
ptr->sockfd = sockfd;
// 创建多个线程
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
// 等待线程结束
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
// 关闭相邻进程 void CloseAdjacentProcess(DWORD pid) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (hProcess != NULL) { BOOL bRet = TerminateProcess(hProcess, 0); CloseHandle(hProcess); } }
// 枚举窗口回调函数 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid = 0; GetWindowThreadProcessId(hwnd, &pid); if (pid == (...DWORD)lParam) { // 将窗口图标置灰 HICON hIcon = LoadIcon(NULL, IDI_APPLICATION); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); return FALSE; } return TRUE; }
标签: