// ドライブスペース取得
DWORD GetDiskFreeSpaceMacro(LPSTR path,LPDWORD high)
{
OSVERSIONINFO ver;
BOOL useex = FALSE;
ZeroMemory(&ver,sizeof(OSVERSIONINFO));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&ver)){
if(ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && LOWORD(ver.dwBuildNumber) > 1000){
useex = TRUE;
}
}
if(useex){
ULARGE_INTEGER avaliable,totalbytes,freebytes;
HINSTANCE inst = LoadLibrary("KERNEL32.DLL");
FARPROC proc = GetProcAddress(inst,"GetDiskFreeSpaceExA");
BOOL r = ((BOOL (WINAPI *)(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER))proc)(path,&avaliable,&totalbytes,&freebytes);
FreeLibrary(inst);
if(r){
if(high != NULL)*high = freebytes.HighPart;
return freebytes.LowPart;
}
}else{
DWORD sector_per_cluster,bytes_per_sector;
DWORD number_of_freeclustors,total_number_of_crustors;
if(GetDiskFreeSpace(path,§or_per_cluster,&bytes_per_sector,&number_of_freeclustors,&total_number_of_crustors)){
DWORDLONG size = (DWORDLONG)number_of_freeclustors * (DWORDLONG)sector_per_cluster * (DWORDLONG)bytes_per_sector;
if(high != NULL)*high = (DWORD)((size >> 32) & 0xffffffff);
return (DWORD)(size & 0xffffffff);
}
}
return 0;
}