<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Ackarlix的专栏 - 系统编程</title><link>http://blog.csdn.net/ackarlix/category/331131.aspx</link><description /><dc:language>zh-CN</dc:language><lastUpdateTime>Mon, 03 Sep 2007 06:44:46 GMT</lastUpdateTime><ttl>60</ttl><item><dc:creator>Ackarlix</dc:creator><title>Bootable CD-ROM Format</title><link>http://blog.csdn.net/ackarlix/archive/2007/09/01/1767900.aspx</link><pubDate>Sat, 01 Sep 2007 06:07:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/09/01/1767900.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1767900.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/09/01/1767900.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1767900.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1767900</trackback:ping><description>Ackarlix
 
 
Specification
Version 1.0
January 25, 1995
 
 
¨°¨°
Curtis E. Stevens Stan Merkin (Formerly of IBM, Currently with DELL) 
Phoenix Technologies IBM 
2575 McCabe Way 1000 NW 51st 
Irvine, Ca. 92714 BocaRaton, Fl. 33431 
Phone: (714) 440-8330 Phone: (407) 443-3264 
Fax: (714) 440-8300 Fax: (407) 982-8823 
curtis_stevens@bannet.ptltd.com 
 
THIS SPECIFICATION IS MADE AVAILABLE WITHOUT CHARGE FOR USE IN DEVELOPING COMPUTER 
SYSTEMS AND CD-ROM DRIVES. THE DEVELOPERS OF T&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1767900.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>论软件接口中几种底层通讯的实现</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766245.aspx</link><pubDate>Fri, 31 Aug 2007 05:54:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766245.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1766245.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766245.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1766245.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1766245</trackback:ping><description>整理：Ackarlix

一、 概述
　　软件接口是实现一个系统跟另外系统进行信息交互的桥梁，在不同的系统之间，根据系统的关联程度的不同存在紧耦合和松耦合两种：紧耦合要求接口响应反应快，消息不能阻塞；松耦合对响应反应要求比较低。本人主要讨论紧耦合接口通讯实现，在目前应用中，Socket、中间件、SOAP等都用相应的应用，但是应用中发现各通讯方式有自己固有的特征，"适合的才是最好的"，这是真理。
　　在接口和系统信息交互的过程中，两种模式使用得很普遍：同步调用和异步调用，同步调用要求接口发出请求消息后必须等待服务端系统的应答消息，接口阻塞直至超时；异步调用则发出请求消息后，接口可以从事其它处理，定时轮询服务端应答消息和消息或事件通知。同步方式简单，但是很容易造成接口阻塞，造成消息积压超时。

二、 技术实现

