您的位置:程序门 -> vb ->



.net 下 virtualprotectex 声明 应该是啥样?偶这个声明遇到了很有趣的问题!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


.net 下 virtualprotectex 声明 应该是啥样?偶这个声明遇到了很有趣的问题![已结贴,结贴人:zcsor]
发表于:2007-06-12 22:41:28 楼主
情况如下:
我把声明改成如下形式:
        private   declare   function   virtualprotectex   lib   "kernel32 "   (byval   hprocess   as   integer,   byval   lpaddress   as   integer,   byval   dwsize   as   integer,   byval   flnewprotect   as   integer,   byref   lpfloldprotect   as   integer)   as   integer

进行如下调用
                if   virtualprotectex(hprocess,   addr,   len,   4,   loldprotect)   <>   0   then
                        '某些操作
                else
                        msgbox(getlasterror)
                end   if
这里的hprocess是正确的,openprocess(&h1f0fff,   true,   m_pid)获取,我的程序本身具有进程操作的全部权限,addr是一个内存块的开始地址,len是该内存块大小(字节),4是page_readwrite常数,loldprotect初始化为0
当调用上面过程的时候,出现很有意思的一个问题,当内存块本身属性已经是page_readwrite时,函数返回0,即调用成功,当内存块本身属性为其他值时,getlasterror返回值为87(错误参数),搞不定了。

大家来帮忙啊~~~~55555555555
另外前几天发布那个修改器,竟然有10几处致命的错误,我的娘来,我严重道歉。。。。。。。真恼了。。。还在进一步修复当中。。。。。
发表于:2007-06-12 22:57:441楼 得分:5
..............................................
发表于:2007-06-13 00:41:072楼 得分:5
private   declare   function   virtualprotectex   lib   "kernel32 "   (byval   hprocess   as   integer,   byref   lpaddress   as   integer,   byval   dwsize   as   integer,   byval   flnewprotect   as   integer,   byval   lpfloldprotect   as   integer)   as   integer
发表于:2007-06-13 14:27:543楼 得分:40
bool   virtualprotectex(
    handle   hprocess,
    lpvoid   lpaddress,
    size_t   dwsize,
    dword   flnewprotect,
    pdword   lpfloldprotect
);

这是c++的原型,先mark,等会我看看
发表于:2007-06-13 16:25:134楼 得分:0
http://topic.csdn.net/t/20040620/20/3108208.html
发表于:2007-06-13 16:28:525楼 得分:0
貌似所有参数都应该byval
lpvoid   是   void*
发表于:2007-06-13 17:39:006楼 得分:0
所有都是byval不可以。。。
陈辉给的我好像也用过了。。。。我再测试一下。。
发表于:2007-06-13 17:44:297楼 得分:0
陈辉的声明返回的错误是
〖998〗-内存分配访问无效。  

看来还真不好办了。。。。。
发表于:2007-06-13 19:13:018楼 得分:0
很简单的啊??怎么搞得那么复杂
加我qq   285305530   回答是   陈辉(chenhui)   把代码传给我,我给你看下。
发表于:2007-06-13 22:43:469楼 得分:0
我把类帖到这里(提升权限的我blog上写了,帖子上太长不让帖啊)
调用方法如下:windowtitle为窗口标题
                dim   m   as   new   getprocessmemoryinfo
                m.showmemoryinfo(windowtitle,   true)
