iohandler.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:5k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. // Command Input/Output Interface
  16. #include<windows.h>
  17. #include<iohandler.h>
  18. #include<commnet.h>
  19. //                                               //
  20. //////////////// IO Handler Class /////////////////
  21. //                                               //
  22. CIOHandler::CIOHandler()
  23. {
  24. int i;
  25. for(i=0;i<MAX_IO_HANDLERS;i++)
  26. m_IOHandler[i]=INVALID_IO_HANDLER;
  27. }
  28. CIOHandler::~CIOHandler()
  29. {
  30. int i;
  31. for(i=0;i<MAX_IO_HANDLERS;i++) {
  32. if(m_IOHandler[i]!=INVALID_IO_HANDLER) {
  33. m_IOHandler[i]->pRemove();
  34. m_IOHandler[i]=INVALID_IO_HANDLER;
  35. }
  36. }
  37. }
  38. int CIOHandler::Insert(IO_HANDLER *handler)
  39. {
  40. int i;
  41. if(handler->pInsert==NULL) return -1;
  42. if(handler->pInsert()==-1) return -1;
  43. for(i=0;i<MAX_IO_HANDLERS;i++) {
  44. if(m_IOHandler[i]==INVALID_IO_HANDLER) break;
  45. }
  46. if(i==MAX_IO_HANDLERS) return -1;
  47. m_IOHandler[i]=handler;
  48. return i;
  49. }
  50. int CIOHandler::GetHandlerCount(void)
  51. {
  52. int count,i;
  53. count=0;
  54. for(i=0;i<MAX_IO_HANDLERS;i++) {
  55. if(m_IOHandler[i]!=INVALID_IO_HANDLER) count++;
  56. }
  57. return count;
  58. }
  59. IO_HANDLER *CIOHandler::GetHandler(int nHandler)
  60. {
  61. if(nHandler<0 || nHandler>=MAX_IO_HANDLERS) return NULL;
  62. return m_IOHandler[nHandler];
  63. }
  64. IO_HANDLER *CIOHandler::GetHandlerByID(char *svID)
  65. {
  66. int i;
  67. for(i=0;i<MAX_IO_HANDLERS;i++) {
  68. char *svQuery=Query(i);
  69. if(svQuery!=NULL) {
  70. if(strnicmp(svQuery,svID,min(lstrlen(svID),lstrlen(svQuery)))==0)
  71. return m_IOHandler[i];
  72. }
  73. }
  74. return NULL;
  75. }
  76. char *CIOHandler::Query(int nHandler)
  77. {
  78. if(nHandler<0 || nHandler>=MAX_IO_HANDLERS) return NULL;
  79. if(m_IOHandler[nHandler]==INVALID_IO_HANDLER) return NULL;
  80. if(m_IOHandler[nHandler]->pQuery==NULL) return NULL;
  81. return m_IOHandler[nHandler]->pQuery();
  82. }
  83. int CIOHandler::Remove(int nHandler)
  84. {
  85. int ret;
  86. if(nHandler<0 || nHandler>=MAX_IO_HANDLERS) return NULL;
  87. if(m_IOHandler[nHandler]==INVALID_IO_HANDLER) return NULL;
  88. if(m_IOHandler[nHandler]->pRemove==NULL) return NULL;
  89. ret=m_IOHandler[nHandler]->pRemove();
  90. m_IOHandler[nHandler]=INVALID_IO_HANDLER;
  91. return ret;
  92. }
  93. //                                               //
  94. //////////////// Socket Class /////////////////////
  95. //                                               //
  96. CIOSocket::CIOSocket(IO_HANDLER *pHandler)
  97. {
  98. m_pHandler=pHandler;
  99. m_pData=NULL;
  100. m_svRmtAddr[0]=0;
  101. }
  102. CIOSocket::~CIOSocket()
  103. {
  104. }
  105. int CIOSocket::Listen(char *svTarget)
  106. {
  107. if(m_pHandler->pListen==NULL) return -1;
  108. if(m_pData!=NULL) return -1;
  109. m_pData=m_pHandler->pListen(svTarget);
  110. if(m_pData==NULL) return -1;
  111. return 0;
  112. }
  113. int CIOSocket::Connect(char *svTarget)
  114. {
  115. if(m_pHandler->pConnect==NULL) return -1;
  116. if(m_pData!=NULL) return -1;
  117. m_pData=m_pHandler->pConnect(svTarget);
  118. if(m_pData==NULL) return -1;
  119. lstrcpyn(m_svRmtAddr,svTarget,256);
  120. return 0;
  121. }
  122. CIOSocket *CIOSocket::Accept(void)
  123. {
  124. CIOSocket *cios;
  125. if(m_pHandler->pAccept==NULL) return NULL;
  126. if(m_pData==NULL) return NULL;
  127. void *data;
  128. char svAddr[256];
  129. data=m_pHandler->pAccept(m_pData,svAddr,256);
  130. if(data==NULL) return NULL;
  131. cios=new CIOSocket(m_pHandler);
  132. cios->m_pData=data;
  133. lstrcpyn(cios->m_svRmtAddr,svAddr,256);
  134. return cios;
  135. }
  136. int CIOSocket::Close(void)
  137. {
  138. int ret;
  139. if(m_pHandler->pClose==NULL) return -1;
  140. if(m_pData==NULL) return 0;
  141. ret=m_pHandler->pClose(m_pData);
  142. if(ret<0) return ret;
  143. m_svRmtAddr[0]='';
  144. m_pData=NULL;
  145. return ret;
  146. }
  147. int CIOSocket::Recv(BYTE **pInData, int *pnInDataLen)
  148. {
  149. if(m_pHandler->pRecv==NULL) return -1;
  150. if(m_pData==NULL) {
  151. *pInData=NULL;
  152. *pnInDataLen=0;
  153. return -1;
  154. }
  155. return m_pHandler->pRecv(m_pData,pInData,pnInDataLen);
  156. }
  157. int CIOSocket::Send(BYTE *pData, int nDataLen)
  158. {
  159. if(m_pHandler->pSend==NULL) return -1;
  160. if(m_pData==NULL) return -1;
  161. return m_pHandler->pSend(m_pData,pData,nDataLen);
  162. }
  163. void CIOSocket::Free(BYTE *pBuffer)
  164. {
  165. if(m_pHandler->pFree==NULL) return;
  166. if(m_pData==NULL) return;
  167. m_pHandler->pFree(m_pData,pBuffer);
  168. }
  169. int CIOSocket::GetRemoteAddr(char *svAddr,int nMaxLen)
  170. {
  171. lstrcpyn(svAddr,m_svRmtAddr,nMaxLen);
  172. return lstrlen(svAddr);
  173. }
  174. int CIOSocket::GetConnectAddr(char *svAddr,int nMaxLen)
  175. {
  176. if(m_pHandler->pGetConnectAddr==NULL) return -1;
  177. if(m_pData==NULL) return -1;
  178. return m_pHandler->pGetConnectAddr(m_pData,svAddr,nMaxLen);
  179. }