mirror of
https://github.com/moby/moby.git
synced 2026-08-07 00:21:52 +00:00
164 lines
5.2 KiB
Go
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)
|
|
}
|