Skip to content

Commit c552565

Browse files
committed
Move WMI disk functions to cim package
1 parent baffaf6 commit c552565

File tree

4 files changed

+163
-52
lines changed

4 files changed

+163
-52
lines changed

pkg/cim/disk.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ const (
2323
// GPTPartitionTypeMicrosoftReserved is the GUID for Microsoft Reserved Partition (MSR)
2424
// Reserved by Windows for system use
2525
GPTPartitionTypeMicrosoftReserved = "{e3c9e316-0b5c-4db8-817d-f92df00215ae}"
26+
27+
// ErrorCodeCreatePartitionAccessPathAlreadyInUse is the error code (42002) returned when the driver letter failed to assign after partition created
28+
ErrorCodeCreatePartitionAccessPathAlreadyInUse = 42002
29+
)
30+
31+
var (
32+
DiskSelectorListForDiskNumberAndLocation = []string{"Number", "Location"}
33+
DiskSelectorListForPartitionStyle = []string{"PartitionStyle"}
34+
DiskSelectorListForPathAndSerialNumber = []string{"Path", "SerialNumber"}
35+
DiskSelectorListForIsOffline = []string{"IsOffline"}
36+
DiskSelectorListForSize = []string{"Size"}
2637
)
2738

2839
// QueryDiskByNumber retrieves disk information for a specific disk identified by its number.
@@ -77,6 +88,60 @@ func ListDisks(selectorList []string) ([]*storage.MSFT_Disk, error) {
7788
return disks, nil
7889
}
7990

91+
// InitializeDisk initializes a RAW disk with a particular partition style.
92+
//
93+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/initialize-msft-disk
94+
// for the WMI method definition.
95+
func InitializeDisk(disk *storage.MSFT_Disk, partitionStyle int) (int, error) {
96+
result, err := disk.InvokeMethodWithReturn("Initialize", int32(partitionStyle))
97+
return int(result), err
98+
}
99+
100+
// RefreshDisk Refreshes the cached disk layout information.
101+
//
102+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-disk-refresh
103+
// for the WMI method definition.
104+
func RefreshDisk(disk *storage.MSFT_Disk) (int, string, error) {
105+
var status string
106+
result, err := disk.InvokeMethodWithReturn("Refresh", &status)
107+
return int(result), status, err
108+
}
109+
110+
// CreatePartition creates a partition on a disk.
111+
//
112+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/createpartition-msft-disk
113+
// for the WMI method definition.
114+
func CreatePartition(disk *storage.MSFT_Disk, params ...interface{}) (int, error) {
115+
result, err := disk.InvokeMethodWithReturn("CreatePartition", params...)
116+
return int(result), err
117+
}
118+
119+
// SetDiskState takes a disk online or offline.
120+
//
121+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-disk-online and
122+
// https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-disk-offline
123+
// for the WMI method definition.
124+
func SetDiskState(disk *storage.MSFT_Disk, online bool) (int, string, error) {
125+
method := "Offline"
126+
if online {
127+
method = "Online"
128+
}
129+
130+
var status string
131+
result, err := disk.InvokeMethodWithReturn(method, &status)
132+
return int(result), status, err
133+
}
134+
135+
// RescanDisks rescans all changes by updating the internal cache of software objects (that is, Disks, Partitions, Volumes)
136+
// for the storage setting.
137+
//
138+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-storagesetting-updatehoststoragecache
139+
// for the WMI method definition.
140+
func RescanDisks() (int, error) {
141+
result, _, err := InvokeCimMethod(WMINamespaceStorage, "MSFT_StorageSetting", "UpdateHostStorageCache", nil)
142+
return result, err
143+
}
144+
80145
// GetDiskNumber returns the number of a disk.
81146
func GetDiskNumber(disk *storage.MSFT_Disk) (uint32, error) {
82147
number, err := disk.GetProperty("Number")
@@ -85,3 +150,41 @@ func GetDiskNumber(disk *storage.MSFT_Disk) (uint32, error) {
85150
}
86151
return uint32(number.(int32)), err
87152
}
153+
154+
// GetDiskLocation returns the location of a disk.
155+
func GetDiskLocation(disk *storage.MSFT_Disk) (string, error) {
156+
return disk.GetPropertyLocation()
157+
}
158+
159+
// GetDiskPartitionStyle returns the partition style of a disk.
160+
func GetDiskPartitionStyle(disk *storage.MSFT_Disk) (int32, error) {
161+
retValue, err := disk.GetProperty("PartitionStyle")
162+
if err != nil {
163+
return 0, err
164+
}
165+
return retValue.(int32), err
166+
}
167+
168+
// IsDiskOffline returns whether a disk is offline.
169+
func IsDiskOffline(disk *storage.MSFT_Disk) (bool, error) {
170+
return disk.GetPropertyIsOffline()
171+
}
172+
173+
// GetDiskSize returns the size of a disk.
174+
func GetDiskSize(disk *storage.MSFT_Disk) (int64, error) {
175+
sz, err := disk.GetProperty("Size")
176+
if err != nil {
177+
return -1, err
178+
}
179+
return strconv.ParseInt(sz.(string), 10, 64)
180+
}
181+
182+
// GetDiskPath returns the path of a disk.
183+
func GetDiskPath(disk *storage.MSFT_Disk) (string, error) {
184+
return disk.GetPropertyPath()
185+
}
186+
187+
// GetDiskSerialNumber returns the serial number of a disk.
188+
func GetDiskSerialNumber(disk *storage.MSFT_Disk) (string, error) {
189+
return disk.GetPropertySerialNumber()
190+
}

pkg/cim/volume.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,29 @@ func GetPartitionDiskNumber(part *storage.MSFT_Partition) (uint32, error) {
245245

246246
return uint32(diskNumber.(int32)), nil
247247
}
248+
249+
// SetPartitionState takes a partition online or offline.
250+
//
251+
// Refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-partition-online and
252+
// https://learn.microsoft.com/en-us/windows-hardware/drivers/storage/msft-partition-offline
253+
// for the WMI method definition.
254+
func SetPartitionState(part *storage.MSFT_Partition, online bool) (int, string, error) {
255+
method := "Offline"
256+
if online {
257+
method = "Online"
258+
}
259+
260+
var status string
261+
result, err := part.InvokeMethodWithReturn(method, &status)
262+
return int(result), status, err
263+
}
264+
265+
// FilterForPartitionOnDisk creates a WMI query filter to query a disk by its number.
266+
func FilterForPartitionOnDisk(diskNumber uint32) *query.WmiQueryFilter {
267+
return query.NewWmiQueryFilter("DiskNumber", strconv.Itoa(int(diskNumber)), query.Equals)
268+
}
269+
270+
// FilterForPartitionsOfTypeNormal creates a WMI query filter for all non-reserved partitions.
271+
func FilterForPartitionsOfTypeNormal() *query.WmiQueryFilter {
272+
return query.NewWmiQueryFilter("GptType", GPTPartitionTypeMicrosoftReserved, query.NotEquals)
273+
}

0 commit comments

Comments
 (0)