DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

Win API Drive Info Functions

01.13.2006
| 3726 views |
  • submit to reddit
        
REBOL []

win-drive: context [
    win-lib:  load/library %kernel32.dll

    null-buff: func [
        {Returns a null-filled string buffer of the specified length.}
        len [integer!]
    ][
        head insert/dup make string! len #"^@" len
    ]

    int-struct: make struct! [
        value   [integer!]
    ] none

    ; If all the requested information is retrieved,
    ; the return value is nonzero.
    GetVolumeInformation: make routine! compose/deep [
        RootPathName [string!]      ;LPCTSTR  address of root directory of the
                                    ;         file system
        VolumeNameBuffer [string!]  ;LPTSTR address of name of the volume
        VolumeNameSize   [integer!] ;DWORD  length of lpVolumeNameBuffer
        VolumeSerialNumber [struct! [(first int-struct)]]  ;LPDWORD// address of volume serial number
        MaximumComponentLength [struct! [(first int-struct)]] ;LPDWORD
                                       ;// address of system's maximum
                                       ;// filename length
        FileSystemFlags [struct! [(first int-struct)]]     ; LPDWORD// address of file system flags
        FileSystemNameBuffer [string!] ;LPTSTR // address of name of file system
        FileSystemNameSize [integer!]  ;DWORD  // length of FileSystemNameBuffer
        return: [integer!]
    ] win-lib "GetVolumeInformationA"


    get-volume-info: func [
        {Returns a block with volume-name, serial number, max. filename
        length, flags, and file system name if successful; otherwise NONE.}
        /with root
        /local vol-name file-sys-name ser-num max-filename-length flags res
    ][
        vol-name: null-buff 260
        file-sys-name: null-buff 260
        ser-num: make struct! int-struct [0]
        max-filename-length: make struct! int-struct [0]
        flags: make struct! int-struct [0]
        root: copy/part to-local-file either with [root][what-dir] 3
        res: GetVolumeInformation root
            vol-name length? vol-name
            ser-num max-filename-length flags
            file-sys-name length? file-sys-name

        either res <> 0 [
            reduce [trim vol-name ser-num/value max-filename-length/value flags/value trim file-sys-name]
        ][
            none
        ]
    ]

]

print mold win-drive/get-volume-info
print mold win-drive/get-volume-info/with %/d/
print mold win-drive/get-volume-info/with %/e/
print mold win-drive/get-volume-info/with %/f/
;print mold win-drive/get-volume-info/with %/a/

halt