黑客防线,在攻与防的对立统一中寻求突破!2001年创刊的黑客技术专业刊物!

设为首页
收藏本站
联系我们
网站导航

黑客论坛 - 公共交流区 - 技术交流 - 浏览 - [求助]如何编程清理内存
用户体验升级,欢迎参与!        您是本贴第 475 位浏览者 本版版主

帖子主题: [求助]如何编程清理内存

  • ColdZenLeft
  • 等级: 黑客防线技术团队
  • 发贴: 158 贴
  • 货币: 0 金币
  • 积分: 1586 分
  • 经验: 1355 点
  • 体力: 12725 点
  • 注册: 2007-12-11
[求助]如何编程清理内存
曾经见过有同学用过一种软件据说是清理冗余内存,效果仿同重启之后。

由于编的那个找钩子程序,目前因用它有过三次蓝屏(总共调试加测试用了大概100多次)。我觉得最可能出现就是在上了很久的网或是打过n久的游戏之后(电脑公用的坏处)。

我记得那不是用的内核方面的东东,貌似ring3的API函数。但是对这个不清楚,甚至怎么提问都不大清楚。

我希望能编个类似的程序,至少加这么几个API让人心理相对塌实点,有没有软件说得这么神奇的效果不大重要。

希望懂点的人指点下应该怎么办。。。

left has been left
2008-8-12 23:03:05
  • xfill
  • 等级: 黑客防线技术团队
  • 发贴: 150 贴
  • 货币: 0 金币
  • 积分: 1737 分
  • 经验: 1795 点
  • 体力: 9775 点
  • 注册: 2008-06-08
Re:[求助]如何编程清理内存
内存整理原理不复杂,就是申请一块超大的内存,因为物理内存有限,所以操作系统无法申请到足够的内存,就会将已经占用的物理内存移动到分页,空出更多的物理内存,给程序申请,这样就实现了内存整理,申请完以后释放掉就OK了。
今宵酒醒何处,杨柳岸晓风残月。 - 《雨霖霖》 &  晓风组 X.F.S.T
2008-8-12 23:29:29
  • Fireworm
  • 等级: 金牌VIP
  • 发贴: 132 贴
  • 货币: 0 金币
  • 积分: 3145 分
  • 经验: 745 点
  • 体力: 28120 点
  • 注册: 2008-07-01
Re:[求助]如何编程清理内存
好像没那么简单吧……
我记得Windows优化大师的清理方式就是把内存里面的东西往虚拟内存里面丢……
MSDN上面找了个API函数SetProcessWorkingSetSize,不知道有没有用
The SetProcessWorkingSetSize function sets the minimum and maximum working set sizes for the specified process.

The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault. The size of the working set of a process is specified in bytes. The minimum and maximum working set sizes affect the virtual memory paging behavior of a process.

BOOL SetProcessWorkingSetSize(
HANDLE hProcess,                // handle to process
SIZE_T dwMinimumWorkingSetSize,  // minimum working set size
SIZE_T dwMaximumWorkingSetSize  // maximum working set size
);
If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value -1, the function temporarily trims the working set of the specified process to zero. This essentially swaps the process out of physical RAM memory
高考完了才发现写代码比做题更累……
2008-8-12 23:31:08
  • 小岐
  • 等级: 普通用户
  • 发贴: 32 贴
  • 货币: 0 金币
  • 积分: 255 分
  • 经验: 196 点
  • 体力: 1905 点
  • 注册: 2008-06-11
Re:[求助]如何编程清理内存
可以用一个批处理来实现吧,我记得有过这么一个批处理。只要将命令写上效果还是有的
2008-8-13 10:55:25
  • ColdZenLeft
  • 等级: 黑客防线技术团队
  • 发贴: 158 贴
  • 货币: 0 金币
  • 积分: 1586 分
  • 经验: 1355 点
  • 体力: 12725 点
  • 注册: 2007-12-11
Re:[求助]如何编程清理内存
试试再说,我的机子被人占了。我又占了另一个同学的,他这边本来就有点诡异

1、编程扫描内核模块只有两个SSDT钩子,其实绝不可能,我甚至怀疑是我的偏移取错了,结果用IS看居然都是一样的错,除非专门用SSDT功能来扫
2、他这里稳定性似乎不大好,连IS有时都挂
3、我以为完全没问题的驱动加卸在这里几乎行不通,搞得我那程序经常只能用一次,而后就驱动加载不了啊!

我按你们说的找点资料,不过我对他这儿实验不报多少把握。只是加个安心而已。谢谢了!
left has been left
2008-8-13 12:09:38
  • smjs
  • 等级: 普通用户
  • 发贴: 8 贴
  • 货币: 0 金币
  • 积分: 150 分
  • 经验: 128 点
  • 体力: 2370 点
  • 注册: 2008-04-13
