From 26e5c1aecfeb1bd9aaf196a58012535826945da5 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 1 Nov 2015 18:17:51 -0800 Subject: [PATCH] windows.kernel32, io.files.windows: Add support for listing alternate data streams, e.g. file paths like foo.txt:Zone.Identifier. --- basis/io/files/windows/windows.factor | 37 +++++++++++++++++++++++--- basis/windows/kernel32/kernel32.factor | 22 +++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/basis/io/files/windows/windows.factor b/basis/io/files/windows/windows.factor index f9b419525c..81e0274ca9 100755 --- a/basis/io/files/windows/windows.factor +++ b/basis/io/files/windows/windows.factor @@ -6,9 +6,9 @@ combinators.short-circuit continuations destructors environment io io.backend io.binary io.buffers io.files io.files.private io.files.types io.pathnames io.ports io.streams.c io.streams.null io.timeouts kernel libc literals locals math math.bitwise namespaces -sequences specialized-arrays system threads tr windows windows.errors -windows.handles windows.kernel32 windows.shell32 windows.time -windows.types windows.winsock ; +sequences specialized-arrays system threads tr vectors windows +windows.errors windows.handles windows.kernel32 windows.shell32 +windows.time windows.types windows.winsock ; SPECIALIZED-ARRAY: ushort IN: io.files.windows @@ -381,3 +381,34 @@ M: windows home [ "USERPROFILE" os-env ] [ my-documents ] } 0|| ; + +: STREAM_DATA>out ( WIN32_FIND_STREAM_DATA -- pair/f ) + [ cStreamName>> alien>native-string ] + [ StreamSize>> ] bi 2array ; + +: file-streams-rest ( streams handle -- streams ) + WIN32_FIND_STREAM_DATA + [ FindNextStream ] 2keep + rot zero? [ + GetLastError ERROR_HANDLE_EOF = [ win32-error ] unless + 2drop + ] [ + pick push file-streams-rest + ] if ; + +: file-streams ( path -- streams ) + FindStreamInfoStandard + WIN32_FIND_STREAM_DATA + 0 + [ FindFirstStream ] 2keep drop + over ALIEN: -1 = [ + 2drop throw-win32-error + ] [ + 1vector swap file-streams-rest + ] if ; + +: alternate-file-streams ( path -- streams ) + file-streams [ cStreamName>> alien>native-string "::$DATA" = not ] filter ; + +: alternate-file-streams? ( path -- streams ) + alternate-file-streams empty? not ; diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor index c28f8e6316..a82bfa03f9 100644 --- a/basis/windows/kernel32/kernel32.factor +++ b/basis/windows/kernel32/kernel32.factor @@ -1161,6 +1161,28 @@ ALIAS: FindFirstChangeNotification FindFirstChangeNotificationW ! FUNCTION: FindFirstFileExW FUNCTION: HANDLE FindFirstFileW ( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ) ALIAS: FindFirstFile FindFirstFileW + +ENUM: STREAM_INFO_LEVELS + FindStreamInfoStandard + FindStreamInfoMaxInfoLevel ; + +STRUCT: WIN32_FIND_STREAM_DATA + { StreamSize LARGE_INTEGER } + { cStreamName WCHAR[292] } ; + +TYPEDEF: WIN32_FIND_STREAM_DATA* PWIN32_FIND_STREAM_DATA + +FUNCTION: HANDLE FindFirstStreamW ( + LPCWSTR lpFileName, + STREAM_INFO_LEVELS InfoLevel, + LPVOID lpFindStreamData, + DWORD dwFlags +) +ALIAS: FindFirstStream FindFirstStreamW + +FUNCTION: BOOL FindNextStreamW ( HANDLE hFindStream, LPVOID lpFindStreamData ) +ALIAS: FindNextStream FindNextStreamW + ! FUNCTION: FindFirstVolumeA ! FUNCTION: FindFirstVolumeMountPointA -- 2.34.1