From d6e81a94b64cf4984423b7d1783abd1121ec5f8e Mon Sep 17 00:00:00 2001 From: Ahmet Ozturk Date: Fri, 23 Jan 2026 13:00:18 +0000 Subject: [PATCH 1/4] check_drivesize fix drive discovery - part 1 go back to using go.psutil disk.Partitions function instead of GetLogicalDriveStringsW wrapper --- pkg/snclient/check_drivesize_windows.go | 31 ++++++++++--------- .../check_drivesize_windows_win32api.go | 6 ++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pkg/snclient/check_drivesize_windows.go b/pkg/snclient/check_drivesize_windows.go index f8a39412..03a93d41 100644 --- a/pkg/snclient/check_drivesize_windows.go +++ b/pkg/snclient/check_drivesize_windows.go @@ -349,24 +349,25 @@ func (l *CheckDrivesize) setDeviceInfo(drive map[string]string) { } } -// adds all logical drives to the requiredDisks -// this function is better suited for usage with-network drives. gopsutil has disk.Partitions, but that does not work with network drives -func (l *CheckDrivesize) setDrives(requiredDrives map[string]map[string]string) (err error) { - logicalDrives, err := GetLogicalDriveStrings(1024) - if err != nil { - log.Debug("Error when getting logical drive strings: %s", err.Error()) - } - - for _, logicalDrive := range logicalDrives { - entry, ok := requiredDrives[logicalDrive] +// gopsutil disk.Partition had an issue with Bitlocker, but a fix was upstreamed +// use it instead of custom wrapper around GetLogicalDriveStringsW +func (l *CheckDrivesize) setDrives(requiredDisks map[string]map[string]string) (err error) { + partitions, err := disk.Partitions(true) + if err != nil && len(partitions) == 0 { + return fmt.Errorf("disk partitions failed: %s", err.Error()) + } + for _, partition := range partitions { + drive := strings.TrimSuffix(partition.Device, "\\") + "\\" + entry, ok := requiredDisks[drive] if !ok { entry = make(map[string]string) } - entry["drive"] = logicalDrive - entry["drive_or_id"] = logicalDrive - entry["drive_or_name"] = logicalDrive - entry["letter"] = fmt.Sprintf("%c", logicalDrive[0]) - requiredDrives[logicalDrive] = entry + entry["drive"] = drive + entry["drive_or_id"] = drive + entry["drive_or_name"] = drive + entry["letter"] = fmt.Sprintf("%c", drive[0]) + entry["fstype"] = partition.Fstype + requiredDisks[drive] = entry } return nil diff --git a/pkg/snclient/check_drivesize_windows_win32api.go b/pkg/snclient/check_drivesize_windows_win32api.go index 8eddf167..d2a7ed5c 100644 --- a/pkg/snclient/check_drivesize_windows_win32api.go +++ b/pkg/snclient/check_drivesize_windows_win32api.go @@ -97,6 +97,12 @@ func GetLogicalDriveStrings(nBufferLength uint32) (logicalDrives []string, err e // There are multiple drives in the returned string, separated by a NULL character for index := 0; uintptr(index) < returnValue; { decodedDriveStr := windows.UTF16ToString(lpBuffer[index:]) + if decodedDriveStr == "" { + // At the end there is are two consecutive null terminators + // One from the last drive C-string + // One that denotes the end of strings + break + } logicalDrives = append(logicalDrives, decodedDriveStr) index += len(decodedDriveStr) + 1 } From e5db437a83315f0e9c9458875588671780e3ecdd Mon Sep 17 00:00:00 2001 From: Ahmet Oeztuerk Date: Fri, 23 Jan 2026 14:14:44 +0100 Subject: [PATCH 2/4] check_drivesize fix drive discovery - part 2 --- pkg/snclient/check_drivesize_windows.go | 5 +++-- pkg/snclient/check_drivesize_windows_win32api.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/snclient/check_drivesize_windows.go b/pkg/snclient/check_drivesize_windows.go index 03a93d41..60e6ad5b 100644 --- a/pkg/snclient/check_drivesize_windows.go +++ b/pkg/snclient/check_drivesize_windows.go @@ -575,12 +575,13 @@ func (l *CheckDrivesize) setCustomPath(path string, requiredDisks map[string]map // adds all network shares to requiredDisks func (l *CheckDrivesize) setShares(requiredDisks map[string]map[string]string) { - logicalDrives, err := GetLogicalDriveStrings(1024) + partitions, err := disk.Partitions(true) if err != nil { log.Debug("Error when getting logical drive strings: %s", err.Error()) } - for _, logicalDrive := range logicalDrives { + for _, partition := range partitions { + logicalDrive := strings.TrimSuffix(partition.Device, "\\") + "\\" driveType, err := GetDriveType(logicalDrive) if err != nil { log.Debug("Error when getting the drive type for logical drive %s network drives: %s", logicalDrive, err.Error()) diff --git a/pkg/snclient/check_drivesize_windows_win32api.go b/pkg/snclient/check_drivesize_windows_win32api.go index d2a7ed5c..202d9d21 100644 --- a/pkg/snclient/check_drivesize_windows_win32api.go +++ b/pkg/snclient/check_drivesize_windows_win32api.go @@ -70,6 +70,7 @@ var ( wNetGetConnectionW = winnetwkDll.NewProc("WNetGetConnectionW") ) +// this function is not being used anymore, as gopsutil disk.Partitions() is fixed func GetLogicalDriveStrings(nBufferLength uint32) (logicalDrives []string, err error) { // We are using getLogicalDriveStringsW , which uses Long Width Chars From 2b413c525362402cb177cc7558788e4e467124b4 Mon Sep 17 00:00:00 2001 From: Ahmet Ozturk Date: Fri, 23 Jan 2026 13:22:40 +0000 Subject: [PATCH 3/4] check_drivesize fix drive discovery - part 3 --- pkg/snclient/check_drivesize_windows.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/snclient/check_drivesize_windows.go b/pkg/snclient/check_drivesize_windows.go index 60e6ad5b..733ee638 100644 --- a/pkg/snclient/check_drivesize_windows.go +++ b/pkg/snclient/check_drivesize_windows.go @@ -357,17 +357,17 @@ func (l *CheckDrivesize) setDrives(requiredDisks map[string]map[string]string) ( return fmt.Errorf("disk partitions failed: %s", err.Error()) } for _, partition := range partitions { - drive := strings.TrimSuffix(partition.Device, "\\") + "\\" - entry, ok := requiredDisks[drive] + logicalDrive := strings.TrimSuffix(partition.Device, "\\") + "\\" + entry, ok := requiredDisks[logicalDrive] if !ok { entry = make(map[string]string) } - entry["drive"] = drive - entry["drive_or_id"] = drive - entry["drive_or_name"] = drive - entry["letter"] = fmt.Sprintf("%c", drive[0]) + entry["drive"] = logicalDrive + entry["drive_or_id"] = logicalDrive + entry["drive_or_name"] = logicalDrive + entry["letter"] = fmt.Sprintf("%c", logicalDrive[0]) entry["fstype"] = partition.Fstype - requiredDisks[drive] = entry + requiredDisks[logicalDrive] = entry } return nil @@ -577,7 +577,7 @@ func (l *CheckDrivesize) setCustomPath(path string, requiredDisks map[string]map func (l *CheckDrivesize) setShares(requiredDisks map[string]map[string]string) { partitions, err := disk.Partitions(true) if err != nil { - log.Debug("Error when getting logical drive strings: %s", err.Error()) + log.Debug("Error when discovering partitions: %s", err.Error()) } for _, partition := range partitions { From 6f846e4830f0e9581c789f50d843747d1dcfde8a Mon Sep 17 00:00:00 2001 From: Ahmet Ozturk Date: Fri, 23 Jan 2026 13:25:23 +0000 Subject: [PATCH 4/4] rename the setDrives argument --- pkg/snclient/check_drivesize_windows.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/snclient/check_drivesize_windows.go b/pkg/snclient/check_drivesize_windows.go index 733ee638..f1a6df93 100644 --- a/pkg/snclient/check_drivesize_windows.go +++ b/pkg/snclient/check_drivesize_windows.go @@ -351,14 +351,14 @@ func (l *CheckDrivesize) setDeviceInfo(drive map[string]string) { // gopsutil disk.Partition had an issue with Bitlocker, but a fix was upstreamed // use it instead of custom wrapper around GetLogicalDriveStringsW -func (l *CheckDrivesize) setDrives(requiredDisks map[string]map[string]string) (err error) { +func (l *CheckDrivesize) setDrives(requiredDrives map[string]map[string]string) (err error) { partitions, err := disk.Partitions(true) if err != nil && len(partitions) == 0 { return fmt.Errorf("disk partitions failed: %s", err.Error()) } for _, partition := range partitions { logicalDrive := strings.TrimSuffix(partition.Device, "\\") + "\\" - entry, ok := requiredDisks[logicalDrive] + entry, ok := requiredDrives[logicalDrive] if !ok { entry = make(map[string]string) } @@ -367,7 +367,7 @@ func (l *CheckDrivesize) setDrives(requiredDisks map[string]map[string]string) ( entry["drive_or_name"] = logicalDrive entry["letter"] = fmt.Sprintf("%c", logicalDrive[0]) entry["fstype"] = partition.Fstype - requiredDisks[logicalDrive] = entry + requiredDrives[logicalDrive] = entry } return nil