如何清理从内存加载dll中不使用的dll文件.txt

如何清理内存中不使用的dll文件.txt_百度知道
如何清理内存中不使用的dll文件.txt
我有更好的答案
打开腾讯手机管家——软件管理——软件卸载打开腾讯手机管家——清理加速,清理垃圾同时 ,可以使用腾讯手机管家的“一键体检”功能来清除垃圾文件,步骤:进入腾讯手机管家 &
右上角“一键体检” &
采纳率:90%
来自团队:
可以使用腾讯手机管家,点击清理加速的选项,手机管家会自动清理手机上缓存的垃圾文件。清理完毕之后会出现,一键清理的按钮,再点击一下就好了。管家还有小火箭,把小火箭放在桌面上就可以随时清理垃圾了。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。怎么清除内存中不被使用的DLL文件_百度知道
怎么清除内存中不被使用的DLL文件
顺便把你的QQ写下来我有好多问题要问问前辈
我有更好的答案
不要随便改动windows的注册表项,除非你认为自己被对微软很了解windows操作系统。windows的默认配设置是微软根据大量统计得出的结果,所以清除内存中不被使用的DLL文件,最好用Windows优化大师来清理。Windows优化大师是一款功能强大的系统辅助软件,它提供了全面有效且简便安全的系统检测、系统优化、系统清理、系统维护四大功能模块及数个附加的工具软件。使用Windows优化大师,能够有效地帮助用户了解自己的计算机软硬件信息;简化操作系统设置步骤;提升计算机运行效率;清理系统运行时产生的垃圾;修复系统故障及安全漏洞;维护系统的正常运转。Windows优化大师下载网址:
在注册表的HKKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion,在Explorer增加一个项AlwaysUnloadDLL,默认值设为1。注:如由默认值设定为0则代表停用此功能。
为您推荐:
其他类似问题
dll文件的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C#调用DLL显示&:尝试读取和写入未保护的内存
整个程序是自己搭建的,包含DLL内部的封装编写和C#中调用的编写,整个程序构架全部搭建出来之后,本以为可以正常运行,因为DLL里面是什么我都门儿清。
但是噩梦来了,DLL里面封装的两个函数GainMidFile和ConeCTRecon都对文件进行了读写操作,但是第一个DLL可以调用成功,第二个却始终显示“尝试读取和写入未保护的内存,这是指内存已损坏”。
一开始在找文件命名的原因,发现文件命名为1.txt不循环,貌似就成功了,所以心里更加倾向于是文件命名的问题。于是找啊找啊,发现也是时好时坏,有时候不循环也会出现错误。
百度各种解决方法,尝试了com口的释放,貌似都不行。他山之石,也不可用了。
于是在想,既然GainMidFile可以,ConeCTRecon却不可以,问题一定是他们俩不一样的地方。于是按照这个思路又找。未果。
此时时间已过去了五天。
一个bug纠结了这么久,让人十分恼火。
怎么办,机器就是这样,只懂你给它什么指令,不懂你的恼火。
昨天,一拍脑门,也是看了一个解决方法里的一句话受的启发:“一句一句的注释,找到症结”。
对呀,明明是自己写的DLL,错误再找不到那简直是日了狗了。
于是在DLL里面一小段一小段的注释,直到找到
image_final[image_size][image_size]这个矩阵,发现当把这个矩阵的相关操作注释掉,C#里调用就不会出错。又因为image_size=detector_num*resolution(分辨率),当把分辨率也设置为0的时候,C#里调用也不会出错。
所以肯定是这个矩阵image_final的定义之类的出了错误。尼玛。
image_final需要于内存读取的Data文件进行一个操作,Data的文件类型是float,而image_final我设置为了double。于是将image_final的数据类型改成double,正确。
哔了狗了,这么简单的错误,我却没有注意到。原因在于,在C语言里面直接运行(未封装到DLL里面)的时候,是不会出现这个错误的。
一个星期,浪费在这个float和double上了。
相当生气。
一个大神后来告诉我:“写入受保护的内存这个问题倒是经常出现,一般的原因就是你图像格式、大小、地址没设对”
甚觉有理。
记下来,与诸君共勉。
最近有遇到了这个问题,找到了另一种解决方法。
也是调用dll的时候显示“尝试读取和写入未保护的内存”
原因在于,对于某一个动态数组,我释放了两次,因此在第二次释放的时候,就会报错。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。内存加载SkinH.dll,不释放文件
美化程序经常要加皮肤,而各种皮肤控件(.dll)总是赤裸裸的强奸我们的视觉神经,非常的让人厌恶。
百度了下,发现牛人已经给出代码:
//---------------------------------------------------------------------------------------------------------------------------------------------
//DllFromMem.cpp
// DllFromMem.cpp: implementation of the CDllFromMem class.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DllFromMem.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDllFromMem::CDllFromMem()
m_hBaseAddress=NULL;
m_hInstance=NULL;
m_ntHead=NULL;
CDllFromMem::~CDllFromMem()
if (m_hBaseAddress)
m_dllMain(m_hInstance,DLL_PROCESS_DETACH,NULL);
VirtualFree(m_hBaseAddress,0,MEM_RELEASE);
HANDLE CDllFromMem::LoadLibraryFromRs(HINSTANCE hInstance,LPCTSTR lpType,LPCTSTR lpName)
m_hInstance=hI
HRSRC hrec=FindResource(NULL,lpName,lpType);
HRSRC hResLoad=(HRSRC)LoadResource(NULL,hrec);
unsigned char *LockRes=(unsigned char *)LockResource(hResLoad);
IMAGE_DOS_HEADER *dosH
dosHead=(IMAGE_DOS_HEADER*)LockR
m_ntHead=(IMAGE_NT_HEADERS *)(dosHead-&e_lfanew+(int)dosHead);
if(dosHead-&e_magic!=0x5a4d&&m_ntHead-&Signature!=0x4550)
MessageBox(NULL,"指定的资源不是有效的DLL文件!","装入动态链接库出错",MB_OK|MB_ICONERROR);
return NULL;
int SizeOfImage=m_ntHead-&OptionalHeader.SizeOfI
m_hBaseAddress=VirtualAlloc((LPVOID)(m_ntHead-&OptionalHeader.ImageBase),SizeOfImage,/*MEM_COMMIT*/MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if (!m_hBaseAddress)
m_hBaseAddress=VirtualAlloc(NULL,SizeOfImage,MEM_RESERVE,PAGE_EXECUTE_READWRITE);
VirtualAlloc(m_hBaseAddress,SizeOfImage,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
int SizeOfHeaders=m_ntHead-&OptionalHeader.SizeOfH
int FileAlignment=m_ntHead-&OptionalHeader.FileA
memcpy(m_hBaseAddress,LockRes,SizeOfHeaders);
IMAGE_SECTION_HEADER *sectionHead=(IMAGE_SECTION_HEADER *)(sizeof(IMAGE_NT_HEADERS)+(int)m_ntHead);
int NumberOfSections=m_ntHead-&FileHeader.NumberOfS
LPVOID desc,
for (int i=0;i&NumberOfSi++) //拷贝区段
src=LockRes+sectionHead[i].PointerToRawD
if(sectionHead[i].SizeOfRawData==0)
desc=(LPVOID)((DWORD)m_hBaseAddress+sectionHead[i].VirtualAddress);
if (i&NumberOfSections-1)
iSize=sectionHead[i+1].PointerToRawData-sectionHead[i].PointerToRawD
iSize=sectionHead[i].SizeOfRawD
memcpy(desc,src,iSize);
//以下是重定位
if (m_ntHead-&OptionalHeader.DataDirectory[5].VirtualAddress)
//如果没有重定位表表示不用重定位,跳过重定位代码
DWORD relocation=(DWORD)m_hBaseAddress-m_ntHead-&OptionalHeader.ImageB
IMAGE_BASE_RELOCATION
*relocationAddress=(IMAGE_BASE_RELOCATION*)(m_ntHead-&OptionalHeader.DataDirectory[5].VirtualAddress+(DWORD)m_hBaseAddress);
while (relocationAddress-&VirtualAddress!=0)
LPVOID rva=(LPVOID)((DWORD)m_hBaseAddress+relocationAddress-&VirtualAddress);
DWORD BlockNum=(relocationAddress-&SizeOfBlock-8)/2;
if (BlockNum==0)
WORD *Offset=(WORD *)((DWORD)relocationAddress+8);
for (int i=0;i&(int)BlockNi++)
if((Offset[i]&0xF000)!=0x3000)
tmp=(DWORD*)((Offset[i]&0xFFF)+(DWORD)rva);
*tmp=(*tmp)+
relocationAddress=(IMAGE_BASE_RELOCATION*)((DWORD)relocationAddress+relocationAddress-&SizeOfBlock);
//重定位结束
//以下是重建IAT
char MsgError[256]={0};
if (m_ntHead-&OptionalHeader.DataDirectory[1].VirtualAddress) //如果没用导入表则跳过
IMAGE_THUNK_DATA *IAT,*INT
IMAGE_IMPORT_BY_NAME *IatByN
IMAGE_IMPORT_DESCRIPTOR *importAdd=(IMAGE_IMPORT_DESCRIPTOR *)((DWORD)m_hBaseAddress+m_ntHead-&OptionalHeader.DataDirectory[1].VirtualAddress);
while(importAdd-&Name)//(importAdd-&FirstThunk)
lib=LoadLibrary((char *)(importAdd-&Name+(DWORD)m_hBaseAddress));
if (lib==NULL) //装载库出错
wsprintf(MsgError,"装入动态链接库%s出错!",(char *)(importAdd-&Name+(DWORD)m_hBaseAddress));
MessageBox(NULL,MsgError,"错误",MB_OK|MB_ICONERROR);
return NULL;
IAT=(IMAGE_THUNK_DATA *)(importAdd-&FirstThunk+(DWORD)m_hBaseAddress);
INTable=(IMAGE_THUNK_DATA *)((importAdd-&OriginalFirstThunk?importAdd-&OriginalFirstThunk:importAdd-&FirstThunk)+(DWORD)m_hBaseAddress);
while (INTable-&u1.AddressOfData)
if (((DWORD)INTable-&u1.Function&0x800000)==0)
IatByName=(IMAGE_IMPORT_BY_NAME *)((DWORD)INTable-&u1.AddressOfData+(DWORD)m_hBaseAddress);
IAT-&u1.Function=(DWORD)GetProcAddress(lib,(char *)(IatByName-&Name));
IAT-&u1.Function=(DWORD)GetProcAddress(lib,(LPCSTR)(INTable-&u1.Ordinal^0x7FFFFF));
INTable++;
importAdd++;
//重建IAT结束
//调用dll的入口函数
m_dllMain=(myDllMain)(m_ntHead-&OptionalHeader.AddressOfEntryPoint+(DWORD)m_hBaseAddress);
m_dllMain(m_hInstance,DLL_PROCESS_ATTACH,NULL);
PatchData();//给dll打补丁,如果不需要打补丁,这行可以注释掉;
return m_hBaseA
FARPROC CDllFromMem::GetProcAddressFromRs(LPCSTR lpProcName)
IMAGE_EXPORT_DIRECTORY *ExportTable=(IMAGE_EXPORT_DIRECTORY *)(m_ntHead-&OptionalHeader.DataDirectory[0].VirtualAddress+(DWORD)m_hBaseAddress);
DWORD *ExportNameAddress=(DWORD*)(ExportTable-&AddressOfNames+(DWORD)m_hBaseAddress);
WORD *AddressOfNameOrdinals=(WORD*)(ExportTable-&AddressOfNameOrdinals+(DWORD)m_hBaseAddress);
DWORD *AddressOfFunction=(DWORD*)(ExportTable-&AddressOfFunctions+(DWORD)m_hBaseAddress);
char *ExportN
int j=0;//要判断是否是以序号查找的
int i=ExportTable-&NumberOfN
if((DWORD)lpProcName&0xFFFF) //以名字查找
for (j=0;j&i;j++)
ExportName=(char *)((DWORD)*ExportNameAddress+(DWORD)m_hBaseAddress);
if (!strcmpi(lpProcName,ExportName))
return (FARPROC)(AddressOfFunction[AddressOfNameOrdinals[j]]+(DWORD)m_hBaseAddress);
ExportNameAddress++;
return NULL;
else //以序号查找;
j=(DWORD)lpProcName-ExportTable-&B
if (j&=ExportTable-&NumberOfFunctions) return NULL;
return (FARPROC)(AddressOfFunction[j]+(DWORD)m_hBaseAddress);
return NULL;
void CDllFromMem::PatchData()
DWORD PatchContent[][2]={0xx0};//rva,
int i=sizeof(PatchContent)/(sizeof(DWORD)*2);
for (int j=0;j&i;j++)
*(char*)((char*)m_hBaseAddress+PatchContent[j][0])=(char)PatchContent[j][1];
//---------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------------------------
//DllFromMem.h
// DllFromMem.h: interface for the CDllFromMem class.
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DLLFROMMEM_H__233D9B97_BA88_48C7_AC00_F1__INCLUDED_)
#define AFX_DLLFROMMEM_H__233D9B97_BA88_48C7_AC00_F1__INCLUDED_
#if _MSC_VER & 1000
#pragma once
#endif // _MSC_VER & 1000
typedef BOOL (WINAPI *myDllMain)(
HINSTANCE hinstDLL,
// handle to the DLL module
DWORD fdwReason,
// reason for calling function
LPVOID lpvReserved
// reserved
class CDllFromMem
CDllFromMem();
virtual ~CDllFromMem();
HANDLE LoadLibraryFromRs(HINSTANCE hInstance,LPCTSTR lpType,LPCTSTR lpName);
FARPROC GetProcAddressFromRs(LPCSTR lpProcName);
void PatchData();
HANDLE m_hBaseA
HINSTANCE m_hI
IMAGE_NT_HEADERS *m_ntH
myDllMain m_dllM
#endif // !defined(AFX_DLLFROMMEM_H__233D9B97_BA88_48C7_AC00_F1__INCLUDED_)
//---------------------------------------------------------------------------------------------------------------------------------------------
代码已经比较完整,只要稍微改动就可以使用
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!教初学者如何把执行文件内存中的DLL的代码全部保存下来
互联网 & 发布时间: 21:29:17 & 作者:佚名 &
有时,有些软件有保护,看不到他程序内部是怎么一个样,如果想简单的把他的内存保存下来!
我写了一个简单的函数,调用一下就可以把DLL和EXE的内存里的信息全部导到文件里!到时再慢慢查吧!
procedure GetDLLMemToF
有时,有些软件有保护,看不到他程序内部是怎么一个样,如果想简单的把他的内存保存下来!
我写了一个简单的函数,调用一下就可以把DLL和EXE的内存里的信息全部导到文件里!到时再慢慢查吧!
procedure GetDLLMemToF
lppe: TModuleEntry32;
File111: TFileS
dd, Add1, Add2, index:
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessID);
lppe.dwSize := SizeOf(lppe);
found := Module32First(Hand, lppe);
while found do
File111 := TFileStream.Create('debug\'
extractfilename(lppe.szExePath), $FFFF);
Add1 := dword(lppe.modBaseAddr);
Add2 := Add1
lppe.modBaseS
index := dword(lppe.modBaseAddr);
while true do
dd := Pdword(index)^;
File111.WriteBuffer(dd, 4);
inc(index, 4);
if index &= Add2 - 4
found := Module32Next(Hand, lppe);
CloseHandle(Hand); // 释放快照句柄
大家感兴趣的内容
12345678910
最近更新的内容

我要回帖

更多关于 进程 dll内存大小 的文章

 

随机推荐