3
0
mirror of https://github.com/XboxDev/nxdk.git synced 2026-02-04 15:05:30 +00:00

winapi: Implement GetDiskFreeSpaceA()

This commit is contained in:
Stefan Schmidt
2020-03-16 16:01:10 +01:00
committed by Jannik Vogel
parent 4053053c41
commit a111d1fe64
2 changed files with 53 additions and 0 deletions

View File

@ -39,6 +39,7 @@ BOOL CreateDirectoryA (LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttrib
BOOL MoveFileA (LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);
BOOL GetDiskFreeSpaceExA (LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes);
BOOL GetDiskFreeSpaceA (LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);
#ifndef UNICODE
#define GetFileAttributes GetFileAttributesA
@ -52,6 +53,7 @@ BOOL GetDiskFreeSpaceExA (LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAva
#define CreateDirectory(...) CreateDirectoryA(__VA_ARGS__)
#define MoveFile(...) MoveFileA(__VA_ARGS__)
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA
#define GetDiskFreeSpace GetDiskFreeSpaceA
#else
#error nxdk does not support the Unicode API
#endif

View File

@ -288,3 +288,54 @@ BOOL GetDiskFreeSpaceExA (LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAva
return TRUE;
}
BOOL GetDiskFreeSpaceA (LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters)
{
NTSTATUS status;
HANDLE handle;
ANSI_STRING path;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK ioStatusBlock;
FILE_FS_SIZE_INFORMATION fsSizeInfo;
assert(lpRootPathName);
RtlInitAnsiString(&path, lpRootPathName);
InitializeObjectAttributes(&objectAttributes, &path, OBJ_CASE_INSENSITIVE, ObDosDevicesDirectory(), NULL);
status = NtOpenFile(&handle, FILE_LIST_DIRECTORY | SYNCHRONIZE, &objectAttributes, &ioStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE | FILE_OPEN_FOR_FREE_SPACE_QUERY);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
SetLastError(ERROR_PATH_NOT_FOUND);
}
return FALSE;
}
status = NtQueryVolumeInformationFile(handle, &ioStatusBlock, &fsSizeInfo, sizeof(fsSizeInfo), FileFsSizeInformation);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
return FALSE;
}
status = NtClose(handle);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
return FALSE;
}
if (lpSectorsPerCluster) {
*lpSectorsPerCluster = fsSizeInfo.SectorsPerAllocationUnit;
}
if (lpBytesPerSector) {
*lpBytesPerSector = fsSizeInfo.BytesPerSector;
}
if (lpNumberOfFreeClusters) {
*lpNumberOfFreeClusters = fsSizeInfo.AvailableAllocationUnits.HighPart ? 0xFFFFFFFF : fsSizeInfo.AvailableAllocationUnits.LowPart;
}
if (lpTotalNumberOfClusters) {
*lpTotalNumberOfClusters = fsSizeInfo.TotalAllocationUnits.HighPart ? 0xFFFFFFFF : fsSizeInfo.TotalAllocationUnits.LowPart;
}
return TRUE;
}