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

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 : WarFsys.cpp
  16. // PURPOSE : Header file for all file systems used by the War daemons
  17. // PROGRAM : 
  18. // DATE : March 11 1997
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. //
  22. // Overview:
  23. // This dll provides the higher levels in the server with file system calls.
  24. // The file system support UNIX/VFsys file attributes, VFsys and Win95/NT 4 
  25. // soft-links and true multithread/multiprocess access.
  26. //
  27. // Only one file system dll might be running at one time pr. machine. All
  28. // daemons will share the same file system.
  29. //
  30. // Exports are done in the .def file.
  31. // 
  32. // REVISION HISTORY
  33. // 
  34. #include "stdafx.h"
  35. #include "WarSoftware.h"
  36. #ifdef _DEBUG
  37. #define new DEBUG_NEW
  38. #undef THIS_FILE
  39. static char THIS_FILE[] = __FILE__;
  40. #endif
  41. ////////////////////////////////////////////////////////////////////////////////////
  42. // File system.
  43. CLinkedList CUserFsys::m_ObjectList; 
  44. HINSTANCE CUserFsys::m_hFsys;
  45. HWND CUserFsys::m_Fsys_hWnd;
  46. CUserFsys::CUserFsys(LPVOID *pRef)
  47. {
  48. m_IsAdmin = 0;
  49. m_IsSystem = 0;
  50. m_CallbackPending = 0;
  51. m_IsZombie = 0;
  52. m_User = INVALID_USER_VALUE;
  53. m_Class = INVALID_USER_VALUE;
  54. m_hNTsec = NULL;
  55. m_pRef = pRef;
  56. m_CWD = "";
  57. }
  58. CUserFsys::~CUserFsys()
  59. {
  60. CWarFile *pFile;
  61. while(pFile = (CWarFile *)m_OpenFiles.FirstPtr())
  62. pFile->Destroy();
  63. if (m_pRef && (*m_pRef == this))
  64. *m_pRef = NULL;
  65. }
  66. BOOL CUserFsys::StartFileSystem(LPCSTR IniPath)
  67. {
  68. CString IniPathBuf;
  69. if (IniPath == NULL)
  70. {
  71. IniPathBuf = GetStartupPath();
  72. LPSTR p = IniPathBuf.GetBuffer(1);
  73. p = strrchr(p, '\');
  74. if (*p)
  75. *p = 0;
  76. IniPathBuf.ReleaseBuffer();
  77. IniPathBuf += "\Fsys\Fsys.ini";
  78. IniPath = IniPathBuf;
  79. }
  80. // Load the file system dll
  81. CString FsysName;
  82. GetPrivateProfileString("fsys", "driver", "VfSys.dll", FsysName.GetBuffer(MAX_PATH), MAX_PATH, IniPath);
  83. FsysName.ReleaseBuffer();
  84. CLog::GetLog()->LogMsg(LOGF_SYSTEM,"CUserFsys::StartFileSystem() - Starting file system '%s'", FsysName);
  85. m_hFsys = LoadLibrary(FsysName);
  86. if (m_hFsys == NULL)
  87. {
  88. CLog::GetLog()->LogMsg(LOGF_ERROR,"CUserFsys::StartFileSystem() - Failed to load file system '%s'. %s",
  89. FsysName, GetLastErrorText());
  90. return FALSE;
  91. }
  92. BOOL (*OpenFsys)(HWND *phWnd, LPCSTR IniFilePath);
  93. if ((OpenFsys = (BOOL (*)(HWND *, LPCSTR))GetProcAddress(m_hFsys, "?OpenFsys@@YAHPAPAUHWND__@@PBD@Z")) == NULL)
  94. {
  95. FreeLibrary(m_hFsys);
  96. m_hFsys = NULL;
  97. CLog::GetLog()->LogMsg(LOGF_ERROR,"CUserFsys::StartFileSystem() - Failed to resolve OpenFsys() in dll '%s'. %s",
  98. FsysName, GetLastErrorText());
  99. return FALSE;
  100. }
  101. if (!OpenFsys(&m_Fsys_hWnd, IniPath))
  102. {
  103. CLog::GetLog()->LogMsg(LOGF_ERROR,"CUserFsys::StartFileSystem() - OpenFsys() in dll '%s' failed. %s",
  104. FsysName, GetLastErrorText());
  105. FreeLibrary(m_hFsys);
  106. m_hFsys = NULL;
  107. }
  108. return TRUE;
  109. }
  110. void CUserFsys::CloseFileSystem()
  111. {
  112. if (m_hFsys)
  113. {
  114. SendMessage(m_Fsys_hWnd,FSM_QUIT,0,0);
  115. FreeLibrary((HMODULE)m_hFsys);
  116. m_hFsys = NULL;
  117. }
  118. }
  119. void CUserFsys::LogMsg(int flag, LPCSTR Format, ...)
  120. {
  121. if (!ShouldLog(CLog::GetLog(), flag))
  122. return;
  123. {
  124. CString cBuf;
  125. ASSERT(AfxIsValidString(Format, FALSE));
  126. cBuf.Format("%s: %s", "CUserFsys", Format);
  127. va_list argList;
  128. va_start(argList, Format);
  129. CLog::GetLog()->LogMsgV(flag, cBuf, argList);
  130. va_end(argList);
  131. }
  132. }
  133. BOOL CUserFsys::ProcessRequest(int Type, WPARAM wParam, LPARAM lParam)
  134. {
  135. if (m_CallbackPending)
  136. {
  137. LogMsg(LOGF_ERROR,"ProcessRequest() - There is alredy a request pending. Call aborted.");
  138. return FALSE;
  139. }
  140. if (!IsWindow(m_Fsys_hWnd))
  141. {
  142. LogMsg(LOGF_ERROR,"ProcessRequest() - Fsys_hWnd is invalid. Call aborted.");
  143. return FALSE;
  144. }
  145. if (!SetOnHold())
  146. {
  147. LogMsg(LOGF_WARNINGS,"ProcessRequest() - SetOnHold() returned FALSE. Call aborted.");
  148. return FALSE;
  149. }
  150. m_Output.Empty();
  151. if (!SendMessage(m_Fsys_hWnd, Type, wParam, lParam))
  152. {
  153. CheckForZombie();
  154. ReleaseHold();
  155. return FALSE;
  156. }
  157. m_CallbackPending = TRUE;
  158. m_LastReqType = Type;
  159. return TRUE;
  160. }
  161. void CUserFsys::CheckForZombie()
  162. {
  163. if (m_IsZombie)
  164. throw this;
  165. }
  166. BOOL CUserFsys::SetOnHold()
  167. {
  168. ASSERT(FALSE); // Must be overridden
  169. return FALSE;
  170. }
  171. void CUserFsys::ReleaseHold()
  172. {
  173. ASSERT(FALSE); // Must be overridden
  174. }
  175. // Entry point for results
  176. void CUserFsys::OnCallback(LPARAM lParam)
  177. {
  178. ASSERT(m_CallbackPending);
  179. m_CallbackPending = 0;
  180. if (m_IsZombie)
  181. {
  182. delete this;
  183. return;
  184. }
  185. ReleaseHold();
  186. if (m_FsysErrno)
  187. {
  188. int lastError = ERROR_GEN_FAILURE;
  189. switch(m_FsysErrno)
  190. {
  191. case FSE_PERMISSION_DENIED: lastError = ERROR_ACCESS_DENIED; break;
  192. case FSE_UNKNOWN_CALL: lastError = ERROR_INVALID_FUNCTION; break;
  193. case FSE_NO_ROOTPATH: lastError = ERROR_INVALID_DRIVE; break;
  194. case FSE_BAD_ROOTPATH: lastError = ERROR_INVALID_DRIVE; break;
  195. case FSE_BAD_PATH: lastError = ERROR_INVALID_DATA; break;
  196. case FSE_PATH_NOT_FOUND: lastError = ERROR_ACCESS_DENIED; break;
  197. }
  198. SetLastError(lastError);
  199. }
  200. switch(m_LastReqType)
  201. {
  202. case FSM_CREATEUSER:
  203. OnCreate(m_FsysErrno);
  204. break;
  205. case FSM_CREATEFILE:
  206. OnCreateFile(m_FsysErrno);
  207. break;
  208. case FSM_CHDIR:
  209. OnChdir(m_FsysErrno);
  210. break;
  211. case FSM_PRPCMDLINE:
  212. OnPrpCmdLine(m_FsysErrno);
  213. break;
  214. case FSM_LIST:
  215. OnList(m_FsysErrno);
  216. break;
  217. case FSM_WLST:
  218. OnWlist(m_FsysErrno);
  219. break;
  220. case FSM_CHMOD:
  221. OnChmod(m_FsysErrno);
  222. break;
  223. case FSM_FSYSSTAT:
  224. OnFsysStat(m_FsysErrno);
  225. break;
  226. case FSM_CREATEDIR:
  227. OnCreateDirectory(m_FsysErrno);
  228. break;
  229. case FSM_DELEDIR:
  230. OnDeleteDirectory(m_FsysErrno);
  231. break;
  232. case FSM_DELEFILE:
  233. OnDeleteFile(m_FsysErrno);
  234. break;
  235. case FSM_DELE:
  236. OnDeleteGeneric(m_FsysErrno);
  237. break;
  238. case FSM_LINK:
  239. OnLinkFile(m_FsysErrno);
  240. break;
  241. case FSM_MOVE:
  242. OnMoveFile(m_FsysErrno);
  243. break;
  244. case FSM_STAT:
  245. OnStat(m_FsysErrno);
  246. break;
  247. }
  248. }
  249. // Try to log a user on to the file system
  250. // Roots in the format <VfSysPath>,<UserPath>
  251. BOOL CUserFsys::Create(
  252.  LPCSTR Roots, 
  253.  LPCSTR Home, 
  254.  USER User, 
  255.  USER Class, 
  256.  LPCSTR Name, 
  257.  DWORD Umask, 
  258.  USER AssignTo)
  259. {
  260. m_Name = Name ? Name : "uninitialized-name";
  261. m_User = User;
  262. m_Class = Class;
  263. m_Home = Home;
  264. m_FsysPath1 = Roots;
  265. m_AssignTo = AssignTo;
  266. m_Umask = Umask;
  267. return ProcessRequest(FSM_CREATEUSER, (WPARAM)this, 0);
  268. }
  269. // Log a user out from the file system. Called by the user.
  270. void CUserFsys::Logout()
  271. {
  272. if (m_CallbackPending)
  273. {
  274. m_IsZombie = TRUE;
  275. return;
  276. }
  277. delete this;
  278. }
  279. BOOL CUserFsys::OnCreate(int nErrorCode)
  280. {
  281. return TRUE;
  282. }
  283. BOOL CUserFsys::OnChdir(int nErrorCode)
  284. {
  285. return TRUE;
  286. }
  287. BOOL CUserFsys::OnPrpCmdLine(int nErrorCode)
  288. {
  289. return TRUE;
  290. }
  291. BOOL CUserFsys::OnList(int nErrorCode)
  292. {
  293. return TRUE;
  294. }
  295. BOOL CUserFsys::OnWlist(int nErrorCode)
  296. {
  297. return TRUE;
  298. }
  299. BOOL CUserFsys::OnChmod(int nErrorCode)
  300. {
  301. return TRUE;
  302. }
  303. BOOL CUserFsys::OnCreateFile(int nErrorCode)
  304. {
  305. if (m_CreateHdr.pFile->m_IsZombie || nErrorCode)
  306. {
  307. m_CreateHdr.pFile->m_ProtectFromDelete++; // Prevent callback to destroy object
  308. try
  309. {
  310. if (!m_CreateHdr.pFile->m_IsZombie)
  311. m_CreateHdr.Callback(m_CreateHdr.pFile ,FALSE , m_CreateHdr.lParam);
  312. }
  313. catch(...)
  314. {
  315. CLog::GetLog()->LogMsg(LOGF_WARNINGS,"CUserFsys::OnCreateFile(%d) - Caught unknown exception.", nErrorCode);
  316. return FALSE;
  317. }
  318. m_CreateHdr.pFile->m_ProtectFromDelete--;
  319. m_CreateHdr.pFile->Destroy();
  320. return FALSE;
  321. }
  322. m_CreateHdr.Callback(m_CreateHdr.pFile ,TRUE , m_CreateHdr.lParam);
  323. return TRUE;
  324. }
  325. BOOL CUserFsys::OnFsysStat(int nErrorCode)
  326. {
  327. return TRUE;
  328. }
  329. BOOL CUserFsys::OnCreateDirectory(int nErrorCode)
  330. {
  331. return TRUE;
  332. }
  333. BOOL CUserFsys::OnDeleteDirectory(int nErrorCode)
  334. {
  335. return TRUE;
  336. }
  337. BOOL CUserFsys::OnDeleteFile(int nErrorCode)
  338. {
  339. return TRUE;
  340. }
  341. BOOL CUserFsys::OnDeleteGeneric(int nErrorCode)
  342. {
  343. return TRUE;
  344. }
  345. BOOL CUserFsys::OnLinkFile(int nErrorCode)
  346. {
  347. return TRUE;
  348. }
  349. BOOL CUserFsys::OnMoveFile(int nErrorCode)
  350. {
  351. return TRUE;
  352. }
  353. BOOL CUserFsys::OnStat(int nErrorCode)
  354. {
  355. return TRUE;
  356. }
  357. BOOL CUserFsys::BldFileInfoList(CFileInfoList& FileList, LPCSTR Path, BOOL ListDir)
  358. {
  359. return FALSE;
  360. }
  361. BOOL CUserFsys::ChDir(LPCSTR Path)
  362. {
  363. m_FsysPath1 = Path;
  364. return ProcessRequest(FSM_CHDIR, (WPARAM)this, 0);
  365. }
  366. BOOL CUserFsys::ChMod(CCmdArgs& Args)
  367. {
  368. m_Args = Args;
  369. return ProcessRequest(FSM_CHMOD, (WPARAM)this, 0);
  370. }
  371. BOOL CUserFsys::CreateFile(LPCSTR Path, CREATE_HDR *pHdr)
  372. {
  373. if (pHdr->HdrLen != sizeof(CREATE_HDR))
  374. {
  375. LogMsg(LOGF_ERROR,"CUserFsys::CreateFile() - CREATE_HDR length mismatch");
  376. ASSERT(FALSE);
  377. return FALSE;
  378. }
  379. m_FsysPath1 = Path;
  380. m_CreateHdr = *pHdr;
  381. return ProcessRequest(FSM_CREATEFILE, (WPARAM)this, 0);
  382. }
  383. BOOL CUserFsys::FsysStat()
  384. {
  385. return ProcessRequest(FSM_FSYSSTAT, (WPARAM)this, 0);
  386. }
  387. BOOL CUserFsys::CreateDirectory(LPCSTR FsysPath)
  388. {
  389. m_FsysPath1 = FsysPath;
  390. return ProcessRequest(FSM_CREATEDIR, (WPARAM)this, 0);
  391. }
  392. BOOL CUserFsys::DeleteDirectory(LPCSTR FsysPath)
  393. {
  394. m_FsysPath1 = FsysPath;
  395. return ProcessRequest(FSM_DELEDIR, (WPARAM)this, 0);
  396. }
  397. BOOL CUserFsys::DeleteFile(LPCSTR FsysPath)
  398. {
  399. m_FsysPath1 = FsysPath;
  400. return ProcessRequest(FSM_DELEFILE, (WPARAM)this, 0);
  401. }
  402. BOOL CUserFsys::DeleteGeneric(LPCSTR FsysPath)
  403. {
  404. m_FsysPath1 = FsysPath;
  405. return ProcessRequest(FSM_DELE, (WPARAM)this, 0);
  406. }
  407. BOOL CUserFsys::LinkFile(LPCSTR FromPath, LPCSTR ToPath)
  408. {
  409. m_FsysPath1 = FromPath;
  410. m_FsysPath2 = ToPath;
  411. return ProcessRequest(FSM_LINK, (WPARAM)this, 0);
  412. }
  413. // Move and rename
  414. BOOL CUserFsys::MoveFile(LPCSTR FromPath, LPCSTR ToPath)
  415. {
  416. m_FsysPath1 = FromPath;
  417. m_FsysPath2 = ToPath;
  418. return ProcessRequest(FSM_MOVE, (WPARAM)this, 0);
  419. }
  420. BOOL CUserFsys::Stat(LPCSTR FsysPath)
  421. {
  422. m_FsysPath1 = FsysPath;
  423. return ProcessRequest(FSM_STAT, (WPARAM)this, 0);
  424. }
  425. ///////////////////////////////////////////////////////////////////////////
  426. // CFileInfo - support class for Find*File()
  427. CFileInfo::CFileInfo()
  428. {
  429. m_Comment.Empty();
  430. m_Hide = FALSE;
  431. m_pMoreUsers = NULL;
  432. m_SpecialNewFilePerms = 0;
  433. }
  434. CFileInfo::~CFileInfo()
  435. {
  436. if (m_pMoreUsers)
  437. delete m_pMoreUsers;
  438. }
  439. CString CFileInfo::MakeFileNameASCII()
  440. {
  441. CString cBuf = FileName();
  442. LPSTR p = cBuf.GetBuffer(1);
  443. while(*p)
  444. {
  445. if (!isprint(*p))
  446. *p = '?';
  447. }
  448. cBuf.ReleaseBuffer();
  449. return cBuf;
  450. }
  451. BOOL CFileInfo::Hide(int State)
  452. {
  453. if ((State == FALSE) || (State == TRUE))
  454. m_Hide = State;
  455. return m_Hide;
  456. }
  457. int CFileInfo::GetInode()
  458. {
  459. return (int)this;
  460. }
  461. int CFileInfo::GetLinks()
  462. {
  463. return m_Links;
  464. }
  465. ///////////////////////////////////////////////////////////////////////////
  466. // CFileInfoList - Representation of files, typically in one directory.
  467. CFileInfoList::CFileInfoList()
  468. {
  469. m_MaxCols = 0;
  470. m_Prev = NULL;
  471. }
  472. CFileInfoList::~CFileInfoList()
  473. {
  474. // Delete the nodes
  475. CFileInfo *Info;
  476. while(Info = (CFileInfo *)m_List.GetAndDeleteFirst())
  477. {
  478. ASSERT(AfxIsValidAddress(Info, sizeof(CFileInfo)));
  479. delete Info;
  480. }
  481. }
  482. void CFileInfoList::Add(CFileInfo *Node)
  483. {
  484. ASSERT(AfxIsValidAddress(Node,sizeof(CFileInfo)));
  485. int Len = strlen(Node->FileName());
  486. m_MaxCols = max(Len, m_MaxCols);
  487. m_List.AddLast((LPVOID)Node);
  488. }
  489. CFileInfo *CFileInfoList::GetNext(CFileInfo *Current)
  490. {
  491. if (Current)
  492. {
  493. ASSERT(AfxIsValidAddress(Current,sizeof(CFileInfo)));
  494. if (m_Prev && (m_List.Ptr(m_Prev) == Current))
  495. m_Prev = m_List.Next(m_Prev);
  496. else
  497. {
  498. if (m_Prev = m_List.FindPtr(Current))
  499. m_Prev = m_List.Next(m_Prev);
  500. }
  501. }
  502. else
  503. m_Prev = m_List.First();
  504. return m_Prev ? (CFileInfo *)m_List.Ptr(m_Prev) : NULL;
  505. }
  506. void CFileInfoList::Sort(int (*SortFunc)(const void *, const void *))
  507. {
  508. m_List.Sort(SortFunc);
  509. }
  510. // List in War's own listing format.
  511. // "Filename" size date flags owner class "comment"
  512. // Date is a 64 bit hex number, giving the precision of FILETIME
  513. // Size is a 64 bit hex number.
  514. // Flags is a 32 bit hex number 
  515. // " characters in the string is preceeded with  and \ represents
  516. // a single backslash.
  517. BOOL CFileInfoList::ListRaw(CString& cReturnBuf, DWORD Flags)
  518. {
  519. CFileInfo *Info;
  520. CString cBuf;
  521. FILETIME *ft;
  522. LPCSTR FileName;
  523. cReturnBuf.Empty();
  524. __int64 MyDate;
  525. __int64 MySize;
  526. for(Info = NULL; Info = GetNext(Info);)
  527. {
  528. cBuf.Empty();
  529. char buf[64];
  530. FileName = Info->FileName();
  531. ASSERT(AfxIsValidString(FileName));
  532. ft = Info->GetModifyTime();
  533. MyDate = ft->dwHighDateTime;
  534. MyDate = MyDate << 32;
  535. MyDate |= ft->dwLowDateTime;
  536. MySize = Info->GetFileLength();
  537. cBuf += '"';
  538. cBuf += FileName;
  539. cBuf += "" ";
  540. *buf = 0;
  541. sprintf(buf, "%I64d ", MySize);
  542. cBuf += buf;
  543. *buf = 0;
  544. sprintf(buf, "%I64x ", MyDate);
  545. cBuf += buf;
  546. *buf = 0;
  547. sprintf(buf, "%X ", Info->m_Flags);
  548. cBuf += buf;
  549. *buf = 0;
  550. sprintf(buf, "%X ", Info->m_User);
  551. cBuf += buf;
  552. *buf = 0;
  553. sprintf(buf, "%X ", Info->m_Group);
  554. cBuf += buf;
  555. cBuf += '"';
  556. cBuf += Info->m_Comment;
  557. cBuf += ""rn";
  558. // CString does not support __I64
  559. //cBuf.Format(""%s" %I64x %I64x %X %X %X "%s"n",
  560. // FileName, MySize, MyDate, Info->m_Flags, Info->m_User, Info->m_Group,
  561. // Info->m_Comment);
  562. cReturnBuf += cBuf;
  563. }
  564. return TRUE;
  565. }
  566. ////////////////////////////////////////////////////////////////////////////////
  567. // CWarFile
  568. CWarFile::CWarFile(CUserFsys *pFsys)
  569. {
  570. m_hFile = INVALID_HANDLE_VALUE;
  571. m_DEV = NULL;
  572. m_Path = "";
  573. m_pFsys = pFsys;
  574. m_CallbackPending = FALSE;
  575. m_IsZombie = FALSE;
  576. m_ProtectFromDelete = FALSE;
  577. }
  578. CWarFile::~CWarFile()
  579. {
  580. if (m_hFile != INVALID_HANDLE_VALUE)
  581. Close();
  582. CLog::GetLog()->LogMsg(LOGF_DEBUG,"CWarFile::~CWarFile() - %x killed.", (int)this);
  583. }
  584. void CWarFile::Close()
  585. {
  586. CLog::GetLog()->LogMsg(LOGF_DEBUG,"CWarFile::Close() - Closing file");
  587. if (IsOpen())
  588. {
  589. if (m_pFsys)
  590. {
  591. // Tell the file system that we are trough..
  592. // This call has no callback.
  593. SendMessage(m_pFsys->GetFsys_hWnd(), FSM_CLOSEFILE, NULL,*(WPARAM *)&m_smNode);
  594. }
  595. if (m_DEV)
  596. m_DEV->CloseHandle(m_hFile);
  597. else
  598. CloseHandle(m_hFile);
  599. }
  600. m_hFile = INVALID_HANDLE_VALUE;
  601. if (m_pFsys)
  602. {
  603. CLog::GetLog()->LogMsg(LOGF_DEBUG,"CWarFile::Close() - Removed %x from m_OpenFiles.", (int)this);
  604. m_pFsys->m_OpenFiles.DeletePtr((LPVOID)this);
  605. }
  606. }
  607. void CWarFile::Destroy()
  608. {
  609. try
  610. {
  611. Close();
  612. ASSERT(m_CallbackPending == FALSE);
  613. if (m_ProtectFromDelete || (m_pFsys && m_pFsys->m_CallbackPending))
  614. m_IsZombie = TRUE;
  615. else
  616. delete this;
  617. }
  618. catch(...)
  619. {
  620. CLog::GetLog()->LogMsg(LOGF_WARNINGS,"CWarFile::Destroy() - caught unknown exception.");
  621. return;
  622. }
  623. }
  624. DWORD CWarFile::GetFileAttributes()
  625. {
  626. ASSERT(FALSE);
  627. return 0;
  628. }
  629. UINT CWarFile::GetDriveType()
  630. {
  631. ASSERT(FALSE);
  632. return 0;
  633. };
  634. FLEN CWarFile::GetFileSize()
  635. {
  636. FLEN Rval = 0;
  637. int err = 0;
  638. if (m_DEV)
  639. Rval = m_DEV->GetFileSize(m_hFile);
  640. else
  641. {
  642. DWORD LoDWord, HiDWord;
  643. LoDWord = ::GetFileSize(m_hFile, &HiDWord);
  644. if ((LoDWord == 0xFFFFFFFF) && ((err = GetLastError()) != NO_ERROR))
  645. {
  646. Rval = INVALID_FLEN_VALUE;
  647. SetLastError(err);
  648. }
  649. Rval = (FLEN)((FLEN)HiDWord * (FLEN)MAXDWORD) + (FLEN)LoDWord;
  650. }
  651. return Rval;
  652. }
  653. FLEN CWarFile::Seek(FLEN lsOfs, UINT nFrom )
  654. {
  655. FLEN Rval;
  656. if (m_DEV)
  657. Rval = m_DEV->Seek(m_hFile, lsOfs, nFrom);
  658. else
  659. {
  660. DWORD LoDWord, HiDWord;
  661. LoDWord = LODWORD(lsOfs);
  662. HiDWord = HIDWORD(lsOfs);
  663. LoDWord = SetFilePointer(m_hFile, LoDWord, (PLONG)&HiDWord, nFrom);
  664. if ((LoDWord == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
  665. return INVALID_FLEN_VALUE;
  666. Rval = (FLEN)((FLEN)HiDWord * (FLEN)MAXDWORD) + (FLEN)LoDWord;
  667. }
  668. return Rval;
  669. }
  670. BOOL CWarFile::Create(
  671.     LPCTSTR lpFileName, // pointer to name of the file 
  672.     DWORD dwDesiredAccess, // access (read-write) mode 
  673.     DWORD dwShareMode, // share mode 
  674.     LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor 
  675.     DWORD dwCreationDistribution, // how to create 
  676.     DWORD dwFlagsAndAttributes, // file attributes 
  677.     HANDLE hTemplateFile,  // handle to file with attributes to copy  
  678. DWORD Flags,
  679. LPARAM lParam, // Callback data
  680. void (*Callback)(CWarFile *, BOOL, LPARAM) // Callback function
  681.    )
  682. {
  683. BOOL Rval = FALSE;
  684. if (m_hFile != INVALID_HANDLE_VALUE)
  685. {
  686. ASSERT(FALSE); // File is open!
  687. SetLastError(ERROR_ALREADY_ASSIGNED);
  688. return FALSE;
  689. }
  690. // If this is a DOS style file, use the native IO calls
  691. if (lpFileName && isalpha(lpFileName[0]) && (lpFileName[1] == ':'))
  692. m_pFsys = NULL;
  693. m_DEV = NULL;
  694. m_Path = lpFileName;
  695. if (m_pFsys)
  696. {
  697. CREATE_HDR CreateHdr;
  698. CreateHdr.HdrLen = sizeof(CREATE_HDR);
  699. CreateHdr.dwDesiredAccess = dwDesiredAccess;
  700. CreateHdr.dwShareMode = dwShareMode;
  701. CreateHdr.lpSecurityAttributes = lpSecurityAttributes;
  702. CreateHdr.dwCreationDistribution = dwCreationDistribution;
  703. CreateHdr.dwFlagsAndAttributes = dwFlagsAndAttributes;
  704. CreateHdr.hTemplateFile = hTemplateFile;
  705. CreateHdr.Flags = Flags;
  706. CreateHdr.lParam = lParam;
  707. CreateHdr.Callback = Callback;
  708. CreateHdr.pFile = this;
  709. m_hFile = (HANDLE) HANDLE_PENDING;
  710. m_pFsys->CreateFile(lpFileName, &CreateHdr);
  711. }
  712. else
  713. {
  714. // Look for special flags...
  715. if (!ProcessFlagsLocal(Flags))
  716. return FALSE;
  717. m_hFile = ::CreateFile(
  718. lpFileName,
  719. dwDesiredAccess,
  720. dwShareMode,
  721. lpSecurityAttributes,
  722. dwCreationDistribution,
  723. dwFlagsAndAttributes,
  724. hTemplateFile);
  725. }
  726. if (m_pFsys && (m_hFile != INVALID_HANDLE_VALUE))
  727. {
  728. CLog::GetLog()->LogMsg(LOGF_DEBUG,"CWarFile::Create() - Added %x to m_OpenFiles.", (int)this);
  729. m_pFsys->m_OpenFiles.AddFirst((LPVOID)this);
  730. }
  731. return m_hFile != INVALID_HANDLE_VALUE;
  732. }
  733. BOOL CWarFile::ProcessFlagsLocal(DWORD Flags)
  734. {
  735. if (Flags & UNIQUE_NAME)
  736. {
  737. // Unique file name
  738. CLog::GetLog()->LogMsg(LOGF_ERROR,"CWarFile::ProcessFlagsLocal(%s) - UNIQUE_NAME is illegal without fsys",
  739. m_Path);
  740. return FALSE;
  741. }
  742. return TRUE;
  743. }
  744. BOOL CWarFile::Read(
  745.     LPVOID lpBuffer, // address of buffer that receives data  
  746.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  747.     LPDWORD lpNumberOfBytesRead, // address of number of bytes read 
  748.     LPOVERLAPPED lpOverlapped  // address of structure for data 
  749.    )
  750. {
  751. if (m_DEV)
  752. return m_DEV->ReadFile(m_hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
  753. return ::ReadFile(m_hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
  754. }
  755. BOOL CWarFile::ReadEx(
  756.     LPVOID lpBuffer, // address of buffer 
  757.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  758.     LPOVERLAPPED lpOverlapped, // address of offset 
  759.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // address of completion routine 
  760.    )  
  761. {
  762. if (m_DEV)
  763. return m_DEV->ReadFileEx(m_hFile, lpBuffer, nNumberOfBytesToRead, lpOverlapped, lpCompletionRoutine);
  764. return ::ReadFileEx(m_hFile, lpBuffer, nNumberOfBytesToRead, lpOverlapped, lpCompletionRoutine);
  765. }
  766. BOOL CWarFile::Write(
  767.     LPCVOID lpBuffer, // pointer to data to write to file 
  768.     DWORD nNumberOfBytesToWrite, // number of bytes to write 
  769.     LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written 
  770.     LPOVERLAPPED lpOverlapped  // pointer to structure needed for overlapped I/O
  771.    )
  772. {
  773. if (m_DEV)
  774. return m_DEV->WriteFile(m_hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
  775. return ::WriteFile(m_hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
  776. }
  777. BOOL CWarFile::WriteEx(
  778.     LPCVOID lpBuffer,  // pointer to input buffer
  779.     DWORD nNumberOfBytesToWrite,  // number of bytes to write
  780.     LPOVERLAPPED lpOverlapped,  // pointer to async. i/o data
  781.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // ptr. to completion routine
  782.    )
  783. {
  784. if (m_DEV)
  785. return m_DEV->WriteFileEx(m_hFile, lpBuffer, nNumberOfBytesToWrite, lpOverlapped, lpCompletionRoutine);
  786. return ::WriteFileEx(m_hFile, lpBuffer, nNumberOfBytesToWrite, lpOverlapped, lpCompletionRoutine);
  787. }