问题:求救:1.在指定天数后,结束一个进程并删除进程文件。
进程名 shell.exe lms.exe
进程文件路径 c:/lms2/shell.exe
2.指定的天数 写在一个txt文本文件里面,用户可以修改里面的天数值。
很急在线等,请高手帮忙。小弟是新手,谢谢了!
回复1:
是所结束的进程本身实现这个功能,还是在另一个程序上实现这种功能?
对于在要结束的程序本身里面实现功能,可以这样:
timer计时,直到满了指定天数后,,将程序本身删除,方法如下:下面的程序可以删除自身:
#include <windows.h>
int main(int argc, char *argv[])
{
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm {
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
return 0;
}
//----------
对于另一个程序来结束指定程序并删除的话,就更好办了
枚举所有进程,用进程名与你要结束的进程名比较,如果相等,则取得这个这个进程的全路径,备用,下面正式处理:
1.根据取得的进程句柄关闭这个这个进程.
2.根据刚才取得的进程全路径删除这个文件.
所有工作就完成了.详细工作的补充:
在VC中枚举系统所有进程:
需要引用的头文件:Tlhelp32.h
用到的API函数:CreateToolhelp32Snapshot、Process32First、Process32Next
代码如下:
// 枚举所有进程
void CEnumProcDlg::EnumProc(void)
{
PROCESSENTRY32 proc;
HANDLE snap = NULL;
CString procInfo;
BOOL theloop;
char exeName[] = ( "shell.exe "); //这是你的程序名,看明白了.
char ss[100] = { '/0 '};
int i = 0;
snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); //获取进程快照句柄
proc.dwSize = sizeof(PROCESSENTRY32);
theloop = Process32First(snap, &proc); //查找第一个进程
while(theloop)
{
procInfo.Format( "进程名:%s 进程ID:%d 父进程ID:%d ",proc.szExeFile,proc.th32ProcessID,proc.th32ParentProcessID);
ChgString(proc.szExeFile, ss);//自定义函数,字符转化为小写,你可以用CString的Tolower()一样的.
if(strcmp(exeName,ss) == 0 )
{
HANDLE g_h = OpenProcess(PROCESS_ALL_ACCESS,TRUE,proc.th32ProcessID); //获取进程句柄
// if(g_h!=NULL)
// MessageBox( "OK ", "OK ",MB_OK); //输出提示信息
}
theloop = Process32Next(snap,&proc); //查找下一个进程
i++;
}
}
取得执行文件名再:
DWORD GetModuleFileName(
HMODULE hModule, // handle to module
LPTSTR lpFilename, // file name of module
DWORD nSize // size of buffer
);
返回的是带路径的
删除文件用DeleteFile()
说得这么详细,和帮你写出来差不了,你自己再花三五分钟写一下吧.
回复2:
可以选择Wininit.ini
【原创】探秘Wininit.ini[高手勿进]
手链魔咒
--------------------------------------------------------------------------------
这篇文章没什么技术性..只是偶尔我遇到点东西.跟不知道的人分享下``我估计大部分都知道这个秘密= = ¦ ¦
由于一直裸笨..前几天中了个病毒`.手工杀毒.到网上查这个病毒.发现这个病毒用到了Wininit.ini.随后查这个是个什么东西.
百度上是这么说的,大家看下.
用过Windows 9x的人都见过如下的提示信息:
Please wait while Setup updates your configuration files.
This may take a few minutes……
这是安装完某个软件或者硬件的驱动程序,应安装程序的要求重新启动Windows后的正常现象,绝不会把它与病毒联系起来,本文将用事实告诫你,如果你的机器启动时无缘无故地出现上述信息,就要赶紧去找最新的杀毒软件了!
这时Windows在干什么呢?实际上它在执行Wininit.ini给出的指令,Wininit.ini是一个鲜为人知的文件,主要用于删除、更名和更新在Windows运行时不能被施以这些操作的文件,它存在的时间很短,所以显得有点神秘。
Wininit文件工作机
众所周知,在Windows中,一个可执行文件如果正在运行或某个库文件(*.dll、*.vxd、*.sys等)正在被打开使用,则不能被改写或删除。例如,你不可能在资源管理器中删除/Windows/explorer.exe,而在Windows的GDI界面下,有一些文件一直处于这种状态下,除explorer.exe外,还有显示驱动程序库文件,文件子系统库文件等,如果我们要对这些文件进行升级,改动,就必须在Windows保护模式核心启动前进行,于是Windows就提供了基于Wininit.ini文件的一个机制来完成这个任务,这个机制是,要删除或改写这类文件的应用程序按一定的格式把命令写入 Wininit.ini。Windows在重启时,将在Windows目录下搜索Wininit.ini文件,如果找到,就遵照该文件指令删除、改名、更新文件,完成任务后,将删除Wininit.ini文件本身,继续启动过程。所以Wininit.ini文件中的指令只会被执行一次,列目录时也通常没有它的踪影。
Wininit.ini文件的格式简述如下:
Windows 95 Resource Kit提到Wininit.ini文件有三个可能的段,但只叙述了“rename”段的用法,虽然名为“rename”,却可实现删除、改名、更新文件的功能。其格式为:
[rename]
……
filename1=filename2
……
行“filename1=filename2”相当于依次执行“copy filename2 filename1”及“del filename2”这两个DOS命令。
启动时,Windows将用filename2覆盖filename1,再删除filename2,这就实现了用filename2与更新filename1的目的,如果filename1不存在,实际结果是将filename2改名为filename1;如果要删除文件,可令filename1为nul,例如:
[rename]
……
nul=filename2
……
将删除filename2。
以上文件名都必须包含完整路径,注意:由于Wininit.ini文件的处理是在Windows文件系统调入前,所以不支持长文件名。
Wininit.ini的应用很多,除了经常在软硬件的安装程序中用到外,还有软硬件的卸载程序中用到,比如:假设你要为自己的软件编写一个卸载程序,这个卸载程序本身是不可能被自己删除的,因为它试图删除自身时,自身却正在运行。为了清除卸载程序本身,你就得借助于Wininit.ini文件。顺便提一句,在安装Windows的最后阶段,就是利用Wininit.ini文件来清除和更名被安装程序SETUP自身使用的文件。
也就是说Wininit.ini是一种windows自带的一种功能.由于一般情况下都很少见到.因为在你的系统文件夹下这个文件是不会存在的.因为在windows启动完成后.这个文件已经被windows自动删除.如果你在你的系统中见到了这个文件夹.那你就要小心了.也许是病毒在搞鬼.
上面删除的用法已经说明的非常详细了.但是我还有点疑问.我继续百度后.发现了这些..
[RENAME]
DIRNUL=C:/SMENU
上面的项目会在二次启动后删除C:/SMENU目录和它的下级目录与文件.但是这个项目是危险的,如果是DIRNUL=C:/或DIRNUL=D:/
会怎样呢...
[DIRNUL]
C:/SMENU=1
会在二次启动后删除C:/SMENU目录和它的下级目录与文件.
我比较胆小.没敢试试
[DIRNUL]
C:/=1
但是我试了其他的目录.都是不可以实现的.难道是XP下为了保证系统的安全,删除了这个删除文件夹功能的原因??我不得而知了.
但是删除文件是可以的.所以用这个东西写了这个东东^_^..