//go:build windows package winapi import ( "github.com/Microsoft/go-winio/pkg/guid" "github.com/sirupsen/logrus" "github.com/Microsoft/hcsshim/internal/winapi/cimfs" "github.com/Microsoft/hcsshim/internal/winapi/cimwriter" "github.com/Microsoft/hcsshim/internal/winapi/types" ) // LogCimDLLSupport logs which DLL is being used for CIM write operations. func LogCimDLLSupport() { if cimwriter.Supported() { logrus.Info("using cimwriter.dll for CIM write operations") } else if cimfs.Supported() { logrus.Info("using cimfs.dll for CIM write operations") } else { logrus.Warn("no CIM DLL available for write operations") } } // pickSupported makes sure we use appropriate syscalls depending on which DLLs are present. func pickSupported[F any](cimWriterFunc, cimfsFunc F) F { if cimwriter.Supported() { return cimWriterFunc } return cimfsFunc } func CimMountImage(imagePath string, fsName string, flags uint32, volumeID *guid.GUID) error { return cimfs.CimMountImage(imagePath, fsName, flags, volumeID) } func CimDismountImage(volumeID *guid.GUID) error { return cimfs.CimDismountImage(volumeID) } func CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *types.FsHandle) error { return pickSupported( cimwriter.CimCreateImage, cimfs.CimCreateImage, )(imagePath, oldFSName, newFSName, cimFSHandle) } func CimCreateImage2(imagePath string, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *types.FsHandle) error { return pickSupported( cimwriter.CimCreateImage2, cimfs.CimCreateImage2, )(imagePath, flags, oldFSName, newFSName, cimFSHandle) } func CimCloseImage(cimFSHandle types.FsHandle) error { return pickSupported( cimwriter.CimCloseImage, cimfs.CimCloseImage, )(cimFSHandle) } func CimCommitImage(cimFSHandle types.FsHandle) error { return pickSupported( cimwriter.CimCommitImage, cimfs.CimCommitImage, )(cimFSHandle) } func CimCreateFile(cimFSHandle types.FsHandle, path string, file *types.CimFsFileMetadata, cimStreamHandle *types.StreamHandle) error { return pickSupported( cimwriter.CimCreateFile, cimfs.CimCreateFile, )(cimFSHandle, path, file, cimStreamHandle) } func CimCloseStream(cimStreamHandle types.StreamHandle) error { return pickSupported( cimwriter.CimCloseStream, cimfs.CimCloseStream, )(cimStreamHandle) } func CimWriteStream(cimStreamHandle types.StreamHandle, buffer uintptr, bufferSize uint32) error { return pickSupported( cimwriter.CimWriteStream, cimfs.CimWriteStream, )(cimStreamHandle, buffer, bufferSize) } func CimDeletePath(cimFSHandle types.FsHandle, path string) error { return pickSupported( cimwriter.CimDeletePath, cimfs.CimDeletePath, )(cimFSHandle, path) } func CimCreateHardLink(cimFSHandle types.FsHandle, newPath string, oldPath string) error { return pickSupported( cimwriter.CimCreateHardLink, cimfs.CimCreateHardLink, )(cimFSHandle, newPath, oldPath) } func CimCreateAlternateStream(cimFSHandle types.FsHandle, path string, size uint64, cimStreamHandle *types.StreamHandle) error { return pickSupported( cimwriter.CimCreateAlternateStream, cimfs.CimCreateAlternateStream, )(cimFSHandle, path, size, cimStreamHandle) } func CimAddFsToMergedImage(cimFSHandle types.FsHandle, path string) error { return pickSupported( cimwriter.CimAddFsToMergedImage, cimfs.CimAddFsToMergedImage, )(cimFSHandle, path) } func CimAddFsToMergedImage2(cimFSHandle types.FsHandle, path string, flags uint32) error { return pickSupported( cimwriter.CimAddFsToMergedImage2, cimfs.CimAddFsToMergedImage2, )(cimFSHandle, path, flags) } func CimMergeMountImage(numCimPaths uint32, backingImagePaths *types.CimFsImagePath, flags uint32, volumeID *guid.GUID) error { return cimfs.CimMergeMountImage(numCimPaths, backingImagePaths, flags, volumeID) } func CimTombstoneFile(cimFSHandle types.FsHandle, path string) error { return pickSupported( cimwriter.CimTombstoneFile, cimfs.CimTombstoneFile, )(cimFSHandle, path) } func CimCreateMergeLink(cimFSHandle types.FsHandle, newPath string, oldPath string) (hr error) { return pickSupported( cimwriter.CimCreateMergeLink, cimfs.CimCreateMergeLink, )(cimFSHandle, newPath, oldPath) } func CimSealImage(blockCimPath string, hashSize *uint64, fixedHeaderSize *uint64, hash *byte) (hr error) { return pickSupported( cimwriter.CimSealImage, cimfs.CimSealImage, )(blockCimPath, hashSize, fixedHeaderSize, hash) } func CimGetVerificationInformation(blockCimPath string, isSealed *uint32, hashSize *uint64, signatureSize *uint64, fixedHeaderSize *uint64, hash *byte, signature *byte) (hr error) { return pickSupported( cimwriter.CimGetVerificationInformation, cimfs.CimGetVerificationInformation, )(blockCimPath, isSealed, hashSize, signatureSize, fixedHeaderSize, hash, signature) } func CimMountVerifiedImage(imagePath string, fsName string, flags uint32, volumeID *guid.GUID, hashSize uint16, hash *byte) error { return cimfs.CimMountVerifiedImage(imagePath, fsName, flags, volumeID, hashSize, hash) } func CimMergeMountVerifiedImage(numCimPaths uint32, backingImagePaths *types.CimFsImagePath, flags uint32, volumeID *guid.GUID, hashSize uint16, hash *byte) error { return cimfs.CimMergeMountVerifiedImage(numCimPaths, backingImagePaths, flags, volumeID, hashSize, hash) }