// ref: MS-DTYP

package smb2

import (
	
	
)

type Filetime struct {
	LowDateTime  uint32
	HighDateTime uint32
}

func ( *Filetime) () int {
	return 8
}

func ( *Filetime) ( []byte) {
	le.PutUint32([:4], .LowDateTime)
	le.PutUint32([4:8], .HighDateTime)
}

func ( *Filetime) () int64 {
	 := int64(.HighDateTime)<<32 + int64(.LowDateTime)
	 -= 116444736000000000
	 *= 100
	return 
}

func ( int64) ( *Filetime) {
	 /= 100
	 += 116444736000000000

	return &Filetime{
		LowDateTime:  uint32( & 0xffffffff),
		HighDateTime: uint32( >> 32 & 0xffffffff),
	}
}

type FiletimeDecoder []byte

func ( FiletimeDecoder) () uint32 {
	return le.Uint32([:4])
}

func ( FiletimeDecoder) () uint32 {
	return le.Uint32([4:8])
}

func ( FiletimeDecoder) () int64 {
	 := int64(.HighDateTime())<<32 + int64(.LowDateTime())
	 -= 116444736000000000
	 *= 100
	return 
}

func ( FiletimeDecoder) () *Filetime {
	return &Filetime{
		LowDateTime:  .LowDateTime(),
		HighDateTime: .HighDateTime(),
	}
}

type Sid struct {
	Revision            uint8
	IdentifierAuthority uint64
	SubAuthority        []uint32
}

func ( *Sid) () string {
	 := make([]string, 0, 3+len(.SubAuthority))
	 = append(, "S")
	 = append(, strconv.Itoa(int(.Revision)))
	if .IdentifierAuthority < uint64(1<<32) {
		 = append(, strconv.FormatUint(.IdentifierAuthority, 10))
	} else {
		 = append(, "0x"+strconv.FormatUint(.IdentifierAuthority, 16))
	}
	for ,  := range .SubAuthority {
		 = append(, strconv.FormatUint(uint64(), 10))
	}
	return strings.Join(, "-")
}

func ( *Sid) () int {
	return 8 + len(.SubAuthority)*4
}

func ( *Sid) ( []byte) {
	[0] = .Revision
	[1] = uint8(len(.SubAuthority))
	for  := 0;  < 6; ++ {
		[2+] = byte(.IdentifierAuthority >> uint64(8*(6-)))
	}
	 := 8
	for ,  := range .SubAuthority {
		le.PutUint32([:+4], )
		 += 4
	}
}

type SidDecoder []byte

func ( SidDecoder) () bool {
	if len() < 8 {
		return true
	}

	if len() < 8+int(.SubAuthorityCount())*4 {
		return true
	}

	return false
}

func ( SidDecoder) () uint8 {
	return [0]
}

func ( SidDecoder) () uint8 {
	return [1]
}

func ( SidDecoder) () uint64 {
	var  uint64
	for  := 0;  < 6; ++ {
		 += uint64([7-]) << uint64(8*)
	}
	return 
}

func ( SidDecoder) () []uint32 {
	 := .SubAuthorityCount()
	 := make([]uint32, )
	 := 8
	for  := uint8(0);  < ; ++ {
		[] = le.Uint32([ : +4])
		 += 4
	}
	return 
}

func ( SidDecoder) () *Sid {
	return &Sid{
		Revision:            .Revision(),
		IdentifierAuthority: .IdentifierAuthority(),
		SubAuthority:        .SubAuthority(),
	}
}