﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><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>C++博客-龙与地下城的世界-随笔分类-Windows系统编程</title><link>http://www.cppblog.com/SysProgrammer/category/7952.html</link><description>Memory Layout......</description><language>zh-cn</language><lastBuildDate>Sat, 29 May 2010 10:12:45 GMT</lastBuildDate><pubDate>Sat, 29 May 2010 10:12:45 GMT</pubDate><ttl>60</ttl><item><title>利用管道对进程重定向</title><link>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Tue, 25 May 2010 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/116333.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/116333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/116333.html</trackback:ping><description><![CDATA[<p>一个管道有读端和写端,当你把这个管道和一个进程搭接起来的时候,可以用这个管道当作输入,也可以用这个管道当作输出,如果是要向管道输入,则数据输入端是写端,另一端是读端,如果是由管道输出,则由进程写入管道,是写端,另一端是读端,也就是接收进程的输出数据的一端,因此如果要重定向进程的输入和输出,则需要2根管道.<br>以下代码演示了创建CMD.EXE进程,并用2根管道重定向他的输入输出,并读取CMD产生的结果数据.<br><span style="COLOR: red">千万不要忘记设置SECURITY_ATTRIBUTES里的bInheritHandle,比如创建管道的时候要把bInheritHandle设置为TRUE</span></p>
<p>同样不一定要用管道,比如文件,SOCKET等都可以重定向.<br>如果是用SOCKET,根据网上的名词,可以创建一个"零管道后门"程序.比如在服务器端上的后门程序监听某个端口,一旦有连接请求,接受后创建SOCKET,就在这个时候开启CMD.EXE,并重定向输入输出到服务器上的这个SOCKET,这样便为远程的这个连接请求开了一个服务器上的后门，从而远程连接可以执行服务器并返回结果.<br>演示代码如下:<br>//<br>// File: Main.cpp<br>// Purpose: Creates a process( cmd.exe for example ), and redirect its standard input<br>//&nbsp;&nbsp;&nbsp;by using creating a pipe, then writes some bytes as commands to pipe.<br>//<br>#define WIN32_LEAN_AND_MEAN<br>#include &lt;windows.h&gt;</p>
<p>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;</p>
<p>// Error report<br>void Error( const char *szErrMsg );</p>
<p>int main( int argc, char **argv )<br>{<br>&nbsp;// Create pipe<br>&nbsp;BOOL bRet;<br>&nbsp;HANDLE hPipeRead, hPipeWrite;<br>&nbsp;HANDLE hPipeReadII, hPipeWriteII;<br>&nbsp;SECURITY_ATTRIBUTES&nbsp;sa;<br>&nbsp;sa.nLength = sizeof( SECURITY_ATTRIBUTES );<br>&nbsp;sa.bInheritHandle = TRUE;<br>&nbsp;sa.lpSecurityDescriptor = NULL;<br>&nbsp;bRet = ::CreatePipe( &amp;hPipeRead, &amp;hPipeWrite, &amp;sa, 512 );<br>&nbsp;bRet &amp;= ::CreatePipe( &amp;hPipeReadII, &amp;hPipeWriteII, &amp;sa, 512 );<br>&nbsp;if ( !bRet )<br>&nbsp;{<br>&nbsp;&nbsp;Error( "Can't create pipe!" );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;// Spawn a process<br>&nbsp;STARTUPINFO StartInfo;<br>&nbsp;PROCESS_INFORMATION ProcessInfo;<br>//&nbsp;memset( &amp;StartInfo, 0, sizeof(StartInfo) );<br>//&nbsp;memset( &amp;ProcessInfo, 0, sizeof(ProcessInfo) );<br>&nbsp;::GetStartupInfo( &amp;StartInfo );<br>&nbsp;StartInfo.cb = sizeof(StartInfo);<br>&nbsp;StartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;<br>&nbsp;StartInfo.wShowWindow = SW_HIDE;<br>&nbsp;StartInfo.hStdInput = hPipeRead;<br>&nbsp;StartInfo.hStdOutput = hPipeWriteII; //::GetStdHandle( STD_OUTPUT_HANDLE );<br>&nbsp;StartInfo.hStdError = hPipeWriteII; //::GetStdHandle( STD_OUTPUT_HANDLE );<br>&nbsp;bRet = ::CreateProcess( TEXT("c:\\windows\\system32\\cmd.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &amp;StartInfo, &amp;ProcessInfo );<br>&nbsp;::Sleep(1000);<br>&nbsp;printf("wake up...\n");<br>&nbsp;if ( !bRet )<br>&nbsp;{<br>&nbsp;&nbsp;Error( "Can't create process!" );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;// Write commands to pipe<br>&nbsp;char *szCmd = "netstat\r\n";<br>&nbsp;DWORD dwDummy;<br>&nbsp;::WriteFile( hPipeWrite, szCmd, 10, &amp;dwDummy, NULL );<br>&nbsp;::Sleep(2000);<br>&nbsp;printf("had written...\n");<br>&nbsp;// Read from pipe<br>&nbsp;char szBuf[1024];<br>&nbsp;memset(szBuf, 0, sizeof(szBuf));<br>&nbsp;::ReadFile( hPipeReadII, szBuf, sizeof(szBuf), &amp;dwDummy, NULL );<br>&nbsp;// Don't leave till the spawned process goes end<br>//&nbsp;::Sleep(2000);<br>&nbsp;printf("had read...\n");<br>//&nbsp;::WaitForSingleObject( ProcessInfo.hProcess, INFINITE );<br>&nbsp;printf("%s\n", szBuf);</p>
<p>&nbsp;return 0;<br>}</p>
<p>void Error( const char *szErrMsg )<br>{<br>&nbsp;printf( "Error: %s\n", szErrMsg );<br>}</p>
<br>在WinXP SP2 + VS 2005 Express Edition上编译并运行通过<br>这个版本的VS需要下载并设置Platform SDK,并另外找一个MSVCRT80D.DLL如果是DEBUG版本的DLL,并设置<br>包含和链接目录和链接器命令行(user32,kernel32,libcmt)<br>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/116333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2010-05-25 23:07 <a href="http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些问题的解决方法</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 06 May 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/82061.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/82061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/82061.html</trackback:ping><description><![CDATA[&nbsp;今天电脑怪怪的，出现了很多个无聊的小问题，注意,不是病之类的啊.不然的话虽然解决方法简单,但每一步都是相当浪费时间的.<br>&nbsp;&nbsp; 称为解决方法是因为这些问题实在太小了，方案根本算不上.<br>&nbsp;&nbsp; 1. 想要在VS2003下建立一个项目,弹出 Automation不能创建对象.GOOGLE后 regsvr32 scrrun.dll 注册搞定<br>&nbsp;&nbsp; 2. 想要打开&lt;&lt;MFC类库详解.CHM&gt;&gt;,弹出<a href="mailto:mk@DICTSTORE:your">mk@DICTSTORE:your</a> chm file absolute path,打不开,这个问题搞了会时间, \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a，右键关联chm文件的&#8220;打开方式&#8221;到\Windows\HH.exe&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b，在命令行运行regsvr32 itss.dll&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c，在命令行运行regsvr32 hhctrl.ocx <br>&nbsp;&nbsp; 3. 把原来的VC6项目移到VS2003后,编译出现:fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">右键点项目名,选择属性,先不使用预编译头文件,然后再次编译,OK后在重新起用预编译头文件.填写StdAfx.h&nbsp; $(InitDir)\$(IntDir)/$(TargetName).pch<br><br>&nbsp;&nbsp; 遇到这些问题,GOOGLE下还是非常容易搞的.<br>&nbsp;&nbsp; bwt, 前几天重装系统,由于懒的装Anti-Virus,尤其是扫描时间.因此系统病毒有点多的.后面彻底革新,发现按以下顺序的执行指令,就可以保护好系统.<br>&nbsp;&nbsp; 1.下载360<br>&nbsp;&nbsp; 2. 打好所有遗漏补丁<br>&nbsp;&nbsp; 3. 开启WINDOWS防火墙,起用更新<br>&nbsp;&nbsp; 4.开启所有360保护<br>&nbsp;&nbsp; 5.下载KA巴,可以通过360直接下,<br>&nbsp;&nbsp; 6.更新病毒库到最新<br>&nbsp;&nbsp; 7.全系统扫描,该杀的杀<br>&nbsp;&nbsp; 公司里的电脑我就这样打造,结果呆了近2年,1次都没重装,有点恐怖的...<br><br>&nbsp;&nbsp; 发现CPU,指令集非常有趣,写的LamaVM虚拟机快好了.</span> 
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/82061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-05-06 16:27 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程同步对象</title><link>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Sun, 17 Aug 2008 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/59164.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/59164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/59164.html</trackback:ping><description><![CDATA[<span style="COLOR: #ff0000; FONT-FAMILY: Comic Sans MS">&nbsp;<span style="FONT-SIZE: 14pt">&nbsp;Waiting for Multiple Objects<br><br>&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">在Windows中, <a id=ctl00_rs1_mainContentContainer_ctl03 onclick="javascript:Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl03',this);" href="http://msdn.microsoft.com/en-us/library/ms687025(VS.85).aspx"><strong><font color=#0033cc>WaitForMultipleObjects</font></strong></a>函数是一种同步的方法,原形定义如下:<br>&nbsp;&nbsp;&nbsp; DWORD WinApi WaitForMultipleObjects(&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD nCount, const Handle * lpHandles, BOOL bWaitAll, DWORD <em>dwMilliseconds );<br><br></em>&nbsp;&nbsp; 调用该函数的线程进入等待状态,直到条件满足时继续执行,条件的满足和参数有关.<br>&nbsp;&nbsp; 第一个参数为要等待的Objects的个数,通常这些Objects是一组句柄(Handles),可以是内核对象句柄或者是非内核对象<br>&nbsp;&nbsp; 句柄,这一组句柄由第2个指向分配给一系列句柄缓冲区的指针指出,第3个参数如果为TRUE,则等待的线程必须等到所有<br>&nbsp;&nbsp; 句柄全部完成执行后才继续执行,如果为FALSE, 那么只要有一个返回即可继续执行,第4个参数设置TIMEOUT的时间,<br>&nbsp;&nbsp; 如果在给定的dwMilliseconds内仍没等到条件满足则返回.<br><br>&nbsp;&nbsp; 那么如何得到等待的结果呢,如果bWaitAll设置为TRUE,将返回值和WAIT_OBJECT_0比较,如果相等则全部句柄都已<br>&nbsp;&nbsp; 发出了完成信号, 如果bWaitAll设置为FALSE, 如果只由一个发出信号,那么将返回值减去WAIT_OBJECT_0就是句<br>&nbsp;&nbsp; 柄数组中的索引,如果有多个信号发出,那么这个值是数组中最小索引的那一个.这样就可以判断是哪个发出了完成信号.<br><br>&nbsp;&nbsp; 通常,这些要等待的Objects是在其他的线程中执行的,那么执行完成后调用SetEvent( HANDLE hObjHandle )就可以<br>&nbsp;&nbsp; 发出一个完成信号,供调用WaitForMultipleObjects的线程接收.<br><br>&nbsp;&nbsp; 以下是一个如何使用该函数的简单例子,它使用CreateEvent函数创建了2个事件对象,放入全局的ghEvents缓存,然后<br>&nbsp;&nbsp; 创建了一个线程,等待该线程发出完成信号.<br>&nbsp;&nbsp; //<br>&nbsp; // Sync01.cpp<br>&nbsp; //<br>&nbsp;
<pre class=libCScode id=ctl00_rs1_mainContentContainer_ctl06 space="preserve">&nbsp;<span style="FONT-FAMILY: Comic Sans MS">#include &lt;windows.h&gt;
&nbsp;#include &lt;stdio.h&gt;
HANDLE ghEvents[2];
&nbsp;DWORD WINAPI ThreadProc( LPVOID );
void main()
{
HANDLE hThread;
DWORD i, dwEvent, dwThreadID;
// Create two event objects
for (i = 0; i &lt; 2; i++)
{
ghEvents[i] = CreateEvent(
NULL,   // default security attributes
FALSE,  // auto-reset event object
FALSE,  // initial state is nonsignaled
NULL);  // unnamed object
if (ghEvents[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
}
// Create a thread
hThread = CreateThread(
NULL,         // default security attributes
0,            // default stack size
(LPTHREAD_START_ROUTINE) ThreadProc,
NULL,         // no thread function arguments
0,            // default creation flags
&amp;dwThreadID); // receive thread identifier
if( hThread == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return;
}
// Wait for the thread to signal one of the event objects
dwEvent = WaitForMultipleObjects(
2,           // number of objects in array
ghEvents,     // array of objects
FALSE,       // wait for any object
5000);       // five-second wait
// The return value indicates which event is signaled
switch (dwEvent)
{
// ghEvents[0] was signaled
case WAIT_OBJECT_0 + 0:
// TODO: Perform tasks required by this event
printf("First event was signaled.\n");
break;
// ghEvents[1] was signaled
case WAIT_OBJECT_0 + 1:
// TODO: Perform tasks required by this event
printf("Second event was signaled.\n");
break;
case WAIT_TIMEOUT:
printf("Wait timed out.\n");
break;
// Return value is invalid.
default:
printf("Wait error: %d\n", GetLastError());
ExitProcess(0);
}
// Close event handles
for (i = 0; i &lt; 2; i++)
CloseHandle(ghEvents[i]);
}
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
// Set one event to the signaled state
if ( !SetEvent(ghEvents[0]) )
{
printf("SetEvent failed (%d)\n", GetLastError());
return -1;
}
return 1;
}</span></pre>
</span></span></span>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/59164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2008-08-17 22:17 <a href="http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>