winio

package module
v0.5.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 29, 2021 License: MIT Imports: 7 Imported by: 0

README

go-winio Build Status

This repository contains utilities for efficiently performing Win32 IO operations in Go. Currently, this is focused on accessing named pipes and other file handles, and for using named pipes as a net transport.

This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go to reuse the thread to schedule another goroutine. This limits support to Windows Vista and newer operating systems. This is similar to the implementation of network sockets in Go's net package.

Please see the LICENSE file for licensing information.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.

Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe for another named pipe implementation.

Documentation

Index

Constants

View Source
const (
	BackupData = uint32(iota + 1)
	BackupEaData
	BackupSecurity
	BackupAlternateData
	BackupLink
	BackupPropertyData
	BackupObjectId
	BackupReparseData
	BackupSparseBlock
	BackupTxfsData
)
View Source
const (
	WRITE_DAC              = 0x40000
	WRITE_OWNER            = 0x80000
	ACCESS_SYSTEM_SECURITY = 0x1000000
)
View Source
const (
	SE_PRIVILEGE_ENABLED = 2

	ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300

	SeBackupPrivilege   = "SeBackupPrivilege"
	SeRestorePrivilege  = "SeRestorePrivilege"
	SeSecurityPrivilege = "SeSecurityPrivilege"
)
View Source
const (
	StreamSparseAttributes = uint32(8)
)

Variables

View Source
var (
	ErrFileClosed = errors.New("file has already been closed")
	ErrTimeout    = &timeoutError{}
)
View Source
var (
	// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed.
	// This error should match net.errClosing since docker takes a dependency on its text.
	ErrPipeListenerClosed = errors.New("use of closed network connection")
)

Functions

func DialPipe

func DialPipe(path string, timeout *time.Duration) (net.Conn, error)

DialPipe connects to a named pipe by path, timing out if the connection takes longer than the specified duration. If timeout is nil, then we use a default timeout of 2 seconds. (We do not use WaitNamedPipe.)

func DialPipeAccess added in v0.5.1

func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error)

DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx` cancellation or timeout.

func DialPipeContext added in v0.5.1

func DialPipeContext(ctx context.Context, path string) (net.Conn, error)

DialPipeContext attempts to connect to a named pipe by `path` until `ctx` cancellation or timeout.

func DisableProcessPrivileges added in v0.3.6

func DisableProcessPrivileges(names []string) error

DisableProcessPrivileges disables privileges globally for the process.

func EnableProcessPrivileges added in v0.3.4

func EnableProcessPrivileges(names []string) error

EnableProcessPrivileges enables privileges globally for the process.

func EncodeExtendedAttributes added in v0.4.5

func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error)

EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION buffer for use with BackupWrite, ZwSetEaFile, etc.

func EncodeReparsePoint

func EncodeReparsePoint(rp *ReparsePoint) []byte

EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or mount point.

func ListenPipe

func ListenPipe(path string, c *PipeConfig) (net.Listener, error)

ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. The pipe must not already exist.

func LookupSidByName

func LookupSidByName(name string) (sid string, err error)

LookupSidByName looks up the SID of an account by name

func MakeOpenFile

func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error)

func OpenForBackup added in v0.2.0

func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error)

OpenForBackup opens a file or directory, potentially skipping access checks if the backup or restore privileges have been acquired.

If the file opened was a directory, it cannot be used with Readdir().

func RunWithPrivilege

func RunWithPrivilege(name string, fn func() error) error

RunWithPrivilege enables a single privilege for a function call.

func RunWithPrivileges

func RunWithPrivileges(names []string, fn func() error) error

RunWithPrivileges enables privileges for a function call.

func SddlToSecurityDescriptor

func SddlToSecurityDescriptor(sddl string) ([]byte, error)

func SecurityDescriptorToSddl

func SecurityDescriptorToSddl(sd []byte) (string, error)

func SetFileBasicInfo

func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error

SetFileBasicInfo sets times and attributes for a file.

func VsockServiceID added in v0.5.1

func VsockServiceID(port uint32) guid.GUID

VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port.

Types

type AccountLookupError

type AccountLookupError struct {
	Name string
	Err  error
}

func (*AccountLookupError) Error

func (e *AccountLookupError) Error() string

type BackupFileReader

type BackupFileReader struct {
	// contains filtered or unexported fields
}

BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API.

func NewBackupFileReader

func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader

NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, Read will attempt to read the security descriptor of the file.

func (*BackupFileReader) Close

func (r *BackupFileReader) Close() error

Close frees Win32 resources associated with the BackupFileReader. It does not close the underlying file.

func (*BackupFileReader) Read

func (r *BackupFileReader) Read(b []byte) (int, error)

Read reads a backup stream from the file by calling the Win32 API BackupRead().

type BackupFileWriter

type BackupFileWriter struct {
	// contains filtered or unexported fields
}

BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API.

func NewBackupFileWriter

func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter

NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, Write() will attempt to restore the security descriptor from the stream.

func (*BackupFileWriter) Close

func (w *BackupFileWriter) Close() error

Close frees Win32 resources associated with the BackupFileWriter. It does not close the underlying file.

func (*BackupFileWriter) Write

func (w *BackupFileWriter) Write(b []byte) (int, error)

Write restores a portion of the file using the provided backup stream.

type BackupHeader

type BackupHeader struct {
	Id         uint32 // The backup stream ID
	Attributes uint32 // Stream attributes
	Size       int64  // The size of the stream in bytes
	Name       string // The name of the stream (for BackupAlternateData only).
	Offset     int64  // The offset of the stream in the file (for BackupSparseBlock only).
}

BackupHeader represents a backup stream of a file.

type BackupStreamReader

type BackupStreamReader struct {
	// contains filtered or unexported fields
}

BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series of BackupHeader values.

func NewBackupStreamReader

func NewBackupStreamReader(r io.Reader) *BackupStreamReader

NewBackupStreamReader produces a BackupStreamReader from any io.Reader.

func (*BackupStreamReader) Next

func (r *BackupStreamReader) Next() (*BackupHeader, error)

Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if it was not completely read.

func (*BackupStreamReader) Read

func (r *BackupStreamReader) Read(b []byte) (int, error)

Read reads from the current backup stream.

type BackupStreamWriter

type BackupStreamWriter struct {
	// contains filtered or unexported fields
}

BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API.

func NewBackupStreamWriter

func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter

NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer.

func (*BackupStreamWriter) Write

func (w *BackupStreamWriter) Write(b []byte) (int, error)

Write writes to the current backup stream.

func (*BackupStreamWriter) WriteHeader

func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error

WriteHeader writes the next backup stream header and prepares for calls to Write().

type ExtendedAttribute added in v0.4.5

type ExtendedAttribute struct {
	Name  string
	Value []byte
	Flags uint8
}

ExtendedAttribute represents a single Windows EA.

func DecodeExtendedAttributes added in v0.4.5

func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error)

DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION buffer retrieved from BackupRead, ZwQueryEaFile, etc.

type FileBasicInfo

type FileBasicInfo struct {
	CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime
	FileAttributes                                          uint32
	// contains filtered or unexported fields
}

FileBasicInfo contains file access time and file attributes information.

func GetFileBasicInfo

func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error)

GetFileBasicInfo retrieves times and attributes for a file.

type FileIDInfo added in v0.2.0

type FileIDInfo struct {
	VolumeSerialNumber uint64
	FileID             [16]byte
}

FileIDInfo contains the volume serial number and file ID for a file. This pair should be unique on a system.

func GetFileID added in v0.2.0

func GetFileID(f *os.File) (*FileIDInfo, error)

GetFileID retrieves the unique (volume, file ID) pair for a file.

type FileStandardInfo added in v0.5.1

type FileStandardInfo struct {
	AllocationSize, EndOfFile int64
	NumberOfLinks             uint32
	DeletePending, Directory  bool
}

FileStandardInfo contains extended information for the file. FILE_STANDARD_INFO in WinBase.h https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info

func GetFileStandardInfo added in v0.5.1

func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error)

GetFileStandardInfo retrieves ended information for the file.

type HvsockAddr added in v0.5.1

type HvsockAddr struct {
	VMID      guid.GUID
	ServiceID guid.GUID
}

An HvsockAddr is an address for a AF_HYPERV socket.

func (*HvsockAddr) Network added in v0.5.1

func (addr *HvsockAddr) Network() string

Network returns the address's network name, "hvsock".

func (*HvsockAddr) String added in v0.5.1

func (addr *HvsockAddr) String() string

type HvsockConn added in v0.5.1

type HvsockConn struct {
	// contains filtered or unexported fields
}

HvsockConn is a connected socket of the AF_HYPERV address family.

func (*HvsockConn) Close added in v0.5.1

func (conn *HvsockConn) Close() error

Close closes the socket connection, failing any pending read or write calls.

func (*HvsockConn) CloseRead added in v0.5.1

func (conn *HvsockConn) CloseRead() error

CloseRead shuts down the read end of the socket.

func (*HvsockConn) CloseWrite added in v0.5.1

func (conn *HvsockConn) CloseWrite() error

CloseWrite shuts down the write end of the socket, notifying the other endpoint that no more data will be written.

func (*HvsockConn) LocalAddr added in v0.5.1

func (conn *HvsockConn) LocalAddr() net.Addr

LocalAddr returns the local address of the connection.

func (*HvsockConn) Read added in v0.5.1

func (conn *HvsockConn) Read(b []byte) (int, error)

func (*HvsockConn) RemoteAddr added in v0.5.1

func (conn *HvsockConn) RemoteAddr() net.Addr

RemoteAddr returns the remote address of the connection.

func (*HvsockConn) SetDeadline added in v0.5.1

func (conn *HvsockConn) SetDeadline(t time.Time) error

SetDeadline implements the net.Conn SetDeadline method.

func (*HvsockConn) SetReadDeadline added in v0.5.1

func (conn *HvsockConn) SetReadDeadline(t time.Time) error

SetReadDeadline implements the net.Conn SetReadDeadline method.

func (*HvsockConn) SetWriteDeadline added in v0.5.1

func (conn *HvsockConn) SetWriteDeadline(t time.Time) error

SetWriteDeadline implements the net.Conn SetWriteDeadline method.

func (*HvsockConn) Write added in v0.5.1

func (conn *HvsockConn) Write(b []byte) (int, error)

type HvsockListener added in v0.5.1

type HvsockListener struct {
	// contains filtered or unexported fields
}

HvsockListener is a socket listener for the AF_HYPERV address family.

func ListenHvsock added in v0.5.1

func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error)

ListenHvsock listens for connections on the specified hvsock address.

func (*HvsockListener) Accept added in v0.5.1

func (l *HvsockListener) Accept() (_ net.Conn, err error)

Accept waits for the next connection and returns it.

func (*HvsockListener) Addr added in v0.5.1

func (l *HvsockListener) Addr() net.Addr

Addr returns the listener's network address.

func (*HvsockListener) Close added in v0.5.1

func (l *HvsockListener) Close() error

Close closes the listener, causing any pending Accept calls to fail.

type PipeConfig

type PipeConfig struct {
	// SecurityDescriptor contains a Windows security descriptor in SDDL format.
	SecurityDescriptor string

	// MessageMode determines whether the pipe is in byte or message mode. In either
	// case the pipe is read in byte mode by default. The only practical difference in
	// this implementation is that CloseWrite() is only supported for message mode pipes;
	// CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only
	// transferred to the reader (and returned as io.EOF in this implementation)
	// when the pipe is in message mode.
	MessageMode bool

	// InputBufferSize specifies the size of the input buffer, in bytes.
	InputBufferSize int32

	// OutputBufferSize specifies the size of the output buffer, in bytes.
	OutputBufferSize int32
}

PipeConfig contain configuration for the pipe listener.

type PrivilegeError

type PrivilegeError struct {
	// contains filtered or unexported fields
}

PrivilegeError represents an error enabling privileges.

func (*PrivilegeError) Error

func (e *PrivilegeError) Error() string

type ReparsePoint

type ReparsePoint struct {
	Target       string
	IsMountPoint bool
}

ReparsePoint describes a Win32 symlink or mount point.

func DecodeReparsePoint

func DecodeReparsePoint(b []byte) (*ReparsePoint, error)

DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink or a mount point.

func DecodeReparsePointData added in v0.3.0

func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error)

type SddlConversionError

type SddlConversionError struct {
	Sddl string
	Err  error
}

func (*SddlConversionError) Error

func (e *SddlConversionError) Error() string

type UnsupportedReparsePointError

type UnsupportedReparsePointError struct {
	Tag uint32
}

UnsupportedReparsePointError is returned when trying to decode a non-symlink or mount point reparse point.

func (*UnsupportedReparsePointError) Error

Directories

Path Synopsis
pkg
etw
Package etw provides support for TraceLogging-based ETW (Event Tracing for Windows).
Package etw provides support for TraceLogging-based ETW (Event Tracing for Windows).
fs
guid
Package guid provides a GUID type.
Package guid provides a GUID type.
tools
wim
Package wim implements a WIM file parser.
Package wim implements a WIM file parser.
lzx
Package lzx implements a decompressor for the the WIM variant of the LZX compression algorithm.
Package lzx implements a decompressor for the the WIM variant of the LZX compression algorithm.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL