NTSecurityExt.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:19k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // NTSecurityExt.cpp : Defines the initialization routines for the DLL.
  2. //
  3. #include "stdafx.h"
  4. #include <afxdllx.h>
  5. #include <winnls.h> // Unicode API
  6. #include <lm.h> // Lan manager API
  7. #include "FTPDaemonCore.h"
  8. #include "NTSecurityExt.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. static AFX_EXTENSION_MODULE NTSecurityExtDLL = { NULL, NULL };
  15. int CallOnPreFSYSAccess(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  16. int CallOnPostFSYSAccess(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  17. int CallOnGetSecurityDescriptor(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  18. int CallOnConnect(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  19. int CallOnReceive(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  20. int CallOnSend(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  21. int CallOnCommand(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  22. int CallOnClose(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  23. int CallOnSendCmd(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  24. int CallOnSITECmd(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  25. int CallOnIdle(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  26. int CallOnVerifyIPAddress(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  27. int CallOnVerifyUploadedFile(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  28. int CallOnVerifyTransferRequest(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  29. int CallOnSocketIsDestroyed(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam);
  30. ////////////////////////////////////////
  31. // ADDED: This is required for plugin's
  32. static CNTSecExt *pMe;
  33. extern "C" int APIENTRY
  34. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  35. {
  36. if (dwReason == DLL_PROCESS_ATTACH)
  37. {
  38. TRACE0("NTSECURITYEXT.DLL Initializing!n");
  39. // Extension DLL one-time initialization
  40. AfxInitExtensionModule(NTSecurityExtDLL, hInstance);
  41. // Insert this DLL into the resource chain
  42. new CDynLinkLibrary(NTSecurityExtDLL);
  43. ////////////////////////////////////////
  44. // ADDED: This is required for plugin's
  45. // Create, Register and set up the dll
  46. if (!IsNT())
  47. {
  48. CLog *pLog = CLog::GetLog();
  49. if (pLog)
  50. pLog->LogMsg(LOGF_ERROR,"CNTSecExt.dll can only run on NT systems.");
  51. return 0; // This module can only run on NT systems
  52. }
  53. pMe = new CNTSecExt;
  54. if (pMe->Register("NTSecurityExt") != 0)
  55. return 0; // Failure
  56. }
  57. else if (dwReason == DLL_PROCESS_DETACH)
  58. {
  59. ////////////////////////////////////////
  60. // ADDED: This is required for plugin's
  61. if (pMe)
  62. delete pMe;
  63. TRACE0("NTSECURITYEXT.DLL Terminating!n");
  64. }
  65. return 1;   // ok
  66. }
  67. // Initialize the extended COptions variables
  68. void CNTSecExt::InitializeCOptions()
  69. {
  70. DeclOpt("NT User database", m_SystemName, "<local>", 1, DATATYPE_CSTRING);
  71. DeclOpt("Default FTP Access", m_DefaultFTPAccess, TRUE, 2, DATATYPE_BOOL);
  72. DeclOpt("Give NT Admins Admin", m_GiveAdminsAdmin, TRUE, 3, DATATYPE_BOOL);
  73. }
  74. CNTSecExt::CNTSecExt()
  75. {
  76. }
  77. CNTSecExt::~CNTSecExt()
  78. {
  79. }
  80. // Called when a user tries to log on.
  81. // What we do here is to check if the user exist in the
  82. // NT user database, and is member of the NT user group we have 
  83. // reserved for War server users. 
  84. // If the user exist and has login permissions in NT, we
  85. // create the user in the war user database (provided that it don't 
  86. // already exist), and leave's the processessing to the default
  87. // implementation. We allow other plugins to process the login
  88. // reqest
  89. int CNTSecExt::OnLogin(int Event, WPARAM wParam, LPARAM lParam)
  90. {
  91. int Rval = CFuncList::OkContinue;
  92. LogMsg(LOGF_DEBUG, "CNTSecExt::OnLogin(): Called.");
  93. USER *pUser = (USER *)wParam;
  94. LOGINPRMS *pLP = (LOGINPRMS *)lParam;
  95. ASSERT(AfxIsValidAddress(pUser, sizeof(USER)));
  96. ASSERT(AfxIsValidAddress(pLP, sizeof(LOGINPRMS)));
  97. ASSERT(AfxIsValidString(pLP->UserID));
  98. *pUser = CUsr::FindUser(UT_USER, pLP->UserID);
  99. *pUser = CUsr::MapUser(*pUser);
  100. LPWSTR NTSystemName = NULL;
  101. LPWSTR UserName;
  102. NET_API_STATUS rCode;
  103. USER_INFO_1 *pUserInfo1 = NULL;
  104. // We use the old Lan Manager API to get extended information. We could
  105. // use the new NT 3.51 security interafce, but I don't know how to extract
  106. // the home directory from that...
  107. // The good news is that we get most of the infromation we need. The bad 
  108. // news is that we have to rewrite this code when NT 5 arrives...
  109. // Convert to unicode
  110. WORD wSNbuf[64];
  111. WORD wUNbuf[64];
  112. if (m_SystemName != "<local>")
  113. MultiByteToWideChar( CP_ACP, 0,m_SystemName,-1, NTSystemName = (LPWSTR)wSNbuf, sizeof(wSNbuf) / sizeof(WORD));
  114. MultiByteToWideChar( CP_ACP, 0,pLP->UserID,-1, UserName = (LPWSTR)wUNbuf, sizeof(wUNbuf) / sizeof(WORD));
  115. rCode = NetUserGetInfo(
  116. NTSystemName,
  117. UserName,
  118. 1,
  119. (LPBYTE *) &pUserInfo1);
  120. if (!rCode)
  121. {
  122. char HomeDir[MAX_PATH];
  123. WideCharToMultiByte(CP_ACP, 0, pUserInfo1->usri1_home_dir, -1, HomeDir, MAX_PATH, NULL, NULL);
  124. // Check login permissions
  125. if (pUserInfo1->usri1_flags & (UF_ACCOUNTDISABLE | UF_LOCKOUT))
  126. {
  127. // User has no access
  128. LogMsg(LOGF_SECURITY, "OnLogin(%s) - The user's NT account is disabled. Access is denied.", 
  129. pLP->UserID);
  130. Rval = CFuncList::AbortError;
  131. goto done;
  132. }
  133. // Get the NT class
  134. USER Class = CUsr::FindUser(UT_CLASS,"(NT_Users)");
  135. if (Class == INVALID_USER_VALUE)
  136. {
  137. // Create the NT user class!
  138. if ((Class = CUsr::AddUser(UT_CLASS,"(NT_Users)", TRUE)) == INVALID_USER_VALUE)
  139. {
  140. LogMsg(LOGF_SECURITY, "OnLogin(%s) - Failed to create class (NT_Users).", 
  141. pLP->UserID);
  142. Rval = CFuncList::AbortError;
  143. goto done;
  144. }
  145. CUsr::SetParam(Class,"FTP Access", m_DefaultFTPAccess);
  146. }
  147. if (*pUser == INVALID_USER_VALUE)
  148. {
  149. // Create the user. We need a daemon user to store extra info
  150. if ((*pUser = CUsr::AddUser(UT_USER, pLP->UserID)) != INVALID_USER_VALUE)
  151. {
  152. LogMsg(LOGF_SYSTEM,"OnLogin(%s) - Created NT user entry in daemon user database.", pLP->UserID);
  153. }
  154. else
  155. {
  156. LogMsg(LOGF_WARNINGS, "OnLogin(%s) - The users NT account is OK. Failed to create server user.", 
  157. pLP->UserID);
  158. Rval = CFuncList::AbortError;
  159. goto done;
  160. }
  161. CUsr::SetParam(*pUser,"FTP Access", m_DefaultFTPAccess);
  162. }
  163. LogMsg(LOGF_DEBUG,"OnLogin(%s) - Converting account to NT user style.", pLP->UserID);
  164. CUsr::SetParam(*pUser, "PWmode", PW_NORMAL);
  165. if (*HomeDir)
  166. CUsr::SetParam(*pUser, "Home", HomeDir);
  167. CUsr::SetParam(*pUser,"Class", Class);
  168. if (pUserInfo1->usri1_priv == USER_PRIV_ADMIN)
  169. {
  170. if (m_GiveAdminsAdmin)
  171. CUsr::SetParam(*pUser,"Administrator", TRUE);
  172. }
  173. else if (CUsr::IsAdmin(*pUser))
  174. CUsr::SetParam(*pUser,"Administrator", FALSE);
  175. }
  176. else
  177. {
  178. switch(rCode)
  179. {
  180. case ERROR_ACCESS_DENIED: LogMsg(LOGF_DEBUG,"OnLogin(%s) - NetUserGetInfo() returned: ERROR_ACCESS_DENIED.", pLP->UserID); break;
  181. case NERR_InvalidComputer: LogMsg(LOGF_DEBUG,"OnLogin(%s) - NetUserGetInfo() returned: NERR_InvalidComputer.", pLP->UserID); break;
  182. case NERR_UserNotFound: LogMsg(LOGF_DEBUG,"OnLogin(%s) - NetUserGetInfo() returned: NERR_UserNotFound.", pLP->UserID); break;
  183. default: LogMsg(LOGF_DEBUG,"OnLogin(%s) - NetUserGetInfo() returned unexpected error code: %d. (%s)", pLP->UserID, rCode, GetLastErrorText(rCode)); break;
  184. }
  185. }
  186. done:
  187. if (*pUser != INVALID_USER_VALUE)
  188. CUsr::SetParam(*pUser, "NT User", (rCode == 0) && (Rval == CFuncList::OkContinue));
  189. // Clean up
  190. if (pUserInfo1)
  191. NetApiBufferFree(pUserInfo1);
  192. return Rval;
  193. }
  194. int CNTSecExt::OnLogout(int Event, WPARAM wParam, LPARAM lParam)
  195. {
  196. int Rval = CFuncList::OkContinue;
  197. LogMsg(LOGF_DEBUG, "CNTSecExt::OnLogout(): Called.");
  198. CTextSock *pSock = (CTextSock *)lParam;
  199. DeleteNTProp(pSock);
  200. return Rval;
  201. }
  202. int CNTSecExt::OnPassword(int Event, WPARAM wParam, LPARAM lParam)
  203. {
  204. int Rval = CFuncList::OkContinue;
  205. LogMsg(LOGF_DEBUG, "CNTSecExt::OnPassword(): Called.");
  206. USER *pUser = (USER *)wParam;
  207. LOGINPRMS *pLP = (LOGINPRMS *)lParam;
  208. ASSERT(AfxIsValidAddress(pUser, sizeof(USER)));
  209. ASSERT(AfxIsValidAddress(pLP, sizeof(LOGINPRMS)));
  210. ASSERT(AfxIsValidString(pLP->UserID));
  211. *pUser = CUsr::FindUser(UT_USER, pLP->UserID);
  212. *pUser = CUsr::MapUser(*pUser);
  213. HANDLE lh;
  214. // Delete any previous logon handle for this connection
  215. DeleteNTProp(pLP->Sock);
  216. if (CUsr::GetParam(*pUser, "NT User", FALSE))
  217. {
  218. // Try to log the user on in NT
  219. char SysName[64];
  220. DWORD len = sizeof(SysName);
  221. GetComputerName(SysName, &len);
  222. LPTSTR System = (LPTSTR) ((m_SystemName == "<local>") ? SysName : (LPCSTR)m_SystemName);
  223. if (LogonUser(
  224. (LPTSTR)pLP->UserID,
  225. System,
  226. (LPTSTR)pLP->Password,
  227. LOGON32_LOGON_BATCH,
  228. LOGON32_PROVIDER_DEFAULT,
  229. &lh))
  230. {
  231. // Store the logon handle for later use
  232. CNTProperties *pNT = new CNTProperties;
  233. pNT->hLogon = lh;
  234. pNT->pSock = pLP->Sock;
  235. m_NTprp.AddFirst((LPVOID)pNT);
  236. Rval = CFuncList::OkAllDone;
  237. LogMsg(LOGF_INOUT,"User %s logged on with NT password.", pLP->UserID);
  238. }
  239. else
  240. {
  241. int err = GetLastError();
  242. if (err == ERROR_PRIVILEGE_NOT_HELD)
  243. {
  244. char AccessName[128] = SE_TCB_NAME;
  245. DWORD dw1, dw2;
  246. LookupPrivilegeDisplayName(NULL, SE_TCB_NAME, AccessName, &dw1, &dw2);
  247. LogMsg(LOGF_ERROR,"The user that run the FTP server must have '%s' access.",
  248. AccessName);
  249. }
  250. LogMsg(LOGF_DEBUG,"OnPassword(%s) - NT logon failed. Error: %s", 
  251. pLP->UserID, GetLastErrorText(err));
  252. Rval = CFuncList::AbortError;
  253. }
  254. }
  255. return Rval;
  256. }
  257. // Helper. Delete a NT property based on the connection socket
  258. void CNTSecExt::DeleteNTProp(CTextSock *pSock)
  259. {
  260. for(CLinkedListItem *Item = m_NTprp.First(); Item;)
  261. {
  262. CLinkedListItem *NextItem = m_NTprp.Next(Item);
  263. CNTProperties *pNT = (CNTProperties *)m_NTprp.Ptr(Item);
  264. if (pNT->pSock == pSock)
  265. {
  266. delete pNT;
  267. m_NTprp.DeleteItem(Item);
  268. }
  269. Item = NextItem;
  270. }
  271. }
  272. /////////////////////////////////////////////////////////////////////////////
  273. // CNTFTPConn callbacks
  274. int CNTFTPConn::OnPreFSYSAccess(int Event, WPARAM wParam, LPARAM lParam)
  275. {
  276. return 0;
  277. }
  278. int CNTFTPConn::OnPostFSYSAccess(int Event, WPARAM wParam, LPARAM lParam)
  279. {
  280. return 0;
  281. }
  282. int CNTFTPConn::OnGetSecurityDescriptor(int Event, WPARAM wParam, LPARAM lParam)
  283. {
  284. return 0;
  285. }
  286. int CNTFTPConn::OnConnect(int Event, WPARAM wParam, LPARAM lParam)
  287. {
  288. return 0;
  289. }
  290. int CNTFTPConn::OnReceive(int Event, WPARAM wParam, LPARAM lParam)
  291. {
  292. return 0;
  293. }
  294. int CNTFTPConn::OnSend(int Event, WPARAM wParam, LPARAM lParam)
  295. {
  296. return 0;
  297. }
  298. int CNTFTPConn::OnCommand(int Event, WPARAM wParam, LPARAM lParam)
  299. {
  300. return 0;
  301. }
  302. int CNTFTPConn::OnClose(int Event, WPARAM wParam, LPARAM lParam)
  303. {
  304. return 0;
  305. }
  306. int CNTFTPConn::OnSendCmd(int Event, WPARAM wParam, LPARAM lParam)
  307. {
  308. return 0;
  309. }
  310. int CNTFTPConn::OnSITECmd(int Event, WPARAM wParam, LPARAM lParam)
  311. {
  312. return 0;
  313. }
  314. int CNTFTPConn::OnIdle(int Event, WPARAM wParam, LPARAM lParam)
  315. {
  316. return 0;
  317. }
  318. int CNTFTPConn::OnVerifyIPAddress(int Event, WPARAM wParam, LPARAM lParam)
  319. {
  320. return 0;
  321. }
  322. int CNTFTPConn::OnVerifyUploadedFile(int Event, WPARAM wParam, LPARAM lParam)
  323. {
  324. return 0;
  325. }
  326. int CNTFTPConn::OnVerifyTransferRequest(int Event, WPARAM wParam, LPARAM lParam)
  327. {
  328. return 0;
  329. }
  330. // Raw callback support
  331. // Reqired function if sockets extentions are used
  332. // Creates a new socket derived 
  333. int CallOnSocketIsDestroyed(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  334. {
  335. delete (CNTFTPConn *)Origin; // CSocketAPI destructor will delete references
  336. return 0;
  337. }
  338. int CallOnPreFSYSAccess(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  339. {
  340. return ((CNTFTPConn *)Origin)->OnPreFSYSAccess(Event, wParam, lParam);
  341. }
  342. int CallOnPostFSYSAccess(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  343. {
  344. return ((CNTFTPConn *)Origin)->OnPostFSYSAccess(Event, wParam, lParam);
  345. }
  346. int CallOnGetSecurityDescriptor(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  347. {
  348. return ((CNTFTPConn *)Origin)->OnGetSecurityDescriptor(Event, wParam, lParam);
  349. }
  350. int CallOnConnect(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  351. {
  352. return ((CNTFTPConn *)Origin)->OnConnect(Event, wParam, lParam);
  353. }
  354. int CallOnReceive(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  355. {
  356. return ((CNTFTPConn *)Origin)->OnReceive(Event, wParam, lParam);
  357. }
  358. int CallOnSend(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  359. {
  360. return ((CNTFTPConn *)Origin)->OnSend(Event, wParam, lParam);
  361. }
  362. int CallOnCommand(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  363. {
  364. return ((CNTFTPConn *)Origin)->OnCommand(Event, wParam, lParam);
  365. }
  366. int CallOnClose(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  367. {
  368. return ((CNTFTPConn *)Origin)->OnClose(Event, wParam, lParam);
  369. }
  370. int CallOnSendCmd(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  371. {
  372. return ((CNTFTPConn *)Origin)->OnSendCmd(Event, wParam, lParam);
  373. }
  374. int CallOnSITECmd(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  375. {
  376. return ((CNTFTPConn *)Origin)->OnSITECmd(Event, wParam, lParam);
  377. }
  378. int CallOnIdle(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  379. {
  380. return ((CNTFTPConn *)Origin)->OnIdle(Event, wParam, lParam);
  381. }
  382. int CallOnVerifyIPAddress(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  383. {
  384. return ((CNTFTPConn *)Origin)->OnVerifyIPAddress(Event, wParam, lParam);
  385. }
  386. int CallOnVerifyUploadedFile(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  387. {
  388. return ((CNTFTPConn *)Origin)->OnVerifyUploadedFile(Event, wParam, lParam);
  389. }
  390. int CallOnVerifyTransferRequest(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  391. {
  392. return ((CNTFTPConn *)Origin)->OnVerifyTransferRequest(Event, wParam, lParam);
  393. }
  394. /////////////////////////////////////////////////////////////////////////////
  395. // Helper (entry point functions)
  396. // This is the fuction's the server looks for and calls. These must call our own
  397. // functions that do the actual work.
  398. int CallOnLogin(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  399. {
  400. return ((CNTSecExt *)Origin)->OnLogin(Event, wParam, lParam);
  401. }
  402. int CallOnLogout(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  403. {
  404. return ((CNTSecExt *)Origin)->OnLogout(Event, wParam, lParam);
  405. }
  406. int CallOnPassword(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  407. {
  408. return ((CNTSecExt *)Origin)->OnPassword(Event, wParam, lParam);
  409. }
  410. // Required function
  411. int CallApiInitInstance(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  412. {
  413. return ((CNTSecExt *)Origin)->ApiInitInstance(Event, wParam, lParam);
  414. }
  415. // Required function
  416. int CallApiExitInstance(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  417. {
  418. return ((CNTSecExt *)Origin)->ApiExitInstance(Event, wParam, lParam);
  419. }
  420. int CallApiNewSocket(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  421. {
  422. return 0;
  423. }
  424. int CallOnPreFTPDAccept(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  425. {
  426. CFTPDCoreCtrlSock *pSock = (CFTPDCoreCtrlSock *)wParam;
  427. CFTPDCoreListenSock *pListenSock = (CFTPDCoreListenSock *)lParam;
  428. return 0;
  429. }
  430. int CallOnPostFTPDAccept(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  431. {
  432. CFTPDCoreCtrlSock *pSock = (CFTPDCoreCtrlSock *)wParam;
  433. CFTPDCoreListenSock *pListenSock = (CFTPDCoreListenSock *)lParam;
  434. return 0;
  435. }
  436. void CNTSecExt::LogMsg(int flag, LPCSTR Format, ...)
  437. {
  438. ASSERT(AfxIsValidAddress(this,sizeof(CNTSecExt)));
  439. ASSERT(m_pLog != NULL);
  440. ASSERT(AfxIsValidAddress(m_pLog, sizeof(CLog)));
  441. if (!ShouldLog(m_pLog, flag))
  442. return;
  443. {
  444. CString cBuf;
  445. ASSERT(AfxIsValidString(Format, FALSE));
  446. cBuf.Format("(CNTSecExt) %s", Format);
  447. va_list argList;
  448. va_start(argList, Format);
  449. m_pLog->LogMsgV(flag, cBuf, argList);
  450. va_end(argList);
  451. }
  452. }
  453. CNTProperties::CNTProperties()
  454. {
  455. hLogon = NULL;
  456. pSock = NULL;
  457. }
  458. CNTProperties::~CNTProperties()
  459. {
  460. if (hLogon)
  461. CloseHandle(hLogon);
  462. }
  463. //////////////////////////////////////////////////////////////////////////////////
  464. // Socket connector subsystem. These functions will create a CSockAPI derived 
  465. // object (of our choise) for Sockey level notifications.
  466. // Delete the calls you don't need, or add the On*Socket handler to create
  467. // the object.
  468. // Called from the CSock constructor
  469. //
  470. int CallOnNewSocket(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  471. {
  472. CSock *pSock = (CSock *)lParam;
  473. return 0;
  474. }
  475. int CallOnNewTextSocket(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  476. {
  477. CTextSock *pSock = (CTextSock *)lParam;
  478. // Create a new CNTFTPConn object and link it to the calls we will use.
  479. CDllInfo *pDLL = pMe->GetDLLInfo();
  480. ASSERT(pDLL != NULL);
  481. if (pDLL == NULL)
  482. return 0;
  483. CNTFTPConn *pConn = new CNTFTPConn;
  484. pConn->pSock = pSock; // Required
  485. pSock->m_Funcs[CSock::iOnSocketIsDestroyed].AddLast(pDLL, CSock::iOnSocketIsDestroyed, pConn, CallOnSocketIsDestroyed);
  486. pSock->m_Funcs[CSock::OnPreFSYSAccess].AddLast(pDLL, CSock::OnPreFSYSAccess, pConn, CallOnPreFSYSAccess);
  487. pSock->m_Funcs[CSock::OnPostFSYSAccess].AddLast(pDLL, CSock::OnPostFSYSAccess, pConn, CallOnPostFSYSAccess);
  488. pSock->m_Funcs[CSock::OnGetSecurityDescriptor].AddLast(pDLL, CSock::OnGetSecurityDescriptor, pConn, CallOnGetSecurityDescriptor);
  489. pSock->m_Funcs[CSock::iOnConnect].AddLast(pDLL, CSock::iOnConnect, pConn, CallOnConnect);
  490. pSock->m_Funcs[CSock::iOnReceive].AddLast(pDLL, CSock::iOnReceive, pConn, CallOnReceive);
  491. pSock->m_Funcs[CSock::iOnSend].AddLast(pDLL, CSock::iOnSend, pConn, CallOnSend);
  492. pSock->m_Funcs[CSock::iOnCommand].AddLast(pDLL, CSock::iOnCommand, pConn, CallOnCommand);
  493. pSock->m_Funcs[CSock::iOnClose].AddLast(pDLL, CSock::iOnClose, pConn, CallOnClose);
  494. pSock->m_Funcs[CSock::iSendCtrlMsg].AddLast(pDLL, CSock::iSendCtrlMsg, pConn, CallOnSendCmd);
  495. pSock->m_Funcs[CSock::iOnSITECmd].AddLast(pDLL, CSock::iOnSITECmd, pConn, CallOnSITECmd);
  496. pSock->m_Funcs[CSock::iOnIdle].AddLast(pDLL, CSock::iOnIdle, pConn, CallOnIdle);
  497. pSock->m_Funcs[CSock::iOnVerifyIPAddress].AddLast(pDLL, CSock::iOnVerifyIPAddress, pConn, CallOnVerifyIPAddress);
  498. pSock->m_Funcs[CSock::iOnVerifyUploadedFile].AddLast(pDLL, CSock::iOnVerifyUploadedFile, pConn, CallOnVerifyUploadedFile);
  499. pSock->m_Funcs[CSock::iOnVerifyTransferRequest].AddLast(pDLL, CSock::iOnVerifyTransferRequest, pConn, CallOnVerifyTransferRequest);
  500. return 0;
  501. }
  502. int CallOnNewFTPDataSocket(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  503. {
  504. CFTPDataSock *pSock = (CFTPDataSock *)lParam;
  505. return 0;
  506. }
  507. int CallOnFTPDCoreCtrlSock(LPVOID Origin, int Event, WPARAM wParam, LPARAM lParam)
  508. {
  509. CFTPDCoreCtrlSock *pSock = (CFTPDCoreCtrlSock *)lParam;
  510. return 0;
  511. }