From: Conor McCarthy cmccarthy@codeweavers.com
--- dlls/kernel32/kernel32.spec | 1 + dlls/kernelbase/kernelbase.spec | 1 + dlls/kernelbase/volume.c | 25 +++++++++++++++++++++++++ include/winbase.h | 1 + 4 files changed, 28 insertions(+)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 3b6ef866705..70b23720095 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -659,6 +659,7 @@ @ stdcall -import GetDiskFreeSpaceExA (str ptr ptr ptr) @ stdcall -import GetDiskFreeSpaceExW (wstr ptr ptr ptr) @ stdcall -import GetDiskFreeSpaceW(wstr ptr ptr ptr ptr) +@ stdcall -import GetDiskSpaceInformationW(wstr ptr) @ stdcall GetDllDirectoryA(long ptr) @ stdcall GetDllDirectoryW(long ptr) @ stdcall -import GetDriveTypeA(str) diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 50c765c792a..3e9982762a4 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -514,6 +514,7 @@ @ stdcall GetDiskFreeSpaceExA(str ptr ptr ptr) @ stdcall GetDiskFreeSpaceExW(wstr ptr ptr ptr) @ stdcall GetDiskFreeSpaceW(wstr ptr ptr ptr ptr) +@ stdcall GetDiskSpaceInformationW(wstr ptr) @ stdcall GetDriveTypeA(str) @ stdcall GetDriveTypeW(wstr) # @ stub GetDurationFormatEx diff --git a/dlls/kernelbase/volume.c b/dlls/kernelbase/volume.c index d4895228525..38205fa57cf 100644 --- a/dlls/kernelbase/volume.c +++ b/dlls/kernelbase/volume.c @@ -736,6 +736,31 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetDiskFreeSpaceA( LPCSTR root, LPDWORD cluster_se }
+/*********************************************************************** + * GetDiskSpaceInformationW (kernelbase.@) + */ +HRESULT WINAPI DECLSPEC_HOTPATCH GetDiskSpaceInformationW( LPCWSTR root, DISK_SPACE_INFORMATION *info ) +{ + IO_STATUS_BLOCK io; + NTSTATUS status; + HANDLE handle; + + TRACE( "%s,%p\n", debugstr_w(root), info ); + + if (!info) + return HRESULT_FROM_NT( ERROR_INVALID_DATA | ERROR_SEVERITY_WARNING | ERROR_SEVERITY_INFORMATIONAL ); + + if (!open_device_root( root, &handle )) return HRESULT_FROM_WIN32( ERROR_PATH_NOT_FOUND ); + + status = NtQueryVolumeInformationFile( handle, &io, (FILE_FS_FULL_SIZE_INFORMATION_EX *)info, sizeof(*info), + FileFsFullSizeInformationEx ); + NtClose( handle ); + if (!set_ntstatus( status )) return status; + + return S_OK; +} + + static BOOL is_dos_path( const UNICODE_STRING *path ) { static const WCHAR global_prefix[4] = {'\','?','?','\'}; diff --git a/include/winbase.h b/include/winbase.h index 03c610d5079..7361e6dc697 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -2201,6 +2201,7 @@ WINBASEAPI BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, WINBASEAPI BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); WINBASEAPI BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); #define GetDiskFreeSpaceEx WINELIB_NAME_AW(GetDiskFreeSpaceEx) +WINBASEAPI HRESULT WINAPI GetDiskSpaceInformationW(LPCWSTR,DISK_SPACE_INFORMATION*); WINBASEAPI DWORD WINAPI GetDllDirectoryA(DWORD,LPSTR); WINBASEAPI DWORD WINAPI GetDllDirectoryW(DWORD,LPWSTR); #define GetDllDirectory WINELIB_NAME_AW(GetDllDirectory)