Win32ASM-进程学习【1】

  关于一些进程的概念就不说了。。。

 

一创建进程GreateProcess

(1).当一个进程被创建时:

①.系统为进程创建一个内核对象,并将这个对象的计数设置为1,进程对象只是一个比较小的数据结构,可以通过进程句柄来引用

②.系统为进程创建一个虚拟地址空间,并将可执行文件装载到这个地址空间中,系统同时处理可执行文件的导入表,将导入表中所有dll文件装入.

每个dll被装入的时候,dll入口函数被执行,如果入口函数返回初始化失败信息的话 ,进程的初始化失败.

可执行文件的每个dll都被看作单独的模块,都被分配了一个实例句柄(实例句柄在数值上等于模块装入到地址空间中的线性地址)

③.系统为进程建立一个主线程,主线程将从可执行文件的的入口地址开始执行

④.对于进程来说,每一个进程对应一个进程句柄和一个进程ID

 

(2).和创建进程有关的一些结构

①STARTUPINFO

typedef struct _STARTUPINFO {
  DWORD cb;                                      ;结构的长度
  LPTSTR lpReserved;                           ;保留字段
  LPTSTR lpDesktop;                            ;NT下使用,指定桌面名称
  LPTSTR lpTitle;                                  ;控制台使用指定控制台窗口标题
  DWORD dwX;                                   ;当新进程使用CW_USEDEFAULT参数创建
  DWORD dwY;                                   ;窗口的时候将使用这些位置和大小属性
  WORD dwXSize;                               
  ORD dwYSize;
  DWORD dwXCountChars;                 ;控制台程序使用,指定控制台窗口行数
  DWORD dwYCountChars;                 ;
  DWORD dwFillAttribute;                   ;控制台程序使用,指定控制台窗口背景色
  DWORD dwFlags;                             ;标志
  WORD wShowWindow;                    ;窗口的显示方式
  WORD cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;                        ;控制台程序使用:几个标准句柄
  ANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFO,
 *LPSTARTUPINFO;

在需要指定新进程的窗口时,才需要手动填写STARTUPINFO结构(比如需要控制台程序的输入输出重定位时候,可以改写hStdInput和hStdOutput字段)

在大多数情况下,并不需要新进程的窗口有什么特殊之处,这时只需要使用GetStartupInfo获取当前进程的STARTUPINFO结构并使用他就可以了

invoke GetStartupInfo,addr stStartupInfo

 

②.PROCESS_INFOMATION

typedef struct _PROCESS_INFORMATION
 { 
HANDLE hProcess; 
HANDLE hThread; 
DWORD dwProcessId;
DWORD dwThreadId;    主线程句柄
PROCESS_INFORMATION, 
*LPPROCESS_INFORMATION;

 

(3).CreateProcess

BOOL WINAPI CreateProcess(
  __in_opt        LPCTSTR  lpApplicationName,
  __inout_opt  LPTSTR  lpCommandLine,
  __in_opt        LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt        LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in                BOOL bInheritHandles,
  __in                DWORD dwCreationFlags,
  __in_opt       LPVOID lpEnvironment,
  __in_opt        LPCTSTR lpCurrentDirectory,
  __in                LPSTARTUPINFO lpStartupInfo,
  __out             LPPROCESS_INFORMATION lpProcessInformation
);

①lpApplicationName

指向一个以0结尾的字符串,指明可执行文件名,如果这个参数为NULL,那么文件名可以在老婆CommandLine参数指定的命令行参数中包含

②lpCommandLine

用来指定命令行参数,如果 lpApplicationName为NULL,那么命令行参数的第一个组成部分用来指定可执行文件名;

如果2个参数都为空,那么lpApplicationName为文件名,lpCommandLine作为命令行参数

③lpProcessAtrributes

指向一个SECURITY_ATTRIBUTES结构,用来指定新进程的安全属性,如果进程句柄不需要被其他子进程继承,可以在这里使用NULL

④lpThreadAtrributes

指向一个SECURITY_ATTRIBUTES结构,用来指定新进程的安全属性,如果进程句柄不需要被其他线程继承,可以在这里使用NULL

⑤bInheritHandles

指定当前进程句柄是否可以被新进程继承,如果指定为TRUE,那么可以继承,一般在这里使用FALSE

⑥dwCreationFlags

创建标志,指定新进程的优先级以及其他标志,这个参数类似于CreateThread函数中的同名参数它可以是一些标志的组合,下面列举一些常用的标志

CREATE_NEW_CONSOLE 如果新进程是控制台程序,那么为他新建一个控制台窗口,而不是使用父进程的窗口

CREATE_SUSPENED  新建进程的主线程一开始处于挂起状态需要以后用ResumeThread函数来恢复它的执行

DEBUG_PROCESS                       ;调试有关

DEBUG_ONLY_THIS_PROCESS

HIGH_PRIORITY_CLASS               ;指定新进程的优先级

NORMAL_PRIORITY_CLASS

REALTIME_PRIORIY_CLASS

⑦lpEnvironment

指向新进程的环境变量块,如果这个参数指定为NULL,表示让Windows拷贝当前进程的环境块当做子进程的环境块,如果程序需要将修改过的环境块传给子进程,可以设置这个参数

⑧lpCurrentDirectory

指向一个字符路径,用来指定子进程的当前驱动器和当前目录,如果指定为NULL,子进程将引用父进程的当前路径

⑨后面2个参数分别指向前面介绍的2个结构体

---------------------------------------------------------------------------------------------------------------------------------------------------

二.结束进程

(1)ExitProcess  dwExitCode

ExitProcess只能用来结束当前进程,不能用来结束其他进程,包括当前进程创建的子进程

 

(2)TerminateProcess hProcess,dwExitCode

这个函数不推荐使用,一般仅在很极端的条件下使用,(如任务管理器用来结束响应的进程)

因为目标进程无条件结束,没有机会进行扫尾工作,同时目标进程使用的dll文件也不会收到结束通知,所以极有可能 造成数据丢失

 

当前进程被结束时,系统将做如下工作

①进程创建或打开的所有对象句柄被关闭

②进程的所有线程被终止

③进程和进程中所有的线程状态被改为置位状态,以便让WaitForSingleObject函数正常的检测

④进程对象中的退出码字段从STILL_ACTIVE被改为指定的退出码

 

(3)要检测一个进程的退出码可以使用

GetExitCodeProcess hProcess,lpExitCode

如果函数执行成功返回退出码到lpExitCode

如果失败返回STILL_ACTIVE到lpExitCode

通过检测一个子进程的退出码是否为STILL_ACTIVE,就可以得知子进程是否已经结束,但如果需要在父进程中等待子进程结束时,就没有必要不停的检测退出码

可以使用WaitForSingleObject hProcess,dwMilliseconds

dwMilliseconds指定为INFINITE就可以了,表示子进程结束前函数不会返回

 

当一个进程被结束时,并不影响它所创建的子进程,进程对象也不会马上从内存中删除,因为可能其他进程还需要通过进程句柄检测进程状态,直到使用CloseHandle函数将进程句柄关闭以后,

进程对象才是真正的被删除了,所以当不在使用进程句柄的时候,不要忘记关闭PROCESS_INFORMATION中的进程句柄 和主线程句柄

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Object-C,NSArraySortTest,数组排序3种方式

晚上回来,继续写Object-C的例子,今天不打算写iOS可视化界面的程序,太累了。刚刚dady又电话过来,老一套,烦死了。其实,我一直一个观点,无论发生什么事情,不要整天一副不开心的样子。开…

android中listview的一些样式设置

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:background"drawable/bg"&…

Win32ASM-进程学习【2】

获取运行中的句柄 1.从窗口句柄中获取进程句柄 要对进程进行某种操作,就必须首先知道该进程的句柄或者进程ID 对于自己创建的子进程来说CreateProcess函数返回了子进程句柄和进程的ID 但是如果如果要对系统中运行的某个进程进行操作,那么首先获取他们的句柄才行 如果知道某个…

完美解决IE8有两个进程的问题

完美解决IE8有两个进程的问题,照以下方法设置后就只有一个进程了,没有什么负影响哦! 方法: 1、winR,在运行框里输入:gpedit.msc,回车进入组策略设置。 2、依次展开:计算机配置——管…

【转】gvim配置及相关插件安装

0.准备软件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Win32ASM-进程学习[3]-读写进程空间

invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesReadinvoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesWritten hProcess 指定将要被读写的目标进程句柄 lpBaseAddress 目标进程中被读写的起始线性地址. …

MongoDB使用记录

安装服务 使用以下命令将MongoDB安装成为Windows服务。笔者的MongoDB目录为D:\Program Files\mongodb mongod --logpath "D:\Program Files\mongodb\data\logs.txt" --logappend --dbpath "D:\Program Files\mongodb\data" --directoryperdb --serviceName…

OC基础知识

Object C 语言基础 第一节总括 这一节是对Objective-C(以后简称OC)的简要介绍,目的是使读者对OC有一个概括的认识。 1.面象的读者 在阅读本文之前,应具备使用与C类似的编程语言(如C,C,JAVA)的一些经验,同时熟悉面向对象编程。 2.OC简介 OC是以SmallTalk为基础,建立…

Windows使用筛选器来处理异常

很久木有管博客了 最近也没有学什么 Dos系统下发生异常后,系统会调用int 24h服务例程,然后根据中断的返回值决定下一步要做什么,他会在屏幕上显示ignore Retry Fail Abort 让用户选择进而进行下一步操作 这样的话 只要应用程序截取int 24h中断,就可以随意的"胡作非…

Android 高级编程 RecyclerView 控件的使用

RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好。 看一下继承关系: ava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.support.v7.widget.RecyclerViewKnown Direct …

Android下点亮LED

http://blog.csdn.net/cpj_phone/article/details/43562551转载于:https://www.cnblogs.com/Ph-one/p/4276974.html

SEH处理异常

Win32为每个线程定义了一个线程信息块,其中保存了线程的一些属性数据,线程信息块的属性被定义为NT_TIB结构 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberDa…

Asp.net MVC 4新项目中创建area的后续操作

Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况。 无废话具体步骤: 1. 检查早Global.asax和\App_Start\RouteConfig.cs中是否已经自动添加了Are…

55-混沌操作法之我见:一、逆势操作.(2015.2.7)

混沌操作法之我见:一、逆势操作 首先谈谈,均线以及鳄鱼线。单独的市场价格表达了t时刻价格的个体情况,均线表达了一段时间内价格的综合情况。t时刻的价格与均线的比较,表达了考虑了过去以及当前综合价格的比较情况,即t…

SEH链和展开操作

每次我们定义了一个新的SEH异常处理回调函数,EXCEPTION_REGISTRATION结构的prev字段都被要求填写上一个EXCEPTION_REGISTRATION结构的地址,随着应用程序对模块的调用一层层深入下去的时候,那么最后回调函数会形成一个SEH链 当程序中有多个线程在运行的时候,每个线程中都会存在各…

spring的基本知识

首先是回顾一下spring的基本知识 1、controller 控制器(注入服务) 2、service 服务(注入dao) 3、repository dao(实现dao访问) 4、component (把普通pojo实例化到spring容器中,相当于…

vs2010 EF4.0 访问mysql

需要安装mysql-connector-net-6.3.5 6.8.9的安装完后在dbfirst里找不到对应的提供程序 链接字符串里需要 指定下编码(如果不是gbk的话) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 变长参数的理解

C语言里面 提供了一些宏 可以使用变长参数 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判断一个div的边界是否超出另外一个div的边界

摘要&#xff1a;本文简单介绍jquery判断一个div的边界是否超出另外一个div的边界&#xff0c;如果超出边界做出相应的处理。 1、实现效果 判断前 判断后 2、实现思路 实现类似的判断&#xff0c;主要是获取两个div在浏览器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式数据

//数据定义&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一条json数据&#xff1a;令str为[{"name":"21001","password":"21001"}] User usernew User()…