Getdiskfreespaceexa Woes [Duplicate]

Getdiskfreespaceexa Woes [Duplicate]

I am not understanding something here. I am trying to use the GetDiskFreeSpaceExA function to get the drive space of a drive. When I run the following code:

// Setup the DWORD variables.
PULARGE_INTEGER lpFreeBytesAvailableToCaller{},
    lpTotalNumberOfBytes{},
    lpTotalNumberOfFreeBytes{};

// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/

if (GetDiskFreeSpaceExA(NULL, lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes)) {
    std::cout << lpTotalNumberOfBytes << "\n";
}

All I get back is "0000000000000000". I know there is something I am missing, can anyone shed some light on it?

2

2 Answers

You are passing NULL pointers to GetDiskFreeSpaceExA(), they don't point anywhere meaningful for it to write its output values to.

Declare local non-pointer variables, and pass them to GetDiskFreeSpaceExA() using the & address operator, eg:

// Setup the DWORD variables.
ULARGE_INTEGER FreeBytesAvailableToCaller,
    TotalNumberOfBytes,
    TotalNumberOfFreeBytes;

// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/

if (GetDiskFreeSpaceExA(/*letter.c_str()*/NULL, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) {
    std::cout << TotalNumberOfBytes.QuadPart << "\n";
}

Alternatively,GetDiskFreeSpaceExA() lets you query just the values you actually want, you don't need to ask for all of them if you are not going to use all of them, eg:

// Setup the DWORD variables.
ULARGE_INTEGER TotalNumberOfBytes;

// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/

if (GetDiskFreeSpaceExA(/*letter.c_str()*/NULL, NULL, &TotalNumberOfBytes, NULL)) {
    std::cout << TotalNumberOfBytes.QuadPart << "\n";
}
1

GetDiskFreeSpaceExA does not allocate memory for its results.

You need to have ULARGE_INTEGER variables and pass pointers to it.

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.