这个是帮别人写的。具体用途不详。
// 通过PSAPI函数枚举进程
#include "stdio.h"
#include "string.h"
#include "windows.h"
// 定义函数指针
typedef BOOL (__stdcall* funEnumPorcess)(DWORD *lpidProcess, // 进程ID
DWORD cb, // lpidProcess的大小
DWORD *cbNeeded); // 实际使用lpidProcess的字节数
typedef DWORD (__stdcall* funGetModuleFileNameEx)(HANDLE hProcess, // 待获得进程名称的进程句柄
HMODULE hModule, // 当前调用进程的句柄
LPTSTR lpFileName, // 记录返回的进程名称
DWORD nSize); // lpFileName大小
const DWORD MAXPROCESS = 500; // 假设当前系统最大有500个进程正在执行
int main (){
while(1){
killer();
};
} ;
int killer()
{
char FileName[] = "notepad.exe"; // 大小写任意
char NameBuff[MAX_PATH];
char *pFileName; // pFileName转化为大写后的字符串指针
char *pNameBuff; // NameBuff转化为大写后的字符串指针
BOOL bRes; // 返回结果
HINSTANCE hInstance; // 动态库句柄
HANDLE hHandle; // 进程句柄
int i, j; // 循环变量
int len;
funEnumPorcess EnumProcesses;
funGetModuleFileNameEx GetModuleFileNameEx;
DWORD *buffer, maxNum, factNum;
maxNum = MAXPROCESS;
factNum = MAXPROCESS;
buffer = (DWORD *)malloc(maxNum);
hInstance = LoadLibrary("psapi.dll"); // 装载psapi.dll
if (hInstance)
{
EnumProcesses = (funEnumPorcess)GetProcAddress(hInstance, "EnumProcesses");
if (EnumProcesses)
{
bRes = EnumProcesses(buffer, maxNum, &factNum); // 枚举进程,得到进程名称和实际进程总大小
if (bRes)
{
factNum /= sizeof(DWORD); // 计算实际进程个数
GetModuleFileNameEx = (funGetModuleFileNameEx)GetProcAddress(hInstance, "GetModuleFileNameExA");
if (GetModuleFileNameEx)
{
for (i=0; i<factNum; i++)
{
hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, buffer[i]); // 获取进程句柄
if (hHandle)
{
bRes = GetModuleFileNameEx(hHandle, NULL, NameBuff, MAX_PATH); // 获取进程名称
if (bRes)
{
pFileName = strupr(FileName); // 字符串转化为大写
pNameBuff = strupr(NameBuff);
if (strstr(pNameBuff, pFileName) != NULL) // 名字查找
{
if (TerminateProcess(hHandle, 0));
{
printf("关闭 %s 成功\n", NameBuff);
break;
}
}
}
// 关闭句柄
CloseHandle(hHandle);
}
}
}
}
}
// 释放动态库
FreeLibrary(hInstance);
}
free(buffer);
return 0;
}
分享到:
相关推荐
在C语言中,进程信号处理是操作系统与程序交互的重要机制,用于通知进程发生了特定的事件。本篇文章将详细探讨如何查询进程信号是否被遮罩(屏蔽)或搁置(挂起),并介绍两个关键的系统调用:`sigprocmask()` 和 `...
在多线程编程中,这是创建并发执行任务的关键函数,它可以让你的程序同时处理多个任务,提高程序的运行效率。 `bios_*`系列函数如`_bios_disk`、`_bios_equiplist`、`_bios_keybrd`等,它们都是直接调用BIOS(基本...
- `c_exit`, `cexit`: 这两个函数在`process.h`中定义,它们的作用与`_exit`相似,但不终止程序执行,而是进行特定的清理工作后继续运行。 - `chdrive`: 来自`direct.h`,用于设置当前的工作驱动器,如`chdrive('C...
- **进程**:操作系统执行作业的基本单位,代表一个正在运行的程序实例。 **6. 数据的逻辑结构与存储结构** - **逻辑结构**:描述数据元素之间的逻辑关系,与数据的存储结构无关。 - **存储结构**:数据在计算机...
此程序在运行1秒后会被`SIGALRM`信号终止,可以根据最终打印出的`I`值来评估不同系统的性能。 #### 四、结论 通过对Linux下C语言编程中信号处理函数的学习,我们可以更深入地理解如何有效地管理和响应各种信号事件...
根据要求完成父进程与子进程之间通信。 父进程定时、随机产生一个由 12 个字符组成的字符串,子进程获取此字符 ...要求程序在运行过程种屏蔽 “Ctrl+C”,仅当程序接收到键盘输入“q”或“Q”时退出。
为了创建一个僵尸进程并验证其状态,可以编写以下C语言程序: ```c #include #include #include int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("Child process running.\n"); exit...
5. **作业与进程的区别**:“作业与进程”的概念,作业是用户提交给系统的整体工作单元,而进程是操作系统中运行的程序实例,作业由系统自动创建进程来执行。 6. **数据逻辑结构与物理结构**:“数据的逻辑结构是从...
进程是Linux中的执行单元,每个程序在运行时都会被系统转化为一个或多个进程。书中会讲解如何创建、管理和控制进程,包括fork()、exec()和wait()等系统调用的使用,以及进程间的同步和通信机制,如信号量、管道、...
4. 进程与程序的区别:程序是静态的指令集合,而进程是程序的动态执行实例,有状态且可以前台或后台运行。 填空题中,考察了进程间通信方式、管道的优势、消息队列的特点、SQLite数据库类型、SQLite的C语言操作方法...
进程是操作系统资源分配的基本单位,它包含了执行程序的上下文,包括正文段(程序代码)、用户数据段(程序运行时的数据)以及系统数据段(如进程控制块,用于记录进程状态等信息)。在Linux中,进程可以是批处理...
- 进程具有状态,如上述的就绪、运行、等待状态,而程序本身没有这种状态概念。 5. **进程间通信(IPC)** - 常见的IPC方式包括无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字等。 - 命名管道...
此外,如果聊天程序的网址被白名单屏蔽,那么在虚拟机内运行可以绕过这个限制,因为虚拟机可能有独立的网络设置和访问规则。 至于“word格式”,这可能是指聊天记录或消息是以Microsoft Word文档的格式进行保存或...
本压缩包"进程通信之信号.zip"包含了几个与信号(Signal)相关的C语言源代码文件,这是一类用于进程间通信的基础方法。让我们详细探讨一下Linux信号及其在代码中的应用。 1. **信号的概念**: 信号是Linux系统中一...