c++代码sub_1004DA10(&closehandle_1011d8d8,hproc)是visual c++2010为什么不能显示结果意思?

深入浅出Win32多线程程序设计之基本概念

09:48作者:宋宝华出处:天极开发责任编辑:方舟

  从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。

  理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。

  因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。

  先阐述一下进程和线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。

  进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

  线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

  线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

  根据进程与线程的设置,操作系统大致分为如下类型:

  (1)单进程、单线程,MS-DOS大致是这种操作系统;

  (2)多进程、单线程,多数UNIX(及类UNIX的LINUX)是这种操作系统;

  4.多线程网络通信

  在网络通信中使用多线程主要有两种途径,即主监控线程和线程池。

  这种方式指的是程序中使用一个主线程监控某特定端口,一旦在这个端口上发生连接请求,则主监控线程动态使用CreateThread派生出新的子线程处理该请求。主线程在派生子线程后不再对子线程加以控制和调度,而由子线程独自和客户方发生连接并处理异常。

  使用这种方法的优点是:

  (1)可以较快地实现原型设计,尤其在用户数目较少、连接保持时间较长时有表现较好;

  (2)主线程不与子线程发生通信,在一定程度上减少了系统资源的消耗。

  (1)生成和终止子线程的开销比较大;

  (2)对远端用户的控制较弱。

  这种多线程方式总的特点是"动态生成,静态调度"。

  这种方式指的是主线程在初始化时静态地生成一定数量的悬挂子线程,放置于线程池中。随后,主线程将对这些悬挂子线程进行动态调度。一旦客户发出连接请求,主线程将从线程池中查找一个悬挂的子线程:

  (1)如果找到,主线程将该连接分配给这个被发现的子线程。子线程从主线程处接管该连接,并与用户通信。当连接结束时,该子线程将自动悬挂,并进人线程池等待再次被调度;

  (2)如果当前已没有可用的子线程,主线程将通告发起连接的客户。

  使用这种方法进行设计的优点是:

  (1)主线程可以更好地对派生的子线程进行控制和调度;

  (2)对远程用户的监控和管理能力较强。

  虽然主线程对子线程的调度要消耗一定的资源,但是与主监控线程方式中派生和终止线程所要耗费的资源相比,要少很多。因此,使用该种方法设计和实现的系统在客户端连接和终止变更频繁时有上佳表现。

  这种多线程方式总的特点是"静态生成,动态调度"。

}
由于admininstator 权限低于system,当c++程序以管理员方式是读取不到,注册表某些值 通常做法是,启动一个windwos服务,服务是有system权限的,方法有两个 1、此时在服务里面修改注册表OK。 函数功能具体是干嘛的还请转到MSDN查阅。我就说说最常用的参数。 第一个hToken,是跟用户相关的访问令牌。 相当于认证一样。 注意此方法还可以用来进程降权,比如打开explorer.exe 【一般是midem权限】将低权限token赋值给要创建的进程xx.exe ssToken令牌函数使用方法 要对一个随意进程(包括系统安全进程和服务进程)进行指定了写相关的訪问权的OpenProcess操作。仅仅要当前进程具有SeDeDebug权限就能够了。要是一个用户是Administrator或是被给予了相应的权限,就能够具有该权限。但是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)还是会遇到“訪问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些訪问权限是没有被使能(Enabled)的。所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要改动一个进程的訪问令牌。首先要获得进程訪问令牌的句柄,这能够通过OpenProcessToken得到,函数的原型例如以下: 第一參数是要改动訪问权限的进程句柄。第三个參数就是返回的訪问令牌指针;第二个參数指定你要进行的操作类型。如要改动令牌我们要指定第二个參数为TOKEN_ADJUST_PRIVILEGES(其他一些參数可參考PlatformSDK)。通过这个函数我们就能够得到当前进程的訪问令牌的句柄(指定函数的第一个參数为GetCurrentProcess()就能够了)。接着我们能够调用AdjustTokenPrivileges对这个訪问令牌进行改动。AdjustTokenPrivileges的原型例如以下: 第一个參数是訪问令牌的句柄。第二个參数决定是进行权限改动还是除能(Disable)全部权限;第三个參数指明要改动的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包括一个数组。数据组的每一个项指明了权限的类型和要进行的操作;第四个參数是结构PreviousState的长度。假设PreviousState为空,该參数应为NULL;第五个參数也是一个指向TOKEN_PRIVILEGES结构的指针,存放改动前的訪问权限的信息,可空。最后一个參数为实际PreviousState结构返回的大小。在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明例如以下:
}

我要回帖

更多关于 suburb 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信