Re:[求助]如何编程清理内存
内存整理其实没有多大用处
根据微软的工程师介绍,内存整理其实没有非常大的用处。
运行游戏什么的之后,虽然会有一些泄露的内存,
但是XP以后的系统可以根据程序对内存的请求自动对将要分配的内存进行整理
所以不需要整理内存
既是经过整理后,你也会发现,不久之后内存又会被其他程序弄乱
更具微软的检查,主动整理内存所耗用的时间是大于整理内存后所节省的时间的
SuoM-Blog,简单易用的个人博客系统
suomblog.cn
2008-8-14 11:58:46
  • ColdZenLeft
  • 等级: 黑客防线技术团队
  • 发贴: 158 贴
  • 货币: 0 金币
  • 积分: 1586 分
  • 经验: 1355 点
  • 体力: 12725 点
  • 注册: 2007-12-11
Re:[求助]如何编程清理内存
有点这样的感觉。。。

换句话说,在我们同学这台另类机子上,连冰刃有时也会扯拐,我也没什么更高奢望了

加了点free之类和一些不大懂的代码,反正图个吉利了
left has been left
2008-8-14 12:06:57
  • xfill
  • 等级: 黑客防线技术团队
  • 发贴: 150 贴
  • 货币: 0 金币
  • 积分: 1737 分
  • 经验: 1795 点
  • 体力: 9775 点
  • 注册: 2008-06-08
Re:[求助]如何编程清理内存
简单写了一个小代码,等他暂停下来你用任务管理器看内存使用量。

#include <stdio.h>
#include <windows.h>

void main()
{
        HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, 1024*1024*1024);
        LPBYTE pData = (LPBYTE)GlobalLock(hGlobal);
        memset(pData,(char)0xff,1024*1024*1024);
        system("pause");
        GlobalUnlock(hGlobal);
        GlobalFree(hGlobal);
}

高亮那一句必须的,因为WINDOWS的内存分页机制,相同的一块物理内存是可以被分给多个线程使用的。你可以走单步看看就知道了。



本贴已被 作者2008-8-14 14:33:35 编辑过
今宵酒醒何处,杨柳岸晓风残月。 - 《雨霖霖》 &  晓风组 X.F.S.T
2008-8-14 14:26:33
  • xfill
  • 等级: 黑客防线技术团队
  • 发贴: 150 贴
  • 货币: 0 金币
  • 积分: 1737 分
  • 经验: 1795 点
  • 体力: 9775 点
  • 注册: 2008-06-08
Re:[求助]如何编程清理内存
然后你再看看Windows优化大师的那个内存整理,运行时候的内存使用情况,就明白了。
本贴已被 作者2008-8-14 14:27:36 编辑过
今宵酒醒何处,杨柳岸晓风残月。 - 《雨霖霖》 &  晓风组 X.F.S.T
2008-8-14 14:27:13
  • VIP技术支持2
  • 等级: 黑客防线技术团队
  • 勋章:
  • 发贴: 1899 贴
  • 货币: 34 金币
  • 积分: 6821 分
  • 经验: 29086 点
  • 体力: 112770 点
  • 注册: 2007-05-25
Re:[求助]如何编程清理内存
夜枫说的这个我不认同啊。。

HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, 1024*1024*1024);
   你这句代码申请是在进程默认堆中申请一个固定的内存块. 这个时候你申请的是一个固定的内存块,此时这片区域如果被处于提交状态,那么对应的物理内存区域这部分就处于占用状态,那么必定影响物理内存啊。。

LPBYTE pData = (LPBYTE)GlobalLock(hGlobal);
固定的内存块就不需要锁定了,因为它的线性地址是不变的。。 如果是移动的内存块需要用这句函数将其锁定。。

memset(pData,(char)0xff,1024*1024*1024);
初始化申请的内存块.这时候你申请的那段内存区域处于提交状态。  

system("pause");  此时cpu调度程序将时间片分配给其他线程,并由于页表中此时你申请的那段空间处于提交状态,所以显示造成大量的内存使用。

GlobalUnlock(hGlobal);
GlobalFree(hGlobal);

解锁释放。。

无意义的程序啊,并且还浪费一些的效率。 呵呵 。。

我觉大部分内存整理应该是将一些非占用cpu时间片的程序所使用的内存区域设置为自由状态,这样它就不会占用物理内存,而是翻到页文件中。等待需要访问的时候,随即在映射到物理内存中,这样就解决了清理内存的功能。
.....................................
2008-8-14 15:11:10