| 802 | } |
| 803 | |
| 804 | static SC::Result fillWindowsFileStat(HANDLE hFile, SC::FileSystemStat& fileStat) |
| 805 | { |
| 806 | fileStat = {}; |
| 807 | |
| 808 | BY_HANDLE_FILE_INFORMATION handleInfo; |
| 809 | SC_TRY_MSG(::GetFileInformationByHandle(hFile, &handleInfo) != FALSE, "stat: Failed to get file information"); |
| 810 | FILE_STANDARD_INFO standardInfo = {}; |
| 811 | const bool hasStandardInfo = |
| 812 | ::GetFileInformationByHandleEx(hFile, FileStandardInfo, &standardInfo, sizeof(standardInfo)) != FALSE; |
| 813 | |
| 814 | FILE_ATTRIBUTE_TAG_INFO tagInfo = {}; |
| 815 | if (::GetFileInformationByHandleEx(hFile, FileAttributeTagInfo, &tagInfo, sizeof(tagInfo)) == FALSE) |
| 816 | { |
| 817 | tagInfo.FileAttributes = handleInfo.dwFileAttributes; |
| 818 | tagInfo.ReparseTag = 0; |
| 819 | } |
| 820 | |
| 821 | fileStat.entryType = windowsEntryTypeFromAttributes(handleInfo.dwFileAttributes, tagInfo.ReparseTag); |
| 822 | fileStat.creationTime = windowsFileTimeToTimeMs(handleInfo.ftCreationTime); |
| 823 | fileStat.accessedTime = windowsFileTimeToTimeMs(handleInfo.ftLastAccessTime); |
| 824 | fileStat.modifiedTime = windowsFileTimeToTimeMs(handleInfo.ftLastWriteTime); |
| 825 | fileStat.fileSize = |
| 826 | static_cast<SC::size_t>((static_cast<SC::uint64_t>(handleInfo.nFileSizeHigh) << 32) | handleInfo.nFileSizeLow); |
| 827 | fileStat.hardLinkCount = hasStandardInfo ? static_cast<SC::size_t>(standardInfo.NumberOfLinks) |
| 828 | : static_cast<SC::size_t>(handleInfo.nNumberOfLinks); |
| 829 | fileStat.windows.attributes = handleInfo.dwFileAttributes; |
| 830 | fileStat.windows.reparseTag = tagInfo.ReparseTag; |
| 831 | fileStat.windows.volumeSerialNumber = handleInfo.dwVolumeSerialNumber; |
| 832 | fileStat.windows.fileIndex = |
| 833 | (static_cast<SC::uint64_t>(handleInfo.nFileIndexHigh) << 32) | handleInfo.nFileIndexLow; |
| 834 | return SC::Result(true); |
| 835 | } |
| 836 | |
| 837 | static SC::Result windowsStat(SC::StringSpan path, bool followLinks, SC::FileSystemStat& fileStat) |
| 838 | { |
no test coverage detected