1、 Socket通讯
　　Socket通讯相对来说是很古老的通讯方式，也是最常用的通讯方式。Socket通讯有阻塞和非阻塞两种方式。在同步方式，采用阻塞编程比较简单，但是为了防止接口阻塞，我们需要设置Socket超时，因此可以使用Socket的SELECT模型（&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1766245.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>用多路复用I/O模型实现支持多个客户端的通信服务</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766244.aspx</link><pubDate>Fri, 31 Aug 2007 05:52:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766244.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1766244.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766244.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1766244.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1766244</trackback:ping><description>整理：Ackarlix引言　　多路复用I/O模型是UNIX/LINUX用得的最多的一种I/O模型。这种I/O模型在技术上的实现是包括select（）以及FD_XXX的几个宏及常量。在单个进程中支持的客户端数量由FD_SETSIZE决定。Solaris 10和Linux 9.0默认为1024个,Windows 2000是64个。本文用代码给出该I/O模型处理多Client的一种实现。用select开发一个通信服务器　　这个服务器包括接收模块、发送模块和套接口管理模块。我们只演示与select实现有关的部分，即接收模块和套接口管理模块。下面服务器类关系图： 　　tcp_listen是tcp实现监听功能，tcp_comm实现tcp的发送和接收，下在我们重点在于recv和sock_list这两个类。sock_list定义如下：class sock_list  {public:	// 功能:将一个值插入到list的尾部	// 参数:要插入的tcp_comm对象	void insert(tcp_comm* t);	//&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1766244.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>缓冲区溢出攻防</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766243.aspx</link><pubDate>Fri, 31 Aug 2007 05:51:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766243.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1766243.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766243.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1766243.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1766243</trackback:ping><description>整理：Ackarlix下载源代码    很久以来，在人们心目中，“黑客”和病毒作者的身上总是笼罩着一层神秘的光环，他们被各种媒体描述成技术高手甚至技术天才，以至于有些人为了证明自己的“天才”身份而走上歧途，甚至违法犯罪。记得不久前就看到过这样一个案例：一位计算机专业研究生入侵了一家商业网站并删除了所有数据。当他在狱中接受记者的采访时，他非常自豪地说这样做只是为了证明自己和获得那种成就感。     本文讨论的缓冲区溢出攻击实际上是一项非常“古老”的技术，但它的破坏力依然不可小视——相信大家都还没有忘记几个月之前的“冲击波”。文中的代码实例几乎就是一个真实的病毒了，其中的一些技术你可能没有见过，但我可以很负责任的说它没有使用任何高深的技术，我没有进ring0，没有写设备驱动，甚至连汇编代码也只用了非常简单的11句。我希望此文能让大家重新认识一下“黑客”和病毒作者，把他们从神坛上“拉”下来。我更要提醒大家把那位“研究生”作为前车之鉴，不要滥用这项技术，否则必将玩火自焚。下面就进入正题。什么是缓冲区溢出     你一定用strcpy拷贝过字符串吧？那，如果拷贝时目的&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1766243.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>使用 CInternetSession 封装多线程 http 文件下载</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766241.aspx</link><pubDate>Fri, 31 Aug 2007 05:50:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766241.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1766241.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/31/1766241.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1766241.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1766241</trackback:ping><description>整理：Ackarlix源代码下载　　如何下载一个http文件？我们当然可以用socket自己实现http协议去做，但费时费力还易出bug，对于一个客户端程序稳定易维护是第一位的，所幸MS给我们提供了功能强大的internet API函数族，MFC的CInternetSession对它们进行了一些简单的封装，但如此简单的封装对我等拿来主义者来说只是个半成品。必须经过再加工才能食用。先来介绍一下CInternetSession的使用：下面的代码是读取链接的基本方法： // CInternetSession在遇到一些错误时会抛出异常，因此必须包起来TRY{    CInternetSession   sess ;    // 统一以二进制方式下载    DWORD       dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;    CHttpFile   * pF = (CHttpFile*)sess.Op&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1766241.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>如何在NT下获取进程的路径</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764737.aspx</link><pubDate>Thu, 30 Aug 2007 06:29:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764737.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764737.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764737.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764737.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764737</trackback:ping><description>
整理：Ackarlix
下载示例源代码

一：获取NT下进程路径的方法
　　在Win9X系统中，利用ToolHelp API中的相关函数可以很方便得得到进程的名称及其路径。但这种方法在NT系统中就不能奏效了，szExeFile仅仅得到的是进程的名称，并没有包含进程的路径。
　　如何在NT下获取进程的路径呢？（由于WIN9X系统不在我们讨论的范围之内，所以我们选用PSAPI中的相关函数进行说明，这仅仅适用于NT系统。）其实也很简单——用OpenProcess()函数将进程打开后，再利用EnumProcessModules()函数枚举该进程的模块，最后利用GetModuleFileNameEx()函数就能取得该进程的路径了。
　　下面的这段程序将枚举NT系统中的进程，并将显示每个进程的路径。当然，这种方法对一些系统保护的进程而言或多或少会出现些问题，例如：smss.exe、winlogon.exe，csrss.exe等。如果谁有更好的方法请赐教，不胜感激。
二：具体实践
//////////////////////////////////////////////////&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764737.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>NT环境下进程隐藏的实现</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764736.aspx</link><pubDate>Thu, 30 Aug 2007 06:28:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764736.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764736.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764736.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764736.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764736</trackback:ping><description>整理：Ackarlix
下载源代码

　　在NT环境下隐藏进程，也就是说在用户不知情的条件下，执行自己的代码的方法有很多种，比如说使用注册表插入DLL，使用Windows挂钩等等。其中比较有代表性的是Jeffrey Richer在《Windows核心编程》中介绍的LoadLibrary方法和罗云彬在《windows环境下32位汇编语言程序设计》中介绍的方法。两种方法的共同特点是：都采用远程线程，让自己的代码作为宿主进程的线程在宿主进程的地址空间中执行，从而达到隐藏的目的。相比较而言，Richer的方法由于可以使用c/c++等高级语言完成，理解和实现都比较容易，但他让宿主进程使用LoadLibrary来装入新的DLL，所以难免留下蛛丝马迹，隐藏效果并不十分完美。罗云彬的方法在隐藏效果上绝对一流，不过，由于他使用的是汇编语言，实现起来比较难（起码我写不了汇编程序:)）。笔者下面介绍的方法可以说是对上述两种方法的综合：采用c/c++编码，实现完全隐藏。并且，笔者的方法极大的简化了远程线程代码的编写，使其编写难度与普通程序基本一致。


