code: def _ScanVolume(self, scan_context, scan_node, base_path_specs):
      
      if not scan_node or not scan_node.path_spec:
        raise errors.ScannerError('Invalid or missing scan node.')
  
      if scan_context.IsLockedScanNode(scan_node.path_spec):
        # The source scanner found a locked volume and we need a credential to
        # unlock it.
        self._ScanEncryptedVolume(scan_context, scan_node)
  
        if scan_context.IsLockedScanNode(scan_node.path_spec):
          return
  
      if scan_node.IsVolumeSystemRoot():
        self._ScanVolumeSystemRoot(scan_context, scan_node, base_path_specs)
  
      elif scan_node.IsFileSystem():
        self._ScanFileSystem(scan_node, base_path_specs)
  
      elif scan_node.type_indicator == definitions.TYPE_INDICATOR_VSHADOW:
        # TODO: look into building VSS store on demand.
  
        # We "optimize" here for user experience, alternatively we could scan for
        # a file system instead of hard coding a TSK child path specification.
        path_spec = path_spec_factory.Factory.NewPathSpec(
            definitions.TYPE_INDICATOR_TSK, location='/',
            parent=scan_node.path_spec)
  
        base_path_specs.append(path_spec)
  
      else:
        for sub_scan_node in scan_node.sub_nodes:
          self._ScanVolume(scan_context, sub_scan_node, base_path_specs)
docs: Scans a volume scan node for volume and file systems.
  
      Args:
        scan_context (SourceScannerContext): source scanner context.
        scan_node (SourceScanNode): volume scan node.
        base_path_specs (list[PathSpec]): file system base path specifications.
  
      Raises:
        ScannerError: if the format of or within the source
            is not supported or the scan node is invalid.