//go:build windows

package winapi

//sys CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) = kernel32.CopyFileW
//sys NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile
//sys NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile

//sys NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) = ntdll.NtOpenDirectoryObject
//sys NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32)(status uint32) = ntdll.NtQueryDirectoryObject

const (
	FileLinkInformationClass          = 11
	FileDispositionInformationExClass = 64

	FILE_READ_ATTRIBUTES  = 0x0080
	FILE_WRITE_ATTRIBUTES = 0x0100
	DELETE                = 0x10000

	FILE_OPEN   = 1
	FILE_CREATE = 2

	FILE_LIST_DIRECTORY          = 0x00000001
	FILE_DIRECTORY_FILE          = 0x00000001
	FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
	FILE_OPEN_FOR_BACKUP_INTENT  = 0x00004000
	FILE_OPEN_REPARSE_POINT      = 0x00200000

	FILE_DISPOSITION_DELETE = 0x00000001

	OBJ_DONT_REPARSE = 0x1000

	STATUS_MORE_ENTRIES    = 0x105
	STATUS_NO_MORE_ENTRIES = 0x8000001a
)

// Select entries from FILE_INFO_BY_HANDLE_CLASS.
//
// C declaration:
//
//	typedef enum _FILE_INFO_BY_HANDLE_CLASS {
//	    FileBasicInfo,
//	    FileStandardInfo,
//	    FileNameInfo,
//	    FileRenameInfo,
//	    FileDispositionInfo,
//	    FileAllocationInfo,
//	    FileEndOfFileInfo,
//	    FileStreamInfo,
//	    FileCompressionInfo,
//	    FileAttributeTagInfo,
//	    FileIdBothDirectoryInfo,
//	    FileIdBothDirectoryRestartInfo,
//	    FileIoPriorityHintInfo,
//	    FileRemoteProtocolInfo,
//	    FileFullDirectoryInfo,
//	    FileFullDirectoryRestartInfo,
//	    FileStorageInfo,
//	    FileAlignmentInfo,
//	    FileIdInfo,
//	    FileIdExtdDirectoryInfo,
//	    FileIdExtdDirectoryRestartInfo,
//	    FileDispositionInfoEx,
//	    FileRenameInfoEx,
//	    FileCaseSensitiveInfo,
//	    FileNormalizedNameInfo,
//	    MaximumFileInfoByHandleClass
//	} FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS;
//
// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class
const (
	FileIdInfo = 18
)

type FileDispositionInformationEx struct {
	Flags uintptr
}

type IOStatusBlock struct {
	Status, Information uintptr
}

type ObjectAttributes struct {
	Length             uintptr
	RootDirectory      uintptr
	ObjectName         *UnicodeString
	Attributes         uintptr
	SecurityDescriptor uintptr
	SecurityQoS        uintptr
}

type ObjectDirectoryInformation struct {
	Name     UnicodeString
	TypeName UnicodeString
}

type FileLinkInformation struct {
	ReplaceIfExists bool
	RootDirectory   uintptr
	FileNameLength  uint32
	FileName        [1]uint16
}

// C declaration:
//
//	typedef struct _FILE_ID_INFO {
//		ULONGLONG   VolumeSerialNumber;
//		FILE_ID_128 FileId;
//	} FILE_ID_INFO, *PFILE_ID_INFO;
//
// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_info
type FILE_ID_INFO struct {
	VolumeSerialNumber uint64
	FileID             [16]byte
}
