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

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 : Win95Links.cpp
  16. // PURPOSE : War Daemon Virtual File System special plugin
  17. // PROGRAM : 
  18. // DATE : April 8 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 "WarDaemon.h"
  29. #include "WarFsys.h"
  30. #include "VfFSys.h"
  31. #include "UnixFsysTypes.h"
  32. #include "FsysSecurity.h"
  33. BOOL AFXAPI AfxResolveShortcut(CWnd* pWnd, LPCTSTR pszShortcutFile,
  34. LPTSTR pszPath, int cchPath);
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. static AFX_EXTENSION_MODULE Win95LinksDLL = { NULL, NULL };
  41. extern "C" int APIENTRY
  42. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  43. {
  44. // Remove this if you use lpReserved
  45. UNREFERENCED_PARAMETER(lpReserved);
  46. if (dwReason == DLL_PROCESS_ATTACH)
  47. {
  48. TRACE0("WIN95LINKS.DLL Initializing!n");
  49. // Extension DLL one-time initialization
  50. if (!AfxInitExtensionModule(Win95LinksDLL, hInstance))
  51. return 0;
  52. // Insert this DLL into the resource chain
  53. // NOTE: If this Extension DLL is being implicitly linked to by
  54. //  an MFC Regular DLL (such as an ActiveX Control)
  55. //  instead of an MFC application, then you will want to
  56. //  remove this line from DllMain and put it in a separate
  57. //  function exported from this Extension DLL.  The Regular DLL
  58. //  that uses this Extension DLL should then explicitly call that
  59. //  function to initialize this Extension DLL.  Otherwise,
  60. //  the CDynLinkLibrary object will not be attached to the
  61. //  Regular DLL's resource chain, and serious problems will
  62. //  result.
  63. new CDynLinkLibrary(Win95LinksDLL);
  64. }
  65. else if (dwReason == DLL_PROCESS_DETACH)
  66. {
  67. TRACE0("WIN95LINKS.DLL Terminating!n");
  68. // Terminate the library before destructors are called
  69. AfxTermExtensionModule(Win95LinksDLL);
  70. }
  71. return 1;   // ok
  72. }
  73. // Called from ScanDir() each time a file that math the plugin's 'pattern'
  74. // is detected.
  75. // This function is required and must be exported in the .def file
  76. DWORD OnFoundFile(
  77. SMEM smDir, // Parent directory
  78. CFileInfo& Info, // File info from device
  79. SMEM smNode, // Node, 0 if new file
  80. CString& RealName, //File system name
  81. CString& VisualName, // The name the user will see
  82. CString& LinkTo, // Link to
  83. LPCSTR FsysPath, // File system path currently being scanned
  84. FILE_SYSTEM *pFsys, // Current file system
  85. CDeviceDriver *pDev // Current device
  86. )
  87. {
  88. CString cBuf = RealName;
  89. LPSTR p = cBuf.GetBuffer(1);
  90. // Check if this is a .lnk file
  91. if (p = strrchr(p,'.'))
  92. {
  93. if (!stricmp(p,".lnk"))
  94. {
  95. *p = 0;
  96. cBuf.ReleaseBuffer();
  97. VisualName = cBuf;
  98. SMEM smFsys;
  99. CString FsysPath = ResolveFsysPath(smDir, smFsys);
  100. FsysPath += '/';
  101. FsysPath += RealName;
  102. // Convert FsysPath to a DOS path
  103. p = FsysPath.GetBuffer(1);
  104. while(*p)
  105. {
  106. if (*p == '/')
  107. *p = '\';
  108. ++p;
  109. }
  110. FsysPath.ReleaseBuffer();
  111. // Get the Win95 shortcut
  112. if (AfxResolveShortcut(NULL, FsysPath, cBuf.GetBuffer(MAX_PATH), MAX_PATH))
  113. {
  114. // At this time we don't know if the file system containing the shortcut
  115. // actually exist. We therefore need to store it with it's original name
  116. // and leave to VfSys to resolve it on demand.
  117. cBuf.ReleaseBuffer();
  118. LinkTo = cBuf;
  119. // Check if the destination is a directory
  120. // Use native IO calls, we don't know what driver to use...
  121. DWORD Flags = GetFileAttributes(LinkTo);
  122. if ((Flags != 0xFFFFFFFF) && (Flags & FILE_ATTRIBUTE_DIRECTORY))
  123. Info.m_Flags |= NODE_DIR;
  124. Info.m_Flags |= NODE_LINK;
  125. return LINK_PRESENT_NOT_RESOLVED;
  126. }
  127. }
  128. }
  129. return 0; // Neutral 
  130. }