     ] if ;
 
 : find-first-volume ( -- string handle )
-    MAX_PATH 1+ <byte-array> dup length
+    MAX_PATH 1+ [ <byte-array> ] keep
     dupd
     FindFirstVolume dup win32-error=0/f
     [ utf16n alien>string ] dip ;
 
 : find-next-volume ( handle -- string/f )
-    MAX_PATH 1+ <byte-array> dup length
-    over [ FindNextVolume ] dip swap 0 = [
+    MAX_PATH 1+ [ <byte-array> tuck ] keep
+    FindNextVolume 0 = [
         GetLastError ERROR_NO_MORE_FILES =
-        [ drop f ] [ win32-error ] if
+        [ drop f ] [ win32-error-string throw ] if
     ] [
         utf16n alien>string
     ] if ;

: find-first-file ( path -- WIN32_FIND_DATA handle )
    "WIN32_FIND_DATA" <c-object> tuck
    FindFirstFile
    [ INVALID_HANDLE_VALUE = [ win32-error ] when ] keep ;

: find-next-file ( path -- WIN32_FIND_DATA/f )
    "WIN32_FIND_DATA" <c-object> tuck


HOOK: root-directory os ( string -- string' )

: volume-information ( normalized-path -- volume-name volume-serial max-component flags type )
    MAX_PATH 1+ [ <byte-array> ] keep
    "DWORD" <c-object>
    "DWORD" <c-object>
    "DWORD" <c-object>
    MAX_PATH 1+ [ <byte-array> ] keep
    [ GetVolumeInformation win32-error=0/f ] 7 nkeep
    drop 5 nrot drop
    [ utf16n alien>string ] 4 ndip
    utf16n alien>string ;

: file-system-space ( normalized-path -- available-space total-space free-space )
