示例#1
0
文件: volume.c 项目: Liryna/dokany
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;
}
示例#2
0
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;
}