diff --git a/modules/integrations/localmachine/collect/collect_windows.go b/modules/integrations/localmachine/collect/collect_windows.go index 21d2490..83c0ebe 100644 --- a/modules/integrations/localmachine/collect/collect_windows.go +++ b/modules/integrations/localmachine/collect/collect_windows.go @@ -168,7 +168,7 @@ func Collect() (localmachine.Info, error) { // SCCM SETTINGS ccmsetup_key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\CCMSetup`, - registry.READ|registry.ENUMERATE_SUB_KEYS|registry.WOW64_64KEY) + registry.QUERY_VALUE|registry.WOW64_64KEY) if err == nil { defer ccmsetup_key.Close() machineinfo.SCCMLastValidMP, _, _ = ccmsetup_key.GetStringValue(`LastValidMP`) @@ -177,25 +177,13 @@ func Collect() (localmachine.Info, error) { // WSUS SETTINGS wu_key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate`, - registry.READ|registry.ENUMERATE_SUB_KEYS|registry.WOW64_64KEY) + registry.QUERY_VALUE|registry.WOW64_64KEY) if err == nil { defer wu_key.Close() machineinfo.WUServer, _, _ = wu_key.GetStringValue(`WUServer`) machineinfo.WUStatusServer, _, _ = wu_key.GetStringValue(`WUStatusServer`) } - // UAC SETTINGS - polsys_key, err := registry.OpenKey(registry.LOCAL_MACHINE, - `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Policies\System`, - registry.READ|registry.ENUMERATE_SUB_KEYS|registry.WOW64_64KEY) - if err == nil { - defer polsys_key.Close() - machineinfo.UACConsentPromptBehaviorAdmin, _, _ = polsys_key.GetIntegerValue(`ConsentPromptBehaviorAdmin`) - machineinfo.UACEnableLUA, _, _ = polsys_key.GetIntegerValue(`EnableLUA`) - machineinfo.UACLocalAccountTokenFilterPolicy, _, _ = polsys_key.GetIntegerValue(`LocalAccountTokenFilterPolicy`) - machineinfo.UACFilterAdministratorToken, _, _ = polsys_key.GetIntegerValue(`FilterAdministratorToken`) - } - // SHARES var sharesinfo localmachine.Shares @@ -713,6 +701,8 @@ func Collect() (localmachine.Info, error) { groupsinfo = append(groupsinfo, grp) } + registrydata := CollectRegistryItems() + dumpedsoftwareinfo, _ := winapi.InstalledSoftwareList() var softwareinfo []localmachine.Software if len(dumpedsoftwareinfo) > 0 { @@ -781,6 +771,7 @@ func Collect() (localmachine.Info, error) { LoginPopularity: logininfo, Users: usersinfo, Groups: groupsinfo, + RegistryData: registrydata, Shares: sharesinfo, Services: servicesinfo, Software: softwareinfo, diff --git a/modules/integrations/localmachine/collect/registry_windows.go b/modules/integrations/localmachine/collect/registry_windows.go new file mode 100644 index 0000000..bdf48b2 --- /dev/null +++ b/modules/integrations/localmachine/collect/registry_windows.go @@ -0,0 +1,98 @@ +package collect + +import ( + "log" + "strings" + + "github.com/lkarlslund/adalanche/modules/integrations/localmachine" + "github.com/lkarlslund/adalanche/modules/ui" + "golang.org/x/sys/windows/registry" +) + +var ( + collect = []string{ + `HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\RunAsPPL`, // Check LSA Protection + + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin`, // UAC Prompt Behavior (Administrator) + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA`, // Check UAC Level + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy`, // Local Account Token Filter Policy + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop`, // Prompt on Secure Desktop + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken`, // Filter Administrator Token + + `HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell`, // Initial Shell(s) + `HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit`, // Userinit (Logon Script) + `HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated`, // Always Install Elevated + `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Installer\DisableCoInstallers`, // 3rd Party Software Installation + `HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceLock\AllowDirectMemoryAccess`, // Bypass DMA Restrictions + `HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuardEnableVirtualizationBasedSecurity`, // Device Guard VM Protection + `HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity\Enabled`, // Hypervisor Enforced Code Integrity + `HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity\LockConfiguration`, // Lock Configuration + `HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State\UEFISecureBootEnabled`, // Secure Boot status + `HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\WUServer`, // Windows Update Server + `HKLM:\Software\Policies\Microsoft\Windows NT\DNSClient\EnableMulticast`, // LLMNR / NetBIOS-NS + `HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS`, // mDNS (Bonjour) + `HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\*\NetbiosOptions`, // 0x2 = Disable NetBIOS over TCP/IP, 0x4 = Disable NetBIOS name registration + // `HKLM:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable`, // Proxy Enable + `HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\SecurityLayer`, // RDP Security Layer + `HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\UserAuthentication`, // RDP User Authentication + `HKLM:\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint\RestrictDriverInstallToAdministrators`, // Point and Print Restrictions + `HKLM:\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint\NoWarningNoElevationOnInstall`, // Point and Print No Warning or Elevation on Install + `HKLM:\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint\UpdaatePromptSettings`, // Point and Print Update Prompt Settings + } +) + +func CollectRegistryItems() localmachine.RegistryData { + results := make(localmachine.RegistryData) + for _, item := range collect { + if strings.Index(item, `*`) != -1 { + // Globbing not supported yet ... let's see later :-) + continue + } + regparts := strings.Split(item, "\\") + + path := strings.Join(regparts[1:len(regparts)-2], "\\") + key := regparts[len(regparts)-1] + hivename := regparts[0] + hive := registry.LOCAL_MACHINE + switch strings.ToUpper(strings.TrimSuffix(hivename, ":")) { + case "HKLM": + hive = registry.LOCAL_MACHINE + default: + ui.Warn().Msgf("Unsupported registry hive name %v, skipping %v", hive, item) + continue + } + + var value any + + k, err := registry.OpenKey(hive, path, registry.QUERY_VALUE|registry.WOW64_64KEY) + if err != nil { + log.Fatal(err) + } + defer k.Close() + + var valtype uint32 + value, valtype, err = k.GetStringValue(key) + if err != nil { + if err == registry.ErrUnexpectedType { + switch valtype { + case registry.NONE, registry.LINK, registry.RESOURCE_LIST, registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_REQUIREMENTS_LIST: + // skip trying + continue + case registry.SZ, registry.EXPAND_SZ: + // strange, that should have worked + case registry.BINARY: + value, _, err = k.GetBinaryValue(key) + case registry.DWORD, registry.QWORD: + value, _, err = k.GetIntegerValue(key) + case registry.MULTI_SZ: + value, _, err = k.GetStringsValue(key) + } + } else { + ui.Warn().Msgf("Problem getting registry value %v: %v", item, err) + continue + } + } + results[item] = value + } + return results +} diff --git a/modules/integrations/localmachine/structs.go b/modules/integrations/localmachine/structs.go index 8f2dc81..f80adb3 100644 --- a/modules/integrations/localmachine/structs.go +++ b/modules/integrations/localmachine/structs.go @@ -23,13 +23,14 @@ type Info struct { Availability Availability `json:",omitempty"` LoginPopularity LoginPopularity `json:",omitempty"` - Users Users `json:",omitempty"` - Groups Groups `json:",omitempty"` - Shares Shares `json:",omitempty"` - Services Services `json:",omitempty"` - Software []Software `json:",omitempty"` - Tasks []RegisteredTask `json:",omitempty"` - Privileges Privileges `json:",omitempty"` + Users Users `json:",omitempty"` + Groups Groups `json:",omitempty"` + Shares Shares `json:",omitempty"` + RegistryData RegistryData `json:",omitempty"` + Services Services `json:",omitempty"` + Software []Software `json:",omitempty"` + Tasks []RegisteredTask `json:",omitempty"` + Privileges Privileges `json:",omitempty"` } type Machine struct { @@ -63,11 +64,6 @@ type Machine struct { WUServer string `json:",omitempty"` WUStatusServer string `json:",omitempty"` - - UACConsentPromptBehaviorAdmin uint64 `json:",omitempty"` - UACEnableLUA uint64 `json:",omitempty"` - UACLocalAccountTokenFilterPolicy uint64 `json:",omitempty"` - UACFilterAdministratorToken uint64 `json:",omitempty"` } type Availability struct { @@ -100,7 +96,10 @@ type Share struct { PathOwner string `json:",omitempty"` } +type RegistryData map[string]any + type Services []Service + type Service struct { RegistryOwner string `json:",omitempty"` RegistryDACL []byte `json:",omitempty"` diff --git a/modules/integrations/localmachine/structs_easyjson.go b/modules/integrations/localmachine/structs_easyjson.go index 569e941..35f0dce 100644 --- a/modules/integrations/localmachine/structs_easyjson.go +++ b/modules/integrations/localmachine/structs_easyjson.go @@ -2358,14 +2358,6 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.WUServer = string(in.String()) case "WUStatusServer": out.WUStatusServer = string(in.String()) - case "UACConsentPromptBehaviorAdmin": - out.UACConsentPromptBehaviorAdmin = uint64(in.Uint64()) - case "UACEnableLUA": - out.UACEnableLUA = uint64(in.Uint64()) - case "UACLocalAccountTokenFilterPolicy": - out.UACLocalAccountTokenFilterPolicy = uint64(in.Uint64()) - case "UACFilterAdministratorToken": - out.UACFilterAdministratorToken = uint64(in.Uint64()) default: in.SkipRecursive() } @@ -2625,46 +2617,6 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } out.String(string(in.WUStatusServer)) } - if in.UACConsentPromptBehaviorAdmin != 0 { - const prefix string = ",\"UACConsentPromptBehaviorAdmin\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(in.UACConsentPromptBehaviorAdmin)) - } - if in.UACEnableLUA != 0 { - const prefix string = ",\"UACEnableLUA\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(in.UACEnableLUA)) - } - if in.UACLocalAccountTokenFilterPolicy != 0 { - const prefix string = ",\"UACLocalAccountTokenFilterPolicy\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(in.UACLocalAccountTokenFilterPolicy)) - } - if in.UACFilterAdministratorToken != 0 { - const prefix string = ",\"UACFilterAdministratorToken\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(in.UACFilterAdministratorToken)) - } out.RawByte('}') } @@ -3056,6 +3008,32 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } in.Delim(']') } + case "RegistryData": + if in.IsNull() { + in.Skip() + } else { + in.Delim('{') + if !in.IsDelim('}') { + out.RegistryData = make(RegistryData) + } else { + out.RegistryData = nil + } + for !in.IsDelim('}') { + key := string(in.String()) + in.WantColon() + var v52 interface{} + if m, ok := v52.(easyjson.Unmarshaler); ok { + m.UnmarshalEasyJSON(in) + } else if m, ok := v52.(json.Unmarshaler); ok { + _ = m.UnmarshalJSON(in.Raw()) + } else { + v52 = in.Interface() + } + (out.RegistryData)[key] = v52 + in.WantComma() + } + in.Delim('}') + } case "Services": if in.IsNull() { in.Skip() @@ -3072,9 +3050,9 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.Services = (out.Services)[:0] } for !in.IsDelim(']') { - var v52 Service - (v52).UnmarshalEasyJSON(in) - out.Services = append(out.Services, v52) + var v53 Service + (v53).UnmarshalEasyJSON(in) + out.Services = append(out.Services, v53) in.WantComma() } in.Delim(']') @@ -3095,9 +3073,9 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.Software = (out.Software)[:0] } for !in.IsDelim(']') { - var v53 Software - (v53).UnmarshalEasyJSON(in) - out.Software = append(out.Software, v53) + var v54 Software + (v54).UnmarshalEasyJSON(in) + out.Software = append(out.Software, v54) in.WantComma() } in.Delim(']') @@ -3118,9 +3096,9 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.Tasks = (out.Tasks)[:0] } for !in.IsDelim(']') { - var v54 RegisteredTask - (v54).UnmarshalEasyJSON(in) - out.Tasks = append(out.Tasks, v54) + var v55 RegisteredTask + (v55).UnmarshalEasyJSON(in) + out.Tasks = append(out.Tasks, v55) in.WantComma() } in.Delim(']') @@ -3141,9 +3119,9 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.Privileges = (out.Privileges)[:0] } for !in.IsDelim(']') { - var v55 Privilege - (v55).UnmarshalEasyJSON(in) - out.Privileges = append(out.Privileges, v55) + var v56 Privilege + (v56).UnmarshalEasyJSON(in) + out.Privileges = append(out.Privileges, v56) in.WantComma() } in.Delim(']') @@ -3228,11 +3206,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v56, v57 := range in.Users { - if v56 > 0 { + for v57, v58 := range in.Users { + if v57 > 0 { out.RawByte(',') } - (v57).MarshalEasyJSON(out) + (v58).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3247,11 +3225,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v58, v59 := range in.Groups { - if v58 > 0 { + for v59, v60 := range in.Groups { + if v59 > 0 { out.RawByte(',') } - (v59).MarshalEasyJSON(out) + (v60).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3266,15 +3244,45 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v60, v61 := range in.Shares { - if v60 > 0 { + for v61, v62 := range in.Shares { + if v61 > 0 { out.RawByte(',') } - (v61).MarshalEasyJSON(out) + (v62).MarshalEasyJSON(out) } out.RawByte(']') } } + if len(in.RegistryData) != 0 { + const prefix string = ",\"RegistryData\":" + if first { + first = false + out.RawString(prefix[1:]) + } else { + out.RawString(prefix) + } + { + out.RawByte('{') + v63First := true + for v63Name, v63Value := range in.RegistryData { + if v63First { + v63First = false + } else { + out.RawByte(',') + } + out.String(string(v63Name)) + out.RawByte(':') + if m, ok := v63Value.(easyjson.Marshaler); ok { + m.MarshalEasyJSON(out) + } else if m, ok := v63Value.(json.Marshaler); ok { + out.Raw(m.MarshalJSON()) + } else { + out.Raw(json.Marshal(v63Value)) + } + } + out.RawByte('}') + } + } if len(in.Services) != 0 { const prefix string = ",\"Services\":" if first { @@ -3285,11 +3293,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v62, v63 := range in.Services { - if v62 > 0 { + for v64, v65 := range in.Services { + if v64 > 0 { out.RawByte(',') } - (v63).MarshalEasyJSON(out) + (v65).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3304,11 +3312,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v64, v65 := range in.Software { - if v64 > 0 { + for v66, v67 := range in.Software { + if v66 > 0 { out.RawByte(',') } - (v65).MarshalEasyJSON(out) + (v67).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3323,11 +3331,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v66, v67 := range in.Tasks { - if v66 > 0 { + for v68, v69 := range in.Tasks { + if v68 > 0 { out.RawByte(',') } - (v67).MarshalEasyJSON(out) + (v69).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3342,11 +3350,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v68, v69 := range in.Privileges { - if v68 > 0 { + for v70, v71 := range in.Privileges { + if v70 > 0 { out.RawByte(',') } - (v69).MarshalEasyJSON(out) + (v71).MarshalEasyJSON(out) } out.RawByte(']') } @@ -3443,9 +3451,9 @@ func easyjson6a975c40DecodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm out.Members = (out.Members)[:0] } for !in.IsDelim(']') { - var v70 Member - (v70).UnmarshalEasyJSON(in) - out.Members = append(out.Members, v70) + var v72 Member + (v72).UnmarshalEasyJSON(in) + out.Members = append(out.Members, v72) in.WantComma() } in.Delim(']') @@ -3500,11 +3508,11 @@ func easyjson6a975c40EncodeGithubComLkarlslundAdalancheModulesIntegrationsLocalm } { out.RawByte('[') - for v71, v72 := range in.Members { - if v71 > 0 { + for v73, v74 := range in.Members { + if v73 > 0 { out.RawByte(',') } - (v72).MarshalEasyJSON(out) + (v74).MarshalEasyJSON(out) } out.RawByte(']') } diff --git a/modules/integrations/localmachine/structs_gen.go b/modules/integrations/localmachine/structs_gen.go index fdc1f8d..78a6784 100644 --- a/modules/integrations/localmachine/structs_gen.go +++ b/modules/integrations/localmachine/structs_gen.go @@ -731,60 +731,90 @@ func (z *Info) DecodeMsg(dc *msgp.Reader) (err error) { return } } - case "Services": + case "RegistryData": var zb0008 uint32 - zb0008, err = dc.ReadArrayHeader() + zb0008, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + if z.RegistryData == nil { + z.RegistryData = make(RegistryData, zb0008) + } else if len(z.RegistryData) > 0 { + for key := range z.RegistryData { + delete(z.RegistryData, key) + } + } + for zb0008 > 0 { + zb0008-- + var za0005 string + var za0006 interface{} + za0005, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + za0006, err = dc.ReadIntf() + if err != nil { + err = msgp.WrapError(err, "RegistryData", za0005) + return + } + z.RegistryData[za0005] = za0006 + } + case "Services": + var zb0009 uint32 + zb0009, err = dc.ReadArrayHeader() if err != nil { err = msgp.WrapError(err, "Services") return } - if cap(z.Services) >= int(zb0008) { - z.Services = (z.Services)[:zb0008] + if cap(z.Services) >= int(zb0009) { + z.Services = (z.Services)[:zb0009] } else { - z.Services = make(Services, zb0008) + z.Services = make(Services, zb0009) } - for za0005 := range z.Services { - err = z.Services[za0005].DecodeMsg(dc) + for za0007 := range z.Services { + err = z.Services[za0007].DecodeMsg(dc) if err != nil { - err = msgp.WrapError(err, "Services", za0005) + err = msgp.WrapError(err, "Services", za0007) return } } case "Software": - var zb0009 uint32 - zb0009, err = dc.ReadArrayHeader() + var zb0010 uint32 + zb0010, err = dc.ReadArrayHeader() if err != nil { err = msgp.WrapError(err, "Software") return } - if cap(z.Software) >= int(zb0009) { - z.Software = (z.Software)[:zb0009] + if cap(z.Software) >= int(zb0010) { + z.Software = (z.Software)[:zb0010] } else { - z.Software = make([]Software, zb0009) + z.Software = make([]Software, zb0010) } - for za0006 := range z.Software { - err = z.Software[za0006].DecodeMsg(dc) + for za0008 := range z.Software { + err = z.Software[za0008].DecodeMsg(dc) if err != nil { - err = msgp.WrapError(err, "Software", za0006) + err = msgp.WrapError(err, "Software", za0008) return } } case "Tasks": - var zb0010 uint32 - zb0010, err = dc.ReadArrayHeader() + var zb0011 uint32 + zb0011, err = dc.ReadArrayHeader() if err != nil { err = msgp.WrapError(err, "Tasks") return } - if cap(z.Tasks) >= int(zb0010) { - z.Tasks = (z.Tasks)[:zb0010] + if cap(z.Tasks) >= int(zb0011) { + z.Tasks = (z.Tasks)[:zb0011] } else { - z.Tasks = make([]RegisteredTask, zb0010) + z.Tasks = make([]RegisteredTask, zb0011) } - for za0007 := range z.Tasks { - err = z.Tasks[za0007].DecodeMsg(dc) + for za0009 := range z.Tasks { + err = z.Tasks[za0009].DecodeMsg(dc) if err != nil { - err = msgp.WrapError(err, "Tasks", za0007) + err = msgp.WrapError(err, "Tasks", za0009) return } } @@ -807,9 +837,9 @@ func (z *Info) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 13 + // map header, size 14 // write "Common" - err = en.Append(0x8d, 0xa6, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e) + err = en.Append(0x8e, 0xa6, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e) if err != nil { return } @@ -968,6 +998,28 @@ func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { return } } + // write "RegistryData" + err = en.Append(0xac, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61) + if err != nil { + return + } + err = en.WriteMapHeader(uint32(len(z.RegistryData))) + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + for za0005, za0006 := range z.RegistryData { + err = en.WriteString(za0005) + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + err = en.WriteIntf(za0006) + if err != nil { + err = msgp.WrapError(err, "RegistryData", za0005) + return + } + } // write "Services" err = en.Append(0xa8, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73) if err != nil { @@ -978,10 +1030,10 @@ func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "Services") return } - for za0005 := range z.Services { - err = z.Services[za0005].EncodeMsg(en) + for za0007 := range z.Services { + err = z.Services[za0007].EncodeMsg(en) if err != nil { - err = msgp.WrapError(err, "Services", za0005) + err = msgp.WrapError(err, "Services", za0007) return } } @@ -995,10 +1047,10 @@ func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "Software") return } - for za0006 := range z.Software { - err = z.Software[za0006].EncodeMsg(en) + for za0008 := range z.Software { + err = z.Software[za0008].EncodeMsg(en) if err != nil { - err = msgp.WrapError(err, "Software", za0006) + err = msgp.WrapError(err, "Software", za0008) return } } @@ -1012,10 +1064,10 @@ func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "Tasks") return } - for za0007 := range z.Tasks { - err = z.Tasks[za0007].EncodeMsg(en) + for za0009 := range z.Tasks { + err = z.Tasks[za0009].EncodeMsg(en) if err != nil { - err = msgp.WrapError(err, "Tasks", za0007) + err = msgp.WrapError(err, "Tasks", za0009) return } } @@ -1035,9 +1087,9 @@ func (z *Info) EncodeMsg(en *msgp.Writer) (err error) { // MarshalMsg implements msgp.Marshaler func (z *Info) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // map header, size 13 + // map header, size 14 // string "Common" - o = append(o, 0x8d, 0xa6, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e) + o = append(o, 0x8e, 0xa6, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e) o, err = z.Common.MarshalMsg(o) if err != nil { err = msgp.WrapError(err, "Common") @@ -1118,33 +1170,44 @@ func (z *Info) MarshalMsg(b []byte) (o []byte, err error) { return } } + // string "RegistryData" + o = append(o, 0xac, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61) + o = msgp.AppendMapHeader(o, uint32(len(z.RegistryData))) + for za0005, za0006 := range z.RegistryData { + o = msgp.AppendString(o, za0005) + o, err = msgp.AppendIntf(o, za0006) + if err != nil { + err = msgp.WrapError(err, "RegistryData", za0005) + return + } + } // string "Services" o = append(o, 0xa8, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73) o = msgp.AppendArrayHeader(o, uint32(len(z.Services))) - for za0005 := range z.Services { - o, err = z.Services[za0005].MarshalMsg(o) + for za0007 := range z.Services { + o, err = z.Services[za0007].MarshalMsg(o) if err != nil { - err = msgp.WrapError(err, "Services", za0005) + err = msgp.WrapError(err, "Services", za0007) return } } // string "Software" o = append(o, 0xa8, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65) o = msgp.AppendArrayHeader(o, uint32(len(z.Software))) - for za0006 := range z.Software { - o, err = z.Software[za0006].MarshalMsg(o) + for za0008 := range z.Software { + o, err = z.Software[za0008].MarshalMsg(o) if err != nil { - err = msgp.WrapError(err, "Software", za0006) + err = msgp.WrapError(err, "Software", za0008) return } } // string "Tasks" o = append(o, 0xa5, 0x54, 0x61, 0x73, 0x6b, 0x73) o = msgp.AppendArrayHeader(o, uint32(len(z.Tasks))) - for za0007 := range z.Tasks { - o, err = z.Tasks[za0007].MarshalMsg(o) + for za0009 := range z.Tasks { + o, err = z.Tasks[za0009].MarshalMsg(o) if err != nil { - err = msgp.WrapError(err, "Tasks", za0007) + err = msgp.WrapError(err, "Tasks", za0009) return } } @@ -1346,60 +1409,90 @@ func (z *Info) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } - case "Services": + case "RegistryData": var zb0008 uint32 - zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0008, bts, err = msgp.ReadMapHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + if z.RegistryData == nil { + z.RegistryData = make(RegistryData, zb0008) + } else if len(z.RegistryData) > 0 { + for key := range z.RegistryData { + delete(z.RegistryData, key) + } + } + for zb0008 > 0 { + var za0005 string + var za0006 interface{} + zb0008-- + za0005, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "RegistryData") + return + } + za0006, bts, err = msgp.ReadIntfBytes(bts) + if err != nil { + err = msgp.WrapError(err, "RegistryData", za0005) + return + } + z.RegistryData[za0005] = za0006 + } + case "Services": + var zb0009 uint32 + zb0009, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Services") return } - if cap(z.Services) >= int(zb0008) { - z.Services = (z.Services)[:zb0008] + if cap(z.Services) >= int(zb0009) { + z.Services = (z.Services)[:zb0009] } else { - z.Services = make(Services, zb0008) + z.Services = make(Services, zb0009) } - for za0005 := range z.Services { - bts, err = z.Services[za0005].UnmarshalMsg(bts) + for za0007 := range z.Services { + bts, err = z.Services[za0007].UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "Services", za0005) + err = msgp.WrapError(err, "Services", za0007) return } } case "Software": - var zb0009 uint32 - zb0009, bts, err = msgp.ReadArrayHeaderBytes(bts) + var zb0010 uint32 + zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Software") return } - if cap(z.Software) >= int(zb0009) { - z.Software = (z.Software)[:zb0009] + if cap(z.Software) >= int(zb0010) { + z.Software = (z.Software)[:zb0010] } else { - z.Software = make([]Software, zb0009) + z.Software = make([]Software, zb0010) } - for za0006 := range z.Software { - bts, err = z.Software[za0006].UnmarshalMsg(bts) + for za0008 := range z.Software { + bts, err = z.Software[za0008].UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "Software", za0006) + err = msgp.WrapError(err, "Software", za0008) return } } case "Tasks": - var zb0010 uint32 - zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) + var zb0011 uint32 + zb0011, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Tasks") return } - if cap(z.Tasks) >= int(zb0010) { - z.Tasks = (z.Tasks)[:zb0010] + if cap(z.Tasks) >= int(zb0011) { + z.Tasks = (z.Tasks)[:zb0011] } else { - z.Tasks = make([]RegisteredTask, zb0010) + z.Tasks = make([]RegisteredTask, zb0011) } - for za0007 := range z.Tasks { - bts, err = z.Tasks[za0007].UnmarshalMsg(bts) + for za0009 := range z.Tasks { + bts, err = z.Tasks[za0009].UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "Tasks", za0007) + err = msgp.WrapError(err, "Tasks", za0009) return } } @@ -1439,17 +1532,24 @@ func (z *Info) Msgsize() (s int) { for za0004 := range z.Shares { s += z.Shares[za0004].Msgsize() } + s += 13 + msgp.MapHeaderSize + if z.RegistryData != nil { + for za0005, za0006 := range z.RegistryData { + _ = za0006 + s += msgp.StringPrefixSize + len(za0005) + msgp.GuessSize(za0006) + } + } s += 9 + msgp.ArrayHeaderSize - for za0005 := range z.Services { - s += z.Services[za0005].Msgsize() + for za0007 := range z.Services { + s += z.Services[za0007].Msgsize() } s += 9 + msgp.ArrayHeaderSize - for za0006 := range z.Software { - s += z.Software[za0006].Msgsize() + for za0008 := range z.Software { + s += z.Software[za0008].Msgsize() } s += 6 + msgp.ArrayHeaderSize - for za0007 := range z.Tasks { - s += z.Tasks[za0007].Msgsize() + for za0009 := range z.Tasks { + s += z.Tasks[za0009].Msgsize() } s += 11 + z.Privileges.Msgsize() return @@ -2370,30 +2470,6 @@ func (z *Machine) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "WUStatusServer") return } - case "UACConsentPromptBehaviorAdmin": - z.UACConsentPromptBehaviorAdmin, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "UACConsentPromptBehaviorAdmin") - return - } - case "UACEnableLUA": - z.UACEnableLUA, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "UACEnableLUA") - return - } - case "UACLocalAccountTokenFilterPolicy": - z.UACLocalAccountTokenFilterPolicy, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "UACLocalAccountTokenFilterPolicy") - return - } - case "UACFilterAdministratorToken": - z.UACFilterAdministratorToken, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "UACFilterAdministratorToken") - return - } default: err = dc.Skip() if err != nil { @@ -2407,9 +2483,9 @@ func (z *Machine) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *Machine) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 28 + // map header, size 24 // write "Name" - err = en.Append(0xde, 0x0, 0x1c, 0xa4, 0x4e, 0x61, 0x6d, 0x65) + err = en.Append(0xde, 0x0, 0x18, 0xa4, 0x4e, 0x61, 0x6d, 0x65) if err != nil { return } @@ -2655,55 +2731,15 @@ func (z *Machine) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "WUStatusServer") return } - // write "UACConsentPromptBehaviorAdmin" - err = en.Append(0xbd, 0x55, 0x41, 0x43, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, 0x64, 0x6d, 0x69, 0x6e) - if err != nil { - return - } - err = en.WriteUint64(z.UACConsentPromptBehaviorAdmin) - if err != nil { - err = msgp.WrapError(err, "UACConsentPromptBehaviorAdmin") - return - } - // write "UACEnableLUA" - err = en.Append(0xac, 0x55, 0x41, 0x43, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x55, 0x41) - if err != nil { - return - } - err = en.WriteUint64(z.UACEnableLUA) - if err != nil { - err = msgp.WrapError(err, "UACEnableLUA") - return - } - // write "UACLocalAccountTokenFilterPolicy" - err = en.Append(0xd9, 0x20, 0x55, 0x41, 0x43, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79) - if err != nil { - return - } - err = en.WriteUint64(z.UACLocalAccountTokenFilterPolicy) - if err != nil { - err = msgp.WrapError(err, "UACLocalAccountTokenFilterPolicy") - return - } - // write "UACFilterAdministratorToken" - err = en.Append(0xbb, 0x55, 0x41, 0x43, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e) - if err != nil { - return - } - err = en.WriteUint64(z.UACFilterAdministratorToken) - if err != nil { - err = msgp.WrapError(err, "UACFilterAdministratorToken") - return - } return } // MarshalMsg implements msgp.Marshaler func (z *Machine) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // map header, size 28 + // map header, size 24 // string "Name" - o = append(o, 0xde, 0x0, 0x1c, 0xa4, 0x4e, 0x61, 0x6d, 0x65) + o = append(o, 0xde, 0x0, 0x18, 0xa4, 0x4e, 0x61, 0x6d, 0x65) o = msgp.AppendString(o, z.Name) // string "LocalSID" o = append(o, 0xa8, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x49, 0x44) @@ -2777,18 +2813,6 @@ func (z *Machine) MarshalMsg(b []byte) (o []byte, err error) { // string "WUStatusServer" o = append(o, 0xae, 0x57, 0x55, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72) o = msgp.AppendString(o, z.WUStatusServer) - // string "UACConsentPromptBehaviorAdmin" - o = append(o, 0xbd, 0x55, 0x41, 0x43, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, 0x64, 0x6d, 0x69, 0x6e) - o = msgp.AppendUint64(o, z.UACConsentPromptBehaviorAdmin) - // string "UACEnableLUA" - o = append(o, 0xac, 0x55, 0x41, 0x43, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x55, 0x41) - o = msgp.AppendUint64(o, z.UACEnableLUA) - // string "UACLocalAccountTokenFilterPolicy" - o = append(o, 0xd9, 0x20, 0x55, 0x41, 0x43, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79) - o = msgp.AppendUint64(o, z.UACLocalAccountTokenFilterPolicy) - // string "UACFilterAdministratorToken" - o = append(o, 0xbb, 0x55, 0x41, 0x43, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e) - o = msgp.AppendUint64(o, z.UACFilterAdministratorToken) return } @@ -2967,30 +2991,6 @@ func (z *Machine) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "WUStatusServer") return } - case "UACConsentPromptBehaviorAdmin": - z.UACConsentPromptBehaviorAdmin, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "UACConsentPromptBehaviorAdmin") - return - } - case "UACEnableLUA": - z.UACEnableLUA, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "UACEnableLUA") - return - } - case "UACLocalAccountTokenFilterPolicy": - z.UACLocalAccountTokenFilterPolicy, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "UACLocalAccountTokenFilterPolicy") - return - } - case "UACFilterAdministratorToken": - z.UACFilterAdministratorToken, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "UACFilterAdministratorToken") - return - } default: bts, err = msgp.Skip(bts) if err != nil { @@ -3009,7 +3009,7 @@ func (z *Machine) Msgsize() (s int) { for za0001 := range z.AppCache { s += msgp.BytesPrefixSize + len(z.AppCache[za0001]) } - s += 16 + msgp.StringPrefixSize + len(z.SCCMLastValidMP) + 9 + msgp.StringPrefixSize + len(z.WUServer) + 15 + msgp.StringPrefixSize + len(z.WUStatusServer) + 30 + msgp.Uint64Size + 13 + msgp.Uint64Size + 34 + msgp.Uint64Size + 28 + msgp.Uint64Size + s += 16 + msgp.StringPrefixSize + len(z.SCCMLastValidMP) + 9 + msgp.StringPrefixSize + len(z.WUServer) + 15 + msgp.StringPrefixSize + len(z.WUStatusServer) return } @@ -4715,6 +4715,128 @@ func (z *RegistrationInfo) Msgsize() (s int) { return } +// DecodeMsg implements msgp.Decodable +func (z *RegistryData) DecodeMsg(dc *msgp.Reader) (err error) { + var zb0003 uint32 + zb0003, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + if (*z) == nil { + (*z) = make(RegistryData, zb0003) + } else if len((*z)) > 0 { + for key := range *z { + delete((*z), key) + } + } + var field []byte + _ = field + for zb0003 > 0 { + zb0003-- + var zb0001 string + var zb0002 interface{} + zb0001, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err) + return + } + zb0002, err = dc.ReadIntf() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + (*z)[zb0001] = zb0002 + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z RegistryData) EncodeMsg(en *msgp.Writer) (err error) { + err = en.WriteMapHeader(uint32(len(z))) + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0004, zb0005 := range z { + err = en.WriteString(zb0004) + if err != nil { + err = msgp.WrapError(err) + return + } + err = en.WriteIntf(zb0005) + if err != nil { + err = msgp.WrapError(err, zb0004) + return + } + } + return +} + +// MarshalMsg implements msgp.Marshaler +func (z RegistryData) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendMapHeader(o, uint32(len(z))) + for zb0004, zb0005 := range z { + o = msgp.AppendString(o, zb0004) + o, err = msgp.AppendIntf(o, zb0005) + if err != nil { + err = msgp.WrapError(err, zb0004) + return + } + } + return +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *RegistryData) UnmarshalMsg(bts []byte) (o []byte, err error) { + var zb0003 uint32 + zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if (*z) == nil { + (*z) = make(RegistryData, zb0003) + } else if len((*z)) > 0 { + for key := range *z { + delete((*z), key) + } + } + var field []byte + _ = field + for zb0003 > 0 { + var zb0001 string + var zb0002 interface{} + zb0003-- + zb0001, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + zb0002, bts, err = msgp.ReadIntfBytes(bts) + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + (*z)[zb0001] = zb0002 + } + o = bts + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z RegistryData) Msgsize() (s int) { + s = msgp.MapHeaderSize + if z != nil { + for zb0004, zb0005 := range z { + _ = zb0005 + s += msgp.StringPrefixSize + len(zb0004) + msgp.GuessSize(zb0005) + } + } + return +} + // DecodeMsg implements msgp.Decodable func (z *Service) DecodeMsg(dc *msgp.Reader) (err error) { var field []byte diff --git a/modules/integrations/localmachine/structs_gen_test.go b/modules/integrations/localmachine/structs_gen_test.go index cf4343a..57c959d 100644 --- a/modules/integrations/localmachine/structs_gen_test.go +++ b/modules/integrations/localmachine/structs_gen_test.go @@ -1704,6 +1704,119 @@ func BenchmarkDecodeRegistrationInfo(b *testing.B) { } } +func TestMarshalUnmarshalRegistryData(t *testing.T) { + v := RegistryData{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func BenchmarkMarshalMsgRegistryData(b *testing.B) { + v := RegistryData{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgRegistryData(b *testing.B) { + v := RegistryData{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalRegistryData(b *testing.B) { + v := RegistryData{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestEncodeDecodeRegistryData(t *testing.T) { + v := RegistryData{} + var buf bytes.Buffer + msgp.Encode(&buf, &v) + + m := v.Msgsize() + if buf.Len() > m { + t.Log("WARNING: TestEncodeDecodeRegistryData Msgsize() is inaccurate") + } + + vn := RegistryData{} + err := msgp.Decode(&buf, &vn) + if err != nil { + t.Error(err) + } + + buf.Reset() + msgp.Encode(&buf, &v) + err = msgp.NewReader(&buf).Skip() + if err != nil { + t.Error(err) + } +} + +func BenchmarkEncodeRegistryData(b *testing.B) { + v := RegistryData{} + var buf bytes.Buffer + msgp.Encode(&buf, &v) + b.SetBytes(int64(buf.Len())) + en := msgp.NewWriter(msgp.Nowhere) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.EncodeMsg(en) + } + en.Flush() +} + +func BenchmarkDecodeRegistryData(b *testing.B) { + v := RegistryData{} + var buf bytes.Buffer + msgp.Encode(&buf, &v) + b.SetBytes(int64(buf.Len())) + rd := msgp.NewEndlessReader(buf.Bytes(), b) + dc := msgp.NewReader(rd) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := v.DecodeMsg(dc) + if err != nil { + b.Fatal(err) + } + } +} + func TestMarshalUnmarshalService(t *testing.T) { v := Service{} bts, err := v.MarshalMsg(nil)