"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How can I use the GetVolumeInformation function in GoLang to retrieve the name of a storage volume in Windows?

How can I use the GetVolumeInformation function in GoLang to retrieve the name of a storage volume in Windows?

Published on 2024-10-31
Browse:659

How can I use the GetVolumeInformation function in GoLang to retrieve the name of a storage volume in Windows?

How to Use the GetVolumeInformation Function in GoLang to Obtain Volume Names

When working with Windows systems, developers often find the need to interact with the operating system's file system and retrieve information about storage volumes. One essential function for this purpose is GetVolumeInformation, which provides details about a specified disk volume.

In this article, we explore how to utilize the GetVolumeInformation function in GoLang to ascertain the name of a particular storage volume.

Using GetVolumeInformation in GoLang

To retrieve the volume name using the GetVolumeInformation function, we need to adhere to the following steps:

  1. Loading the Kernel32 Library: First, we must load the "kernel32.dll" library, which houses the GetVolumeInformation function.
  2. Obtaining the Function Pointer: Within the kernel32 library, we retrieve the function pointer for GetVolumeInformationW. This function works with wide character strings (UTF-16), which allows us to handle Unicode characters.
  3. Preparing Input Arguments: The GetVolumeInformation function requires several input arguments, such as the root path name of the volume we want to inspect. We also create buffers to receive the volume name, serial number, file system name, and other metadata.
  4. Calling GetVolumeInformation: Once we have prepared the input arguments, we invoke the GetVolumeInformationW function via syscall.Syscall9. This function takes several arguments and returns a status code.
  5. Handling the Result: If the function execution is successful, we can access the information about the volume, including the volume name stored in the allocated buffer.

Example Code

Here's an example code snippet demonstrating how to use the GetVolumeInformation function in GoLang:

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

func main() {
    var lpRootPathName = "C:\\"
    var lpVolumeNameBuffer = make([]uint16, syscall.MAX_PATH 1)
    var nVolumeNameSize = uint32(len(lpVolumeNameBuffer))
    var lpVolumeSerialNumber uint32
    var lpMaximumComponentLength uint32
    var lpFileSystemFlags uint32
    var lpFileSystemNameBuffer = make([]uint16, 255)
    var nFileSystemNameSize uint32 = syscall.MAX_PATH   1

    kernel32, _ := syscall.LoadLibrary("kernel32.dll")
    getVolume, _ := syscall.GetProcAddress(kernel32, "GetVolumeInformationW")

    var nargs uintptr = 8
    ret, _, callErr := syscall.Syscall9(uintptr(getVolume),
        nargs,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpRootPathName))),
        uintptr(unsafe.Pointer(&lpVolumeNameBuffer[0])),
        uintptr(nVolumeNameSize),
        uintptr(unsafe.Pointer(&lpVolumeSerialNumber)),
        uintptr(unsafe.Pointer(&lpMaximumComponentLength)),
        uintptr(unsafe.Pointer(&lpFileSystemFlags)),
        uintptr(unsafe.Pointer(&lpFileSystemNameBuffer[0])),
        uintptr(nFileSystemNameSize),
        0)
    fmt.Println(ret, callErr, syscall.UTF16ToString(lpVolumeNameBuffer))
}

Considerations

One crucial aspect to remember when using GetVolumeInformation is that it operates on wide character strings (UTF-16). As a result, we must ensure that all strings passed to and returned from the function are in UTF-16 format. Failure to do so may lead to unexpected results.

Conclusion

The GetVolumeInformation function provides an effective way to obtain comprehensive information about storage volumes in GoLang. By following the steps outlined in this article, you can successfully retrieve volume names and other essential details to cater to your application's needs.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3