Files
Sebastiaan van Stijn 7c3e04997e vendor: github.com/Microsoft/hcsshim v0.15.0-rc.1
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2026-07-16 21:41:41 +02:00

164 lines
5.2 KiB
Go

//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)
}