类内容:
public   class   getprocessmemoryinfo   :   inherits   form
        private   structure   memory_basic_information
                dim   baseaddress   as   integer                
                dim   allocationbase   as   integer          
                dim   allocationprotect   as   integer    
                dim   regionsize   as   integer                  
                dim   state   as   integer                            
                dim   protect   as   integer                        
                dim   ltype   as   integer                            
        end   structure

        private   declare   function   openprocess   lib   "kernel32 "   (byval   access   as   int32,   byval   inherithandle   as   boolean,   byval   processid   as   int32)   as   int32
        private   declare   function   closehandle   lib   "kernel32 "   (byval   handle   as   int32)   as   boolean
        private   declare   function   virtualqueryex   lib   "kernel32 "   (byval   hprocess   as   int32,   byval   lpaddress   as   intptr,   byref   lpbuffer   as   memory_basic_information,   byval   dwlength   as   int32)   as   int32
        private   declare   function   virtualprotectex   lib   "kernel32 "   (byval   hprocess   as   integer,   byref   lpaddress   as   integer,   byval   dwsize   as   integer,   byval   flnewprotect   as   integer,   byval   lpfloldprotect   as   integer)   as   integer
        private   declare   function   getlasterror   lib   "kernel32 "   alias   "getlasterror "   ()   as   integer
        private   m_pid   as   integer
        friend   withevents   listview1   as   system.windows.forms.listview
        friend   withevents   columnheader1   as   system.windows.forms.columnheader
        friend   withevents   columnheader2   as   system.windows.forms.columnheader
        friend   withevents   columnheader3   as   system.windows.forms.columnheader
        friend   withevents   button1   as   system.windows.forms.button
        friend   withevents   columnheader4   as   system.windows.forms.columnheader
        friend   withevents   columnheader5   as   system.windows.forms.columnheader
        friend   withevents   button2   as   system.windows.forms.button
        friend   withevents   columnheader6   as   system.windows.forms.columnheader
        public   sub   new()
                mybase.new()
                initializecomponent()
        end   sub
        public   sub   showmemoryinfo(byval   windowtitle   as   string,   byval   frmshow   as   boolean)
                getopenprocesspid(windowtitle)
                getmemoryinfo()
                if   frmshow   then   me.show()
        end   sub
        private   sub   getopenprocesspid(byval   windowtitle   as   string)
                dim   pros()   as   process   =   process.getprocesses(),   pro   as   process
                for   each   pro   in   pros
                        if   pro.mainwindowtitle   =   windowtitle   then
                                m_pid   =   pro.id
                        end   if
                next
        end   sub

        private   function   getmemoryinfo()   as   long
                dim   hprocess   as   integer,   paddr   as   integer,   dwtotalcommit   as   long,   ret   as   integer,   milen   as   integer
                dim   mi   as   new   memory_basic_information
                listview1.items.clear()
                milen   =   len(mi)
                dwtotalcommit   =   0   '这是结果
                paddr   =   0     '这个时查询起始地址,设为0,即进程虚拟地址开始处。
                hprocess   =   openprocess(&h1f0fff,   0,   m_pid)   '首先打开进程供查询信息
                ret   =   virtualqueryex(hprocess,   paddr,   mi,   milen)   '从起始地址开始查询
                dim   mtmpstr   as   string   '格式化为8位后输出基地址
                mtmpstr   =   "00000000 "   &   hex(mi.baseaddress)
                mtmpstr   =   mtmpstr.substring(mtmpstr.length   -   8,   8)
                listview1.items.add(mtmpstr)
                listview1.items(listview1.items.count   -   1).subitems.add(mi.allocationprotect)
                listview1.items(listview1.items.count   -   1).subitems.add(mi.state)
                listview1.items(listview1.items.count   -   1).subitems.add(mi.protect)
                listview1.items(listview1.items.count   -   1).subitems.add(mi.ltype)
                listview1.items(listview1.items.count   -   1).subitems.add(hex(mi.regionsize))
                do   while   (ret   =   milen)
                        dwtotalcommit   =   dwtotalcommit   +   mi.regionsize
                        paddr   =   mi.baseaddress   +   mi.regionsize   '跳过已经查询过的内存块,到未被查询的内存地址起始处
                        ret   =   virtualqueryex(hprocess,   paddr,   mi,   milen)   '再次查询,直到查询失败(所有可查询地址都已经查过了)
                        mtmpstr   =   "00000000 "   &   hex(mi.baseaddress)
                        mtmpstr   =   mtmpstr.substring(mtmpstr.length   -   8,   8)
                        listview1.items.add(mtmpstr)
                        listview1.items(listview1.items.count   -   1).subitems.add(mi.allocationprotect)
                        listview1.items(listview1.items.count   -   1).subitems.add(mi.state)
                        listview1.items(listview1.items.count   -   1).subitems.add(mi.protect)
                        listview1.items(listview1.items.count   -   1).subitems.add(mi.ltype)
                        listview1.items(listview1.items.count   -   1).subitems.add(hex(mi.regionsize))
                loop
                closehandle(hprocess)
                return   dwtotalcommit
        end   function
