HANDLE hResource = ::BeginUpdateResource(m_strFileName, FALSE);
bResult = ::UpdateResource(hResource, _T("MYDATA"), MAKEINTRESOURCE(IDR_MY_DATA),
MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), pbyData, dwLen);
bResult = ::EndUpdateResource(hResource, FALSE);// 上面每次调用,都是成功的,如果文件名是自己,虽然也会成功,但是实际结果却是资源没有改变 :(
不知道,不代表不可以!
程序删除自己是可行的。用修改栈的方法 UnmapViewOfFile,后执行删除操作就行了。这里的参数都是已知的。
但是我没法用相同的方法把BeginUpdateResource的返回值传给UpdateResource和EndUpdateResource
to Luxm():
返回值确实是成功的,呵呵
// ============================================
// KillSelf.cpp - YangTze presents - 12/21/2001
// ============================================#include "stdafx.h"#include <windows.h>typedef struct A
{
int a;
char ch;
WORD wd;
A* next;
};class xx
{
private:
int a;
};int main(int argc, char* argv[])
{ int i=sizeof(xx); // 获取映像地址
HINSTANCE hModule = GetModuleHandle(0);
// 保存文件完整路径
char buf[MAX_PATH];
// 获取文件完整路径
GetModuleFileName(hModule,buf,sizeof(buf));
// 获取 ExitProcess/DeleteFile/UnmapViewOfFile 等 API 函数地址
//DWORD pExitProcess=(DWORD)ExitProcess;
//DWORD pDeleteFile=(DWORD)DeleteFileA;
//DWORD pUnmapViewOfFile=(DWORD)UnmapViewOfFile; // 获取 KERNEL32 模块句柄
HINSTANCE hKernel=GetModuleHandle("KERNEL32");
// 获取 ExitProcess/DeleteFile/UnmapViewOfFile 等 API 函数地址
DWORD pExitProcess=(DWORD)GetProcAddress(hKernel,"ExitProcess");
DWORD pDeleteFile=(DWORD)GetProcAddress(hKernel,"DeleteFileA");
DWORD pUnmapViewOfFile=(DWORD)GetProcAddress(hKernel,"UnmapViewOfFile"); // 关闭文件映像句柄
CloseHandle(HANDLE(4)); __asm
{
lea eax,buf // 设置待删除文件路径
push 0 // 设置 ExitProcess 入口参数
push 0 // ExitProcess 的返回地址
push eax // 设置 DeleteFile 入口参数
push pExitProcess // DeleteFile 的返回地址
push hModule // 设置 UnmapViewOfFile 入口参数
push pDeleteFile // UnmapViewOfFile 的返回地址
push pUnmapViewOfFile // 下面 ret 指令的返回地址
ret
}
return 0;
}