NTSTATUS DokanFsFullSizeInformation(PEVENT_INFORMATION EventInfo, PEVENT_CONTEXT EventContext, PDOKAN_FILE_INFO FileInfo, PDOKAN_OPERATIONS DokanOperations) { ULONGLONG freeBytesAvailable = 0; ULONGLONG totalBytes = 0; ULONGLONG freeBytes = 0; NTSTATUS status = STATUS_NOT_IMPLEMENTED; ULONG allocationUnitSize = FileInfo->DokanOptions->AllocationUnitSize; ULONG sectorSize = FileInfo->DokanOptions->SectorSize; PFILE_FS_FULL_SIZE_INFORMATION sizeInfo = (PFILE_FS_FULL_SIZE_INFORMATION)EventInfo->Buffer; if (EventContext->Operation.Volume.BufferLength < sizeof(FILE_FS_FULL_SIZE_INFORMATION)) { return STATUS_BUFFER_OVERFLOW; } if (DokanOperations->GetDiskFreeSpace) { status = DokanOperations->GetDiskFreeSpace( &freeBytesAvailable, // FreeBytesAvailable &totalBytes, // TotalNumberOfBytes &freeBytes, // TotalNumberOfFreeBytes FileInfo); } if (status == STATUS_NOT_IMPLEMENTED) { status = DokanGetDiskFreeSpace(&freeBytesAvailable, // FreeBytesAvailable &totalBytes, // TotalNumberOfBytes &freeBytes, // TotalNumberOfFreeBytes FileInfo); } if (status != STATUS_SUCCESS) { return status; } sizeInfo->TotalAllocationUnits.QuadPart = totalBytes / allocationUnitSize; sizeInfo->ActualAvailableAllocationUnits.QuadPart = freeBytes / allocationUnitSize; sizeInfo->CallerAvailableAllocationUnits.QuadPart = freeBytesAvailable / allocationUnitSize; sizeInfo->SectorsPerAllocationUnit = allocationUnitSize / sectorSize; sizeInfo->BytesPerSector = sectorSize; EventInfo->BufferLength = sizeof(FILE_FS_FULL_SIZE_INFORMATION); return STATUS_SUCCESS; }
ULONG DokanFsFullSizeInformation( PEVENT_INFORMATION EventInfo, PEVENT_CONTEXT EventContext, PDOKAN_FILE_INFO FileInfo, PDOKAN_OPERATIONS DokanOperations) { ULONGLONG freeBytesAvailable = 0; ULONGLONG totalBytes = 0; ULONGLONG freeBytes = 0; int status = -1; PFILE_FS_FULL_SIZE_INFORMATION sizeInfo = (PFILE_FS_FULL_SIZE_INFORMATION)EventInfo->Buffer; if (!DokanOperations->GetDiskFreeSpace) { DokanOperations->GetDiskFreeSpace = DokanGetDiskFreeSpace; //return STATUS_NOT_IMPLEMENTED; } if (EventContext->Operation.Volume.BufferLength < sizeof(FILE_FS_FULL_SIZE_INFORMATION)) { return STATUS_BUFFER_OVERFLOW; } status = DokanOperations->GetDiskFreeSpace( &freeBytesAvailable, // FreeBytesAvailable &totalBytes, // TotalNumberOfBytes &freeBytes, // TotalNumberOfFreeBytes FileInfo); if (status < 0) { return STATUS_INVALID_PARAMETER; } sizeInfo->TotalAllocationUnits.QuadPart = totalBytes / DOKAN_ALLOCATION_UNIT_SIZE; sizeInfo->ActualAvailableAllocationUnits.QuadPart = freeBytes / DOKAN_ALLOCATION_UNIT_SIZE; sizeInfo->CallerAvailableAllocationUnits.QuadPart = freeBytesAvailable / DOKAN_ALLOCATION_UNIT_SIZE; sizeInfo->SectorsPerAllocationUnit = DOKAN_ALLOCATION_UNIT_SIZE / DOKAN_SECTOR_SIZE; sizeInfo->BytesPerSector = DOKAN_SECTOR_SIZE; EventInfo->BufferLength = sizeof(FILE_FS_FULL_SIZE_INFORMATION); return STATUS_SUCCESS; }