发表于:2007-06-13 22:44:0210楼 得分:0
'接上
        private   sub   initializecomponent()
                me.listview1   =   new   system.windows.forms.listview
                me.columnheader1   =   new   system.windows.forms.columnheader
                me.columnheader2   =   new   system.windows.forms.columnheader
                me.columnheader3   =   new   system.windows.forms.columnheader
                me.columnheader4   =   new   system.windows.forms.columnheader
                me.columnheader5   =   new   system.windows.forms.columnheader
                me.columnheader6   =   new   system.windows.forms.columnheader
                me.button1   =   new   system.windows.forms.button
                me.button2   =   new   system.windows.forms.button
                me.suspendlayout()
                '
                'listview1
                '
                me.listview1.anchor   =   ctype((((system.windows.forms.anchorstyles.top   or   system.windows.forms.anchorstyles.bottom)   _
                                        or   system.windows.forms.anchorstyles.left)   _
                                        or   system.windows.forms.anchorstyles.right),   system.windows.forms.anchorstyles)
                me.listview1.autoarrange   =   false
                me.listview1.checkboxes   =   true
                me.listview1.columns.addrange(new   system.windows.forms.columnheader()   {me.columnheader1,   me.columnheader2,   me.columnheader3,   me.columnheader4,   me.columnheader5,   me.columnheader6})
                me.listview1.fullrowselect   =   true
                me.listview1.location   =   new   system.drawing.point(12,   12)
                me.listview1.multiselect   =   false
                me.listview1.name   =   "listview1 "
                me.listview1.showitemtooltips   =   true
                me.listview1.size   =   new   system.drawing.size(714,   298)
                me.listview1.tabindex   =   18
                me.listview1.usecompatiblestateimagebehavior   =   false
                me.listview1.view   =   system.windows.forms.view.details
                '
                'columnheader1
                '
                me.columnheader1.text   =   "address "
                me.columnheader1.width   =   80
                '
                'columnheader2
                '
                me.columnheader2.text   =   "allocation   protest "
                me.columnheader2.width   =   160
                '
                'columnheader3
                '
                me.columnheader3.text   =   "state "
                me.columnheader3.width   =   80
                '
                'columnheader4
                '
                me.columnheader4.text   =   "protest "
                me.columnheader4.width   =   160
                '
                'columnheader5
                '
                me.columnheader5.text   =   "type "
                me.columnheader5.width   =   80
                '
                'columnheader6
                '
                me.columnheader6.text   =   "size(byte) "
                me.columnheader6.textalign   =   system.windows.forms.horizontalalignment.right
                me.columnheader6.width   =   110
                '
                'button1
                '
                me.button1.anchor   =   ctype((system.windows.forms.anchorstyles.bottom   or   system.windows.forms.anchorstyles.right),   system.windows.forms.anchorstyles)
                me.button1.location   =   new   system.drawing.point(413,   330)
                me.button1.name   =   "button1 "
                me.button1.size   =   new   system.drawing.size(139,   23)
                me.button1.tabindex   =   19
                me.button1.text   =   "关闭 "
                me.button1.usevisualstylebackcolor   =   true
                '
                'button2
                '
                me.button2.anchor   =   ctype((system.windows.forms.anchorstyles.bottom   or   system.windows.forms.anchorstyles.left),   system.windows.forms.anchorstyles)
                me.button2.location   =   new   system.drawing.point(184,   330)
                me.button2.name   =   "button2 "
                me.button2.size   =   new   system.drawing.size(130,   23)
                me.button2.tabindex   =   20
                me.button2.text   =   "设为可读写 "
                me.button2.usevisualstylebackcolor   =   true
                '
                'getprocessmemoryinfo
                '
                me.clientsize   =   new   system.drawing.size(738,   365)
                me.controls.add(me.button2)
                me.controls.add(me.button1)
                me.controls.add(me.listview1)
                me.name   =   "getprocessmemoryinfo "
                me.text   =   "进程内存信息 "
                me.resumelayout(false)

        end   sub
        private   sub   button1_click(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   button1.click
                'if   me.visible   then   me.close()   else   me.hide()
                mybase.dispose()
                me.dispose()
                me.close()
        end   sub

        private   sub   button2_click(byval   sender   as   system.object,   byval   e   as   system.eventargs)   handles   button2.click
                try
                        dim   hprocess   as   integer   =   openprocess(&h1f0fff,   true,   m_pid)
                        dim   loldprotect   as   integer,   addr   as   integer,   len   as   integer
                        addr   =   "&h "   &   listview1.checkeditems(0).text
                        len   =   "&h "   &   listview1.checkeditems(0).subitems(5).text
                        debug.print(listview1.checkeditems(0).text   &   "   "   &   listview1.checkeditems(0).subitems(5).text)
                        if   virtualprotectex(hprocess,   addr,   len,   4,   loldprotect)   <>   0   then
                                getmemoryinfo()
                        else
                                msgbox(getlasterror)
                        end   if
                catch   ex   as   exception
                        if   err.number   =   5   then   msgbox( "请在列表选择一个内存块 ")
                end   try
        end   sub
end   class

发表于:2007-06-13 22:45:4011楼 得分:0
核心代码是以前一个帖子里问的,好像是豆豆回答的.....忘记了...写了之后就是这样的,仅仅更改了显示的方式.


发表于:2007-06-14 18:35:4512楼 得分:0
结贴了。原来我是猪。。。。。。。。。
发表于:2007-06-17 23:20:0513楼 得分:0
virtualdesktop(^_^)   哥们说的对,我说明一下,我的代码一点错误也没有,能够更改属性的只有private,image两种属性,其他不能直接更改。


快速检索

最新资讯
热门点击