FR: Windows.GetDiskFreeSpaceExW: use of var parameters

Summary

MS defines GetDiskFreeSpaceExW as follows:

BOOL GetDiskFreeSpaceExW(
  [in, optional]  LPCWSTR         lpDirectoryName,
  [out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

In rtl/win/wininc/redef.inc we define 2 overloads for this function:

function GetDiskFreeSpaceExW(lpDirectoryName: LPWSTR; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: TLargeInteger; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;external 'kernel32' name 'GetDiskFreeSpaceExW';

function GetDiskFreeSpaceExW(lpDirectoryName: LPWSTR; lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: pLargeInteger; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;external 'kernel32' name 'GetDiskFreeSpaceExW';

Notice that in MS definition the last 3 params all have the same type.
It would make (more sense) to have an overload like:

function GetDiskFreeSpaceExW(lpDirectoryName: LPWSTR; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: , lpTotalNumberOfFreeBytes: TLargeInteger): BOOL;external 'kernel32' name 'GetDiskFreeSpaceExW';

ATM I have to call this like: GetDiskFreeSpaceExW(PWideChar(Drive),Avail, Size, @FreeSize), whereas GetDiskFreeSpaceExW(PWideChar(Drive),Avail, Size, FreeSize) would be a bit more logical.

I am aware that having the third param being a pointer, you can set it to nil if you're not interested in FreeSize, but the same argument can be made for Size param.
Just use the overload with only pointer params for that IMO.

System Information

  • Operating system: Windows 11 Home 64
  • Processor architecture: x86_64
  • Device: Laptop