diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c index d13597626de..62e4bd297de 100644 --- a/dlls/wininet/tests/urlcache.c +++ b/dlls/wininet/tests/urlcache.c @@ -25,6 +25,7 @@ #include "windef.h" #include "winbase.h" #include "wininet.h" +#include "winineti.h" #include "wine/test.h" @@ -219,6 +220,45 @@ static void test_FindCloseUrlCache(void) ok(ERROR_INVALID_HANDLE == err, "expected %d, got %d\n", ERROR_INVALID_HANDLE, err); } +static void test_GetDiskInfoA(void) +{ + BOOL ret; + DWORD error, cluster_size; + DWORDLONG free, total; + char path[MAX_PATH], *p; + + GetSystemDirectoryA(path, MAX_PATH); + if ((p = strchr(path, '\\'))) *++p = 0; + + ret = GetDiskInfoA(path, &cluster_size, &free, &total); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, &free, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, NULL, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, NULL, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + strcpy(p, "\\non\\existing\\path"); + ret = GetDiskInfoA(path, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret, "GetDiskInfoA succeeded\n"); + ok(error == ERROR_PATH_NOT_FOUND, "got %u expected ERROR_PATH_NOT_FOUND\n", error); + + SetLastError(0xdeadbeef); + ret = GetDiskInfoA(NULL, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret, "GetDiskInfoA succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); +} + START_TEST(urlcache) { HMODULE hdll; @@ -227,4 +267,5 @@ START_TEST(urlcache) pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA"); test_urlcacheA(); test_FindCloseUrlCache(); + test_GetDiskInfoA(); } diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c index 5e1541da5b1..db5020cba37 100644 --- a/dlls/wininet/urlcache.c +++ b/dlls/wininet/urlcache.c @@ -3624,10 +3624,26 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa /*********************************************************************** * GetDiskInfoA (WININET.@) */ -DWORD WINAPI GetDiskInfoA(void *p0, void *p1, void *p2, void *p3) +BOOL WINAPI GetDiskInfoA(PCSTR path, PDWORD cluster_size, PDWORDLONG free, PDWORDLONG total) { - FIXME("(%p, %p, %p, %p)\n", p0, p1, p2, p3); - return 0; + BOOL ret; + ULARGE_INTEGER bytes_free, bytes_total; + + TRACE("(%s, %p, %p, %p)\n", debugstr_a(path), cluster_size, free, total); + + if (!path) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if ((ret = GetDiskFreeSpaceExA(path, NULL, &bytes_total, &bytes_free))) + { + if (cluster_size) *cluster_size = 1; + if (free) *free = bytes_free.QuadPart; + if (total) *total = bytes_total.QuadPart; + } + return ret; } /*********************************************************************** diff --git a/dlls/wininet/wininet.spec b/dlls/wininet/wininet.spec index 61beaf4a325..9506b6cd01c 100644 --- a/dlls/wininet/wininet.spec +++ b/dlls/wininet/wininet.spec @@ -1,5 +1,5 @@ 101 stub -noname DoConnectoidsExist -102 stdcall -noname GetDiskInfoA(ptr ptr ptr ptr) +102 stdcall -noname GetDiskInfoA(str ptr ptr ptr) 103 stub -noname PerformOperationOverUrlCacheA 104 stub -noname HttpCheckDavComplianceA 105 stub -noname HttpCheckDavComplianceW diff --git a/include/winineti.h b/include/winineti.h index 98cba3b5da0..32951ffa281 100644 --- a/include/winineti.h +++ b/include/winineti.h @@ -90,6 +90,7 @@ extern "C" { #endif DWORD WINAPI DeleteIE3Cache(HWND,HINSTANCE,LPSTR,int); +BOOL WINAPI GetDiskInfoA(PCSTR,PDWORD,PDWORDLONG,PDWORDLONG); BOOL WINAPI GetUrlCacheConfigInfoA(LPINTERNET_CACHE_CONFIG_INFOA,LPDWORD,DWORD); BOOL WINAPI GetUrlCacheConfigInfoW(LPINTERNET_CACHE_CONFIG_INFOW,LPDWORD,DWORD); #define GetUrlCacheConfigInfo WINELIB_NAME_AW(GetUrlCacheConfigInfo)