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.