NTSTATUS DokanFsVolumeInformation(PEVENT_INFORMATION EventInfo, PEVENT_CONTEXT EventContext, PDOKAN_FILE_INFO FileInfo, PDOKAN_OPERATIONS DokanOperations) { WCHAR volumeName[MAX_PATH]; DWORD volumeSerial = 0; DWORD maxComLength = 0; DWORD fsFlags = 0; WCHAR fsName[MAX_PATH]; ULONG remainingLength; ULONG bytesToCopy; NTSTATUS status = STATUS_NOT_IMPLEMENTED; PFILE_FS_VOLUME_INFORMATION volumeInfo = (PFILE_FS_VOLUME_INFORMATION)EventInfo->Buffer; remainingLength = EventContext->Operation.Volume.BufferLength; if (remainingLength < sizeof(FILE_FS_VOLUME_INFORMATION)) { return STATUS_BUFFER_OVERFLOW; } RtlZeroMemory(volumeName, sizeof(volumeName)); RtlZeroMemory(fsName, sizeof(fsName)); if (DokanOperations->GetVolumeInformation) { status = DokanOperations->GetVolumeInformation( volumeName, // VolumeNameBuffer sizeof(volumeName) / sizeof(WCHAR), // VolumeNameSize &volumeSerial, // VolumeSerialNumber &maxComLength, // MaximumComponentLength &fsFlags, // FileSystemFlags fsName, // FileSystemNameBuffer sizeof(fsName) / sizeof(WCHAR), // FileSystemNameSize FileInfo); } if (status == STATUS_NOT_IMPLEMENTED) { status = DokanGetVolumeInformation( volumeName, // VolumeNameBuffer sizeof(volumeName) / sizeof(WCHAR), // VolumeNameSize &volumeSerial, // VolumeSerialNumber &maxComLength, // MaximumComponentLength &fsFlags, // FileSystemFlags fsName, // FileSystemNameBuffer sizeof(fsName) / sizeof(WCHAR), // FileSystemNameSize FileInfo); } if (status != STATUS_SUCCESS) { return status; } volumeInfo->VolumeCreationTime.QuadPart = 0; volumeInfo->VolumeSerialNumber = volumeSerial; volumeInfo->SupportsObjects = FALSE; remainingLength -= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel[0]); bytesToCopy = (ULONG)wcslen(volumeName) * sizeof(WCHAR); if (remainingLength < bytesToCopy) { bytesToCopy = remainingLength; } volumeInfo->VolumeLabelLength = bytesToCopy; RtlCopyMemory(volumeInfo->VolumeLabel, volumeName, bytesToCopy); remainingLength -= bytesToCopy; EventInfo->BufferLength = EventContext->Operation.Volume.BufferLength - remainingLength; return STATUS_SUCCESS; }
ULONG DokanFsAttributeInformation( PEVENT_INFORMATION EventInfo, PEVENT_CONTEXT EventContext, PDOKAN_FILE_INFO FileInfo, PDOKAN_OPERATIONS DokanOperations) { WCHAR volumeName[MAX_PATH]; DWORD volumeSerial; DWORD maxComLength; DWORD fsFlags; WCHAR fsName[MAX_PATH]; ULONG remainingLength; ULONG bytesToCopy; int status = -1; PFILE_FS_ATTRIBUTE_INFORMATION attrInfo = (PFILE_FS_ATTRIBUTE_INFORMATION)EventInfo->Buffer; if (!DokanOperations->GetVolumeInformation) { DokanOperations->GetVolumeInformation = DokanGetVolumeInformation; //return STATUS_NOT_IMPLEMENTED; } remainingLength = EventContext->Operation.Volume.BufferLength; if (remainingLength < sizeof(FILE_FS_ATTRIBUTE_INFORMATION)) { return STATUS_BUFFER_OVERFLOW; } RtlZeroMemory(volumeName, sizeof(volumeName)); RtlZeroMemory(fsName, sizeof(fsName)); status = DokanOperations->GetVolumeInformation( volumeName, // VolumeNameBuffer sizeof(volumeName) / sizeof(WCHAR), // VolumeNameSize &volumeSerial, // VolumeSerialNumber &maxComLength, // MaximumComponentLength &fsFlags, // FileSystemFlags fsName, // FileSystemNameBuffer sizeof(fsName) / sizeof(WCHAR), // FileSystemNameSize FileInfo); if (status < 0) { return STATUS_INVALID_PARAMETER; } attrInfo->FileSystemAttributes = fsFlags; attrInfo->MaximumComponentNameLength = maxComLength; remainingLength -= FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName[0]); bytesToCopy = (ULONG)wcslen(fsName) * sizeof(WCHAR); if (remainingLength < bytesToCopy) { bytesToCopy = remainingLength; } attrInfo->FileSystemNameLength = bytesToCopy; RtlCopyMemory(attrInfo->FileSystemName, fsName, bytesToCopy); remainingLength -= bytesToCopy; EventInfo->BufferLength = EventContext->Operation.Volume.BufferLength - remainingLength; return STATUS_SUCCESS; }