基础知识

　　让自己的代码作为宿主进程&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764736.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>如何在NT下获取进程的路径(增补)</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764735.aspx</link><pubDate>Thu, 30 Aug 2007 06:26:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764735.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764735.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764735.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764735.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764735</trackback:ping><description>整理：Ackarlix
下载源代码

一、程序说明

　　最近整理文档，发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决：原文中的程序无法获取系统进程的路径，如：csrss.exe。记得VCKBASE上有位网友说过一个方法：“给枚举的进程增加SE_DEBUG_NAME权限即可”，于是在网上找了些资料，解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友！

我自定义了一个函数，用来赋予进程指定的权限（本例为SE_DEBUG_NAME）： 
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
	
	TOKEN_PRIVILEGES tkp;
	
	LookupPrivilegeValue( NULL,szPrivName,&amp;tkp.Privileges[0].Luid );//修改进程权限
	tkp.PrivilegeCount=1;
	tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	AdjustTokenPr&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764735.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>如何“干净地”终止 Win32 中的应用程序</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764734.aspx</link><pubDate>Thu, 30 Aug 2007 06:25:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764734.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764734.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764734.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764734.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764734</trackback:ping><description>整理：Ackarlix
•  摘要 
•  32 位进程（和 Windows 95 下的 16 位进程） 
•  16 位问题（在 Windows NT 下） 
•  示例代码 
摘要

　　在理想环境中，某一进程可能会通过某种形式的进程间通信要求另一进程关闭。不过，如果你对希望其关闭的应用程序没有源代码级控制权，可能就没有办法做这样的选择。尽管没有哪种方法能保证“干净地”关闭 Win32 中的应用程序，但你可以采取一些步骤来确保应用程序使用最佳方法清除资源。   

32 位进程（和 Windows 95 下的 16 位进程）

　　在 Win32 下，操作系统可保证在进程关闭时清除进程所拥有的资源。但是，这并不意味着进程本身将有机会对磁盘执行任何最后的信息刷新或通过远程连接执行任何最后的通信，也不意味着进程的 DLL 将有机会执行其 PROCESS_DETACH 代码。这就是通常最好避免在 Windows 95 和 Windows NT 下终止应用程序的原因。 

如果你必须关闭进程，请按照下列步骤操作：
1.	向你打算关闭的进程所拥有的所有顶级窗口发送&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764734.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>通过异步程序调用(APC)实现的定时功能</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764733.aspx</link><pubDate>Thu, 30 Aug 2007 06:24:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764733.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764733.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764733.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764733.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764733</trackback:ping><description>整理：Ackarlix
　　定时器是一个在特定时间或者规则间隔被激发的内核对象。结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行。本文的例子代码显示了如何实现。
　　使用本定时器时，你需要把常量_WIN32_WINNT定义为0x0400，并且此常量应该在包之前定义，以确保声明合适的定时器原型函数。
　　通过调用CreateWaitableTimer()可以创建一个定时器，此函数返回一个指向内核对象的句柄。若定时器已经存在，你可以通过使用OpenWaitableTimer()获得一个进程相关的句柄。无论是通过CreateWaitableTimer() 还是通过OpenWaitableTimer()获得的句柄，在不需要定 时器时必须释放，方法是使用函数CloseHandle()。
　　定时的时间通过调用SetWaitableTimer()来设置，可以设置为一个特定的时刻（如December 16, 1999 at 9:45 PM）或者一个相对的时间（如从现在起每五分钟）。函数SetWaitableTime()定时的时间参数要求LARGE_INTEGER类型。这个&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764733.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>如何获取其它程序的命令行参数</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764732.aspx</link><pubDate>Thu, 30 Aug 2007 06:22:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764732.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1764732.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/30/1764732.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1764732.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1764732</trackback:ping><description>整理：Ackarlix
下载源代码

开发环境： VC6 Windows XP
测试环境： WindowsXP
我们都知道，在程序里获取命令行参数很简单，WinMain函数会以参数的形式传递给我们，或者可以调用API GetCommandLine 获取。但是GetCommandLine函数不接受参数，获取的只是自己程序的命令行参数。那么如果我们想获取别的应用程序的命令行参数应该怎么办呢？
有的同学说，既然GetCommandLine只能获取本程序的命令行参数，我们可以在其它进程里插入一个Dll，在那个进程的地址空间调用GetCommandLine函数，然后传回来就可以了。这样好像有点儿不太友好。让我们想想还有没有别的办法。
我们想，自己的命令行参数既然随时都可以获取到，那么在该进程里一定有一个地方存放它。那么在哪儿呢？看一下GetCommandLine函数的反汇编代码，我们发现，原来世界是如此的美好！

