如何获取 程序加载后的内存起始地址

Public Function GetProcessPath(ByVal dwProcessId As Long) As String 
    Dim ntStatus As Long 
    Dim objBasic As PROCESS_BASIC_INFORMATION 
    Dim objFlink As Long 
    Dim objPEB As Long, objLdr As Long 
    Dim objBaseAddress As Long 
    Dim bytName(260 * 2 - 1) As Byte 
    Dim strModuleName As String, objName As Long 
    Dim objCid As CLIENT_ID 
    Dim objOa As OBJECT_ATTRIBUTES 
    Dim i As Integer 
    Dim hProcess As Long 
    objOa.Length = Len(objOa) 
    objCid.UniqueProcess = dwProcessId 
    ntStatus = NtOpenProcess(hProcess, PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, objOa, objCid) 
    If hProcess = 0 Then 
        hProcess = GetHandleByProcessId(dwProcessId) 
        If hProcess = 0 Then 
            GetProcessPath = "" 
            Exit Function 
        End If 
    End If 
    Dim lngRet As Long, lngReturn As Long 
    ntStatus = NtQueryInformationProcess(hProcess, ProcessBasicInformation, VarPtr(objBasic), Len(objBasic), ByVal 0&) 
    If (NT_SUCCESS(ntStatus)) Then 
        objPEB = objBasic.PebBaseAddress 
        lngRet = ReadProcessMemory(hProcess, ByVal objPEB + &HC, objLdr, 4, ByVal 0&) 
        lngRet = ReadProcessMemory(hProcess, ByVal objLdr + &HC, objFlink, 4, ByVal 0&) 
        lngRet = ReadProcessMemory(hProcess, ByVal objFlink + &H18, objBaseAddress, 4, ByVal 0&) 
        If objBaseAddress > 0 Then 
            lngRet = ReadProcessMemory(hProcess, ByVal objFlink + &H28, objName, 4, ByVal 0&) 
            lngRet = ReadProcessMemory(hProcess, ByVal objName, bytName(0), 260 * 2, ByVal 0&) 
            If ERROR_PARTIAL_COPY = lngRet Then 
Start: 
                i = i + 1 
                If ERROR_PARTIAL_COPY = ReadProcessMemory(hProcess, ByVal objName, bytName(0), 260 * 2 - i, ByVal 0&) Then 
                    GoTo Start 
                End If 
            End If 
            strModuleName = bytName 
            strModuleName = Left(strModuleName & Chr(0), InStr(strModuleName & Chr(0), Chr(0)) - 1) 
            GetProcessPath = strModuleName 
        End If 
    End If 
    NtClose hProcess 
End Function

看这里objBaseAddress 这个就是你要的东西

时间: 2024-11-02 01:55:33

如何获取 程序加载后的内存起始地址的相关文章

cocos2dx中加载图片资源的方法,和从内存中获取已经加载的图片资源的方法

游戏中通常需要将常用的资源如:声音,图片,plist文件,提前加载进内存,以加快游戏的流畅度 1.预加载声音: SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3"); 加载之后就可以直接播放:SimpleAudioEngine::getInstance()->playBackgroundMusic("boom.mp3"); 2.预加载图片资源: 图片资源的加载分为同步加载

springboot 容器加载后自动监听 获取access_token

问题来源: 因为在项目中需要获取微信的access_token ,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 所以需要一个线程,来定时获取和更新access_token 一 新建 TokenThread 线程 package com.hm

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

图片--Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调用Windows API的,那么今天我们就调用windowsAPI来写一个窗口程序 如果你有windows开发知识,那么就很理解了,如果没有,那么跟着我写,跟着步骤去写,那么也可以写出来 首先我们要编写一个窗口程序(使用SDKAPI编写)有几个步骤 1.设计窗口类 2.注

BitmapFactory 加载图片到内存

Bitmap所占用内存 Android的虚拟机是基于寄存器的Dalvik,它的最大堆(单个进程可用内存)大小一般是16M,当然不同设备是不一样的,可以查看/system/build.prop文件,[注:现在的机子可能一般都有160M左右].程序本身运行就占有一定的内存,在使用较大的bitmap时,由于Bitmap自身的特性(将每个像素的属性全部保存在内存中),导致稍有不慎就会创建出一个占用内存非常大的Bitmap对象,从而导致加载过慢,还会有内存溢出的风险.所以,加载Bitmap时对其进行优化是

WPF循环加载图片导致内存溢出的解决办法

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆. 2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStr

小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序加载事件)

在了解了PhoneGap中都有哪些事件之后,本节将开始对这些事件的用法进行详细地介绍.本节要介绍的是程序加载事件,也就是deviceready.pause和resume这3个事件. [范例4-2 程序加载事件的使用] 01 <!DOCTYPE html> 02 <html> 03 <head> 04 <meta charset="utf-8"> 05 <title>程序加载事件的使用</title> 06 <

[WPF自定义控件库] 让Form在加载后自动获得焦点

1. 需求 加载后让第一个输入框或者焦点是个很基本的功能,典型的如"登录"对话框.一般来说"登录"对话框加载后"用户名"应该马上获得焦点,用户只需输入用户名,点击Tab,再输入密码,点击回车就完成了登录操作. 在WPF中要让一个控件在加载时获得焦点应该很简单,只需要在Loaded事件后调用Focus()就行了.但有时表单是动态添加的,或者第一个表单元素会根据某些条件显示或隐藏,这时很难简单地让第一个控件获得焦点. 为了实现这个功能我创建了一个叫F