package winapi

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