以下是WinXP系统的GetCommandLine函数反汇编代码：
.text:7C812C8D GetCommandLineA proc near
.text:&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1764732.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>回调函数详解</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763034.aspx</link><pubDate>Wed, 29 Aug 2007 06:19:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763034.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1763034.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763034.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1763034.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1763034</trackback:ping><description>作者：Ackarlix

一、回调函数
我们经常在C++设计时通过使用回调函数可以使有些应用（如定时器事件回调处理、用回调函数记录某操作进度等）变得非常方便和符合逻辑，那么它的内在机制如何呢，怎么定义呢?它和其它函数（比如钩子函数）有何不同呢？
使用回调函数实际上就是在调用某个函数（通常是API函数）时，将自己的一个函数（这个函数为回调函数）的地址作为参数传递给那个函数。
而 那个函数在需要的时候，利用传递的地址调用回调函数，这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数，跟具体使用的 API函数有关，一般在帮助中有说明回调函数的参数和返回值等。C++中一般要求在回调函数前加CALLBACK（相当于FAR PASCAL），这主要是说明该函数的调用方式。
至于钩子函数，只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数，不过这种叫法不太流行。
也可以这样，更容易理解：回调函数就好像是一个中断处理函数，系统在符合你设定的条件时自动&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1763034.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>VC++ 网络SOCKET编程</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763033.aspx</link><pubDate>Wed, 29 Aug 2007 06:14:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763033.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1763033.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763033.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1763033.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1763033</trackback:ping><description>作者：Ackarlix


为了方便网络编程，90年代初，由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口，即Windows Sockets规范，它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关，你可以使用Winsock来调用多种协议的功能，但较常使用的是TCP/IP协议。
Socket实际在计算机中提供了一个通信端口，可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输，接收的信息都通过这个Socket接口来实现。　　
微软为VC定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类，它们简单易用，读者朋友当然可以使用这些类来实现自己的网络程序，但是为了更好的了解Winsock API编程技术，我们这里探讨怎样使用底层的API函数实现简单的 Winsock 网络应用程式设计，分别说明如何在Server端和Client端操作Socket，实现基于TCP/IP的数据传送，最后给出相关的源代码&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1763033.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>进程列表</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763027.aspx</link><pubDate>Wed, 29 Aug 2007 05:51:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763027.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1763027.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763027.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1763027.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1763027</trackback:ping><description>作者：Ackarlix

 

代码：

#include "stdafx.h"
#include 
#include 
#include 


int main(int argc, char* argv[])
{

 ofstream outfile("ProcessList.txt");
 PROCESSENTRY32 pe32;
 pe32.dwSize = sizeof(pe32);

&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1763027.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Ackarlix</dc:creator><title>进程与多线程</title><link>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763023.aspx</link><pubDate>Wed, 29 Aug 2007 03:51:00 GMT</pubDate><guid>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763023.aspx</guid><wfw:comment>http://blog.csdn.net/ackarlix/comments/1763023.aspx</wfw:comment><comments>http://blog.csdn.net/ackarlix/archive/2007/08/29/1763023.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.csdn.net/ackarlix/comments/commentRss/1763023.aspx</wfw:commentRss><trackback:ping>http://tb.blog.csdn.net/TrackBack.aspx?PostId=1763023</trackback:ping><description>作者：Ackarlix

一、进程的创建

一般将创建进程的称为父进程，被创建的进程称为子进程。系统在创建新的进程时会为新进程指定一个STARTUPINFO类型的变量，这个结构包含了父进程传递给子进程的一些显示信息。对界面应用程序来说，这些信息将影响进程中主线程的窗口显示；对控制台应用程序来说，将影响这个控制台程序的窗口。

STARTUPINFO

STARTUPINFO结构定义如下：
typedef struct _STARTUPINFO {
DWORD   cb;
LPTSTR  lpReserved;
LPTSTR  lpDesktop;
LPTSTR  lpTitle;
DWORD   dwX;
DWORD   dwY;
DWORD   dwXSize;
DWORD   dwYSize;
DWORD   dwXCountChars;
DWORD   dwYCountChars;
DWORD   dwFillAttribute;
DWORD   dwFlags;
WORD    wShowWindow;
WORD    cbRese&lt;img src ="http://blog.csdn.net/ackarlix/aggbug/1763023.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>