file_info.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "file_info.h"
  2. #include "file.h"
  3. #include "general.h"
  4. #include "debug.h"
  5. #include "inode.h"
  6. void MxfsFileTimeFromTimeT(LPFILETIME FileTime, time_t t)
  7. {
  8. LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000ull;
  9. FileTime->dwLowDateTime = (DWORD)ll;
  10. FileTime->dwHighDateTime = ll >> 32;
  11. }
  12. time_t MxfsTimeTFromFileTime(CONST FILETIME *FileTime)
  13. {
  14. ULARGE_INTEGER ull;
  15. ull.LowPart = FileTime->dwLowDateTime;
  16. ull.HighPart = FileTime->dwHighDateTime;
  17. return ull.QuadPart / 10000000ULL - 11644473600ULL;
  18. }
  19. int DOKAN_CALLBACK MxfsGetFileInformation(
  20. LPCWSTR FileName,
  21. LPBY_HANDLE_FILE_INFORMATION Buffer,
  22. PDOKAN_FILE_INFO FileInfo)
  23. {
  24. TRACE("%ls %p", FileName, FileInfo);
  25. MINIX_FS *FileSys = (MINIX_FS*)(LONG_PTR)FileInfo->DokanOptions->GlobalContext;
  26. FILE_CTX *FileCtx = (FILE_CTX*)(LONG_PTR)FileInfo->Context;
  27. ASSERT(FileCtx);
  28. minix_inode Info;
  29. MxfsReadInode(FileSys, FileCtx->Index, &Info);
  30. ZeroMemory(Buffer, sizeof(*Buffer));
  31. Buffer->dwFileAttributes = FileInfo->IsDirectory ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
  32. MxfsFileTimeFromTimeT(&Buffer->ftCreationTime, Info.d2_mtime);
  33. MxfsFileTimeFromTimeT(&Buffer->ftLastAccessTime, Info.d2_atime);
  34. MxfsFileTimeFromTimeT(&Buffer->ftLastWriteTime, Info.d2_mtime);
  35. Buffer->dwVolumeSerialNumber = MINIX_VOLUME_ID;
  36. Buffer->nFileSizeLow = Info.d2_size;
  37. Buffer->nNumberOfLinks = 1;
  38. Buffer->nFileIndexLow = FileCtx->Index;
  39. return 0;
  40. }
  41. int DOKAN_CALLBACK MxfsSetFileTime(
  42. LPCWSTR FileName,
  43. CONST FILETIME *CreationTime,
  44. CONST FILETIME *LastAccessTime,
  45. CONST FILETIME *LastWriteTime,
  46. PDOKAN_FILE_INFO FileInfo)
  47. {
  48. TRACE("%ls", FileName);
  49. MINIX_FS *FileSys = (MINIX_FS*)(ULONG_PTR)FileInfo->DokanOptions->GlobalContext;
  50. FILE_CTX *FileCtx = (FILE_CTX*)(ULONG_PTR)FileInfo->Context;
  51. ASSERT(FileCtx);
  52. minix_inode Info;
  53. int Result = MxfsReadInode(FileSys, FileCtx->Index, &Info);
  54. if(Result < 0)
  55. return Result;
  56. if(LastAccessTime && (LastAccessTime->dwHighDateTime || LastAccessTime->dwLowDateTime))
  57. {
  58. if(LastAccessTime->dwHighDateTime == 0xFFFFFFFF && LastAccessTime->dwLowDateTime == 0xFFFFFFFF)
  59. WARN("TODO: Support -1!\n"); // preserve access time
  60. else
  61. Info.d2_atime = MxfsTimeTFromFileTime(LastAccessTime);
  62. }
  63. if(LastWriteTime && (LastWriteTime->dwHighDateTime || LastWriteTime->dwLowDateTime))
  64. {
  65. if(LastWriteTime->dwHighDateTime == 0xFFFFFFFF && LastWriteTime->dwLowDateTime == 0xFFFFFFFF)
  66. WARN("TODO: Support -1!\n"); // preserve write time
  67. else
  68. Info.d2_mtime = MxfsTimeTFromFileTime(LastWriteTime);
  69. }
  70. return MxfsWriteInode(FileSys, FileCtx->Index, &Info);
  71. }
  72. void MxfsFillFindData(WIN32_FIND_DATAW *pFindData, const minix_dir_entry *pDirEntry, const minix_inode *pInfo)
  73. {
  74. /* Attributes */
  75. if(pInfo->d2_mode & I_DIRECTORY)
  76. pFindData->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
  77. else
  78. pFindData->dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
  79. /* Times */
  80. MxfsFileTimeFromTimeT(&pFindData->ftCreationTime, pInfo->d2_mtime);
  81. MxfsFileTimeFromTimeT(&pFindData->ftLastAccessTime, pInfo->d2_atime);
  82. MxfsFileTimeFromTimeT(&pFindData->ftLastWriteTime, pInfo->d2_mtime);
  83. /* Size */
  84. pFindData->nFileSizeLow = pInfo->d2_size;
  85. /* Name */
  86. int NameLen = strnlen(pDirEntry->name, MAX_NAME_LEN);
  87. MultiByteToWideChar(CP_ACP, 0, pDirEntry->name, NameLen, pFindData->cFileName, COUNTOF(pFindData->cFileName));
  88. pFindData->cFileName[min(NameLen, COUNTOF(pFindData->cFileName))] = 0;
  89. wcscpy_s(pFindData->cAlternateFileName, sizeof(pFindData->cAlternateFileName), pFindData->cFileName);
  90. }