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

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : VfFsys.cpp
  16. // PURPOSE : War Daemon Virtual File System
  17. // PROGRAM : 
  18. // DATE : March 13 1997
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. //
  22. // Exports are done in the .def file.
  23. // 
  24. // REVISION HISTORY
  25. // 
  26. #include "stdafx.h"
  27. #include <afxdllx.h>
  28. #include <ctype.h>
  29. #define EXT
  30. // For now, we don't support non-daemon programs
  31. //#include "WarSoftware.h"
  32. #include "WarDaemon.h"
  33. #include "WarFsys.h"
  34. #include "VfFSys.h"
  35. #include "UnixFsysTypes.h"
  36. #include "FsysSecurity.h"
  37. #ifdef _DEBUG
  38. #define new DEBUG_NEW
  39. #undef THIS_FILE
  40. static char THIS_FILE[] = __FILE__;
  41. #endif
  42. static AFX_EXTENSION_MODULE VfSysDLL = { NULL, NULL };
  43. extern "C" int APIENTRY
  44. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  45. {
  46. if (dwReason == DLL_PROCESS_ATTACH)
  47. {
  48. TRACE0("VFSYS.DLL Initializing!n");
  49. // Extension DLL one-time initialization
  50. AfxInitExtensionModule(VfSysDLL, hInstance);
  51. // Insert this DLL into the resource chain
  52. new CDynLinkLibrary(VfSysDLL);
  53. // Create therad sync object
  54. pLock = new CRWLock;
  55. if (!pLock->Create("VfSyslck"))
  56. {
  57. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: DllMain() - Unable to create CRWLock object.");
  58. return 0;
  59. }
  60. }
  61. else if (dwReason == DLL_PROCESS_DETACH)
  62. {
  63. TRACE0("VFSYS.DLL Terminating!n");
  64. if (pVfSys)
  65. delete pVfSys;
  66. pVfSys = NULL;
  67. if (pLock)
  68. delete pLock;
  69. pLock = NULL;
  70. if (pSmem)
  71. delete pSmem;
  72. pSmem = NULL;
  73. }
  74. return 1;   // ok
  75. }
  76. ////////////////////////////////////////////////////////////////////////////////
  77. // Entry point
  78. BOOL OpenFsys(HWND *phWnd, LPCSTR IniFilePath)
  79. {
  80. int Index;
  81. if (pVfSys)
  82. {
  83. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - File system is already initialized.");
  84. SetLastError(ERROR_ALREADY_EXISTS);
  85. return FALSE;
  86. }
  87. // Initialize the security subsystem
  88. // Create a new root security file it it don't already exist.
  89. {
  90. HANDLE h = CFsysSecurity::LoadSecurityGroup("",FALSE);
  91. if (h == INVALID_HANDLE_VALUE)
  92. h = CFsysSecurity::OpenSecurityGroupForUpdate("");
  93. if (h == INVALID_HANDLE_VALUE)
  94. {
  95. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - Failed initialize the security subsystem.");
  96. return FALSE;
  97. }
  98. CFsysSecurity::CloseSecurityGroup(h);
  99. }
  100. pVfSys = new CVirtualFileSystem;
  101. if (!pVfSys->CreateEx(0, AfxRegisterWndClass(0),
  102. _T("Wirtual File System Notification Sink"),
  103. WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
  104. {
  105. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - Unable to create Virtual File System notify window!");
  106. return FALSE;
  107. }
  108. ASSERT(pVfSys->m_hWnd != NULL);
  109. ASSERT(CWnd::FromHandlePermanent(pVfSys->m_hWnd) == pVfSys);
  110. *phWnd = pVfSys->m_hWnd;
  111. pLock->WriteLock();
  112. // Create shared memory
  113. pSmem = new CSharedBlksMem;
  114. if (!pSmem->Create("VfSysmem", 
  115. GetPrivateProfileInt("fsys", "buffer", (1024 * 512), IniFilePath)))
  116. {
  117. delete pVfSys;
  118. pVfSys = NULL;
  119. phWnd = NULL;
  120. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - Unable to create shared memory");
  121. pLock->UnlockWrite();
  122. return FALSE;
  123. }
  124. // Create the master virtual file system
  125. if (pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_ROOTNODE] == 0)
  126. {
  127. // Create global headers
  128. SMEM GlobalHdr = *(SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_DEVDRV]);
  129. if (GlobalHdr == 0)
  130. {
  131. if (!pSmem->sh_malloc(GlobalHdr, sizeof(GLOBAL_FSYS_DRIVERS_HDR)))
  132. {
  133. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - Failed to allocate GLOBAL_FSYS_DRIVERS_HDR");
  134. goto fail;
  135. }
  136. *(SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_DEVDRV]) = GlobalHdr;
  137. }
  138. // Create the global plugin table
  139. ASSERT(pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_PLUGINS] == 0);
  140. {
  141. SMEM smPluginTable;
  142. smPluginTable = 0;
  143. if (!pSmem->sh_malloc(smPluginTable, sizeof(GLOBAL_VFSYS_PLUGIN_HDR)))
  144. {
  145. CLog::GetLog()->LogMsg(LOGF_ERROR,"CVirtualFileSystem::OpenFsys() - Failed to allocate GLOBAL_VFSYS_PLUGIN_HDR");
  146. goto fail;
  147. }
  148. *(SMEM *)&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_PLUGINS] = smPluginTable;
  149. pGlobalPluginHdr = (GLOBAL_VFSYS_PLUGIN_HDR *)pSmem->__Ptr(smPluginTable);
  150. }
  151. for(Index = 0; Index < PLUGIN_TABLE_SIZE; Index++)
  152. {
  153. CString Tag, Name, Pattern;
  154. Tag.Format("Plugin%d", Index);
  155. GetPrivateProfileString(Tag,"Plugin","", Name.GetBuffer(32), 32, IniFilePath);
  156. Name.ReleaseBuffer();
  157. if (Name.IsEmpty())
  158. break;
  159. GetPrivateProfileString(Tag,"Pattern","", Pattern.GetBuffer(64), 64, IniFilePath);
  160. Pattern.ReleaseBuffer();
  161. strcpy(pGlobalPluginHdr->Plugin[Index].Name, Name);
  162. strcpy(pGlobalPluginHdr->Plugin[Index].Pattern, Pattern);
  163. pGlobalPluginHdr->Plugin[Index].dwFlags = GetPrivateProfileInt(Tag,"Flags",0, IniFilePath);
  164. }
  165. SyncPlugins(); // We only need to do this once
  166. if (!CreateMasterFsys(IniFilePath))
  167. {
  168. fail:
  169. delete pVfSys;
  170. *phWnd = NULL;
  171. pVfSys = NULL;
  172. delete pSmem;
  173. pSmem = NULL;
  174. pLock->UnlockWrite();
  175. return FALSE;
  176. }
  177. }
  178. else
  179. {
  180. // Initialize only..
  181. SyncPlugins();
  182. SyncDeviceDrivers();
  183. }
  184. pLock->UnlockWrite();
  185. return TRUE;
  186. }
  187. // End of entry point
  188. void SyncPlugins()
  189. {
  190. pGlobalPluginHdr = (GLOBAL_VFSYS_PLUGIN_HDR *)pSmem->__Ptr(
  191. *(SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_PLUGINS]));
  192. if (pGlobalPluginHdr)
  193. {
  194. for(int Index = 0; Index < PLUGIN_TABLE_SIZE; Index++)
  195. {
  196. if (!pGlobalPluginHdr->Plugin[Index].Name[0])
  197. break;
  198. if (!LocalPluginTable[Index].hDll)
  199. {
  200. // Load it
  201. // Try to load the device driver
  202. if ((LocalPluginTable[Index].hDll = LoadLibrary(pGlobalPluginHdr->Plugin[Index].Name)) == NULL)
  203. {
  204. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: SyncPlugins() - Failed to load plugin'%s'. %s",
  205. pGlobalPluginHdr->Plugin[Index].Name, GetLastErrorText());
  206. continue;
  207. }
  208. // Find function(s)
  209. LocalPluginTable[Index].OnFoundFile = 
  210. (DWORD (*)(
  211. SMEM smDir, // Parent directory
  212. CFileInfo& Info, // File info from device
  213. SMEM smNode, // Node, 0 if new file
  214. CString& RealName, //File system name
  215. CString& VisualName, // The name the user will see
  216. CString& LinkTo, // Link to
  217. LPCSTR FsysPath, // File system path to parent dir
  218. FILE_SYSTEM *pFsys, // Current file system
  219. CDeviceDriver *pDev // Current device
  220. ))GetProcAddress(
  221. LocalPluginTable[Index].hDll, 
  222. "?OnFoundFile@@YAKUSMEM@@AAVCFileInfo@@0AAVCString@@22PBDPAUFILE_SYSTEM@@PAVCDeviceDriver@@@Z");
  223. CLog::GetLog()->LogMsg(LOGF_DEBUG,"VfSys.dll: SyncPlugins() - loaded plugin '%s'",
  224. pGlobalPluginHdr->Plugin[Index].Name);
  225. }
  226. }
  227. }
  228. }
  229. // Mount the master file system
  230. BOOL CreateMasterFsys(LPCSTR IniFilePath)
  231. {
  232. int Index;
  233. for(Index = 0;; Index++)
  234. {
  235. CString Tag, Path, Vpath, Driver, User, Pwd;
  236. int Copy, Timeout;
  237. Tag.Format("mount%d", Index);
  238. GetPrivateProfileString(Tag,"Path","", Path.GetBuffer(1024), 1024, IniFilePath);
  239. Path.ReleaseBuffer();
  240. if (Path.IsEmpty())
  241. break;
  242. GetPrivateProfileString(Tag,"VPath","", Vpath.GetBuffer(1024), 1024, IniFilePath);
  243. Vpath.ReleaseBuffer();
  244. if (Vpath.IsEmpty())
  245. break;
  246. GetPrivateProfileString(Tag,"Driver","", Driver.GetBuffer(1024), 1024, IniFilePath);
  247. Driver.ReleaseBuffer();
  248. if (Driver.IsEmpty())
  249. break;
  250. GetPrivateProfileString(Tag,"User","", User.GetBuffer(32), 32, IniFilePath);
  251. User.ReleaseBuffer();
  252. GetPrivateProfileString(Tag,"passwd","", Pwd.GetBuffer(32), 32, IniFilePath);
  253. Pwd.ReleaseBuffer();
  254. Copy = GetPrivateProfileInt(Tag,"Copy", FALSE, IniFilePath);
  255. Timeout = GetPrivateProfileInt(Tag,"Timeout", FALSE, IniFilePath);
  256. MountFsys(Path, Vpath, Driver, User, Pwd, Copy, Timeout, IniFilePath, Tag);
  257. }
  258. return Index > 0;
  259. }
  260. // Mount a file system
  261. BOOL MountFsys(LPCSTR Path, LPCSTR Vpath, LPCSTR Driver, LPCSTR User, LPCSTR Pwd, BOOL Copy, int Timeout, LPCSTR IniFilePath, LPCSTR Tag)
  262. {
  263. SMEM *pMasterNode = (SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_ROOTNODE]);
  264. int DevIndex = -1;
  265. CLog::GetLog()->LogMsg(LOGF_SYSTEM,"vfsys.dll: MountFsys(%s, %s, %s) - Mounting file system.",
  266. Path, Vpath, Driver);
  267. // Check if the driver is loaded
  268. SyncDeviceDrivers();
  269. if ((DevIndex = MountDeviceDriver(Driver)) == -1)
  270. return FALSE;
  271. if (*pMasterNode)
  272. ScanPath(Vpath, TRUE, FALSE, TRUE);
  273. // Mount the file system
  274. if (!strcmp(Vpath,"/"))
  275. {
  276. // Root node.
  277. if (*pMasterNode)
  278. {
  279. CLog::GetLog()->LogMsg(LOGF_ERROR,"vfsys.dll: MountFsys(%s, %s) - Root node already exist.",
  280. Path, Vpath);
  281. SetLastError(ERROR_ALREADY_EXISTS);
  282. return FALSE;
  283. }
  284. }
  285. // Create the file system structure
  286. int HdrLen = sizeof(FILE_SYSTEM);
  287. HdrLen += (strlen(Path) +1);
  288. HdrLen += (strlen(Vpath) +1);
  289. HdrLen += (strlen(User) +1);
  290. HdrLen += (strlen(Pwd) +1);
  291. SMEM smFsys;
  292. if (!pSmem->sh_malloc(smFsys, HdrLen))
  293. {
  294. CLog::GetLog()->LogMsg(LOGF_ERROR,"vfsys.dll: MountFsys(%s, %s) - Out of shared memory.",
  295. Path, Vpath);
  296. SetLastError(ERROR_NOT_ENOUGH_MEMORY);
  297. return FALSE;
  298. }
  299. FILE_SYSTEM *pFsysLast = (FILE_SYSTEM *)pSmem->__Ptr(*(SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_FSYS]));
  300. FILE_SYSTEM *pFsys = (FILE_SYSTEM *)pSmem->__Ptr(smFsys);
  301. // Initialize data members
  302. strcpy(pFsys->DOSPath, Path);
  303. strcpy(pFsys->Vpath, Vpath);
  304. strcpy(pFsys->LoginName, User ? User : "");
  305. strcpy(pFsys->LoginPwd, Pwd ? Pwd : "");
  306. pFsys->DevIdx = DevIndex;
  307. pFsys->RootNode = 0;
  308. pFsys->Next = pFsys->RootNode;
  309. pFsys->FlushDelay = Timeout;
  310. pFsys->DoCopy = Copy;
  311. if (!CreateRootNode(smFsys))
  312. return FALSE;
  313. // Initialize
  314. if (!pFsysLast)
  315. {
  316. // Link as first in list
  317. SMEM *pShdr = (SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_FSYS]);
  318. *pShdr = smFsys;
  319. }
  320. else
  321. {
  322. // Find the last fsys and link to it
  323. while(pFsysLast->Next)
  324. pFsysLast = (FILE_SYSTEM *)pSmem->__Ptr(pFsysLast->Next);
  325. if (pFsysLast)
  326. pFsysLast->Next = smFsys;
  327. }
  328. // Check for additional parameters..
  329. if (!GetPrivateProfileInt(Tag,"ScanOnDemand", TRUE, IniFilePath))
  330. ScanPath(Vpath, FALSE, TRUE, TRUE);
  331. return TRUE;
  332. }
  333. // Syncronize the local driver table against the global table
  334. BOOL SyncDeviceDrivers()
  335. {
  336. SMEM *pSmGlobalHdr = (SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_DEVDRV]);
  337. GLOBAL_FSYS_DRIVERS_HDR *pGlobalHdr = (GLOBAL_FSYS_DRIVERS_HDR *)pSmem->__Ptr(*pSmGlobalHdr);
  338. ASSERT(AfxIsValidAddress(pGlobalHdr, sizeof(GLOBAL_FSYS_DRIVERS_HDR)));
  339. for(int Index = 0;Index < DRIVER_TABLE_SIZE; Index++)
  340. {
  341. if (!*pGlobalHdr->Name[Index])
  342. break;
  343. if (!LocalDeviceDrivers[Index].pDevDr)
  344. MountDeviceDriver(pGlobalHdr->Name[Index]);
  345. }
  346. return TRUE;
  347. }
  348. // Mount a new device driver (if don't exist)
  349. // Return the index to the driver
  350. int MountDeviceDriver(LPCSTR Driver)
  351. {
  352. SMEM *pSmGlobalHdr = (SMEM *)(&pSmem->m_Segments[0].m_pSMH->pUserPtr[USERPTR_DEVDRV]);
  353. GLOBAL_FSYS_DRIVERS_HDR *pGlobalHdr = (GLOBAL_FSYS_DRIVERS_HDR *)pSmem->__Ptr(*pSmGlobalHdr);
  354. ASSERT(AfxIsValidString(Driver));
  355. ASSERT(AfxIsValidAddress(pGlobalHdr, sizeof(GLOBAL_FSYS_DRIVERS_HDR)));
  356. CLog::GetLog()->LogMsg(LOGF_SYSTEM,"vfsys.dll: MountDeviceDriver(%s) - Mounting device driver.",
  357. Driver);
  358. if (strlen(Driver) >= DRIVER_NAME_LEN)
  359. {
  360. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: MountDeviceDriver() - Name of device '%s' is more than %d characters.",
  361. Driver, DRIVER_NAME_LEN - 1);
  362. return -1;
  363. }
  364. int Index = FindDeviceDriver(Driver);
  365. if (Index < 0)
  366. {
  367. // Find a new empty slot
  368. for(Index = 0;Index < DRIVER_TABLE_SIZE; Index++)
  369. {
  370. if (!*pGlobalHdr->Name[Index])
  371. break;
  372. }
  373. strcpy(pGlobalHdr->Name[Index], Driver);
  374. }
  375. if (Index >= DRIVER_TABLE_SIZE)
  376. {
  377. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: MountDeviceDriver() - Device table is full (%d entries). Unable to add '%s'.",
  378. DRIVER_TABLE_SIZE, Driver);
  379. return -1;
  380. }
  381. // Try to load the device driver
  382. if ((LocalDeviceDrivers[Index].hDll = LoadLibrary(Driver)) == NULL)
  383. {
  384. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: MountDeviceDriver() - Failed to load device driver '%s'. %s",
  385. Driver, GetLastErrorText());
  386. return -1;
  387. }
  388. HANDLE (*DevOpenDevice)(CFileSystemTemplate *pInfo);
  389. if ((DevOpenDevice = (HANDLE(*)(CFileSystemTemplate *pInfo))GetProcAddress(
  390. LocalDeviceDrivers[Index].hDll, 
  391. "?DevOpenDevice@@YAPAXPAVCFileSystemTemplate@@@Z")) == NULL)
  392. {
  393. CLog::GetLog()->LogMsg(LOGF_ERROR,"VfSys.dll: MountDeviceDriver() - Could not find 'DevOpenDevice