Error when count raw partitions (unallocated space)
Posted: Fri Jul 12, 2024 6:23 am
I'm querying for allocated unallocated partitions, but am having problems with structural errors.
Please help me.
Thank you.
Please help me.
Thank you.
Code: Select all
#IOCTL_DISK_GET_DRIVE_LAYOUT = $7400c ; HEX
#IOCTL_DISK_GET_DRIVE_LAYOUT_EX = $70050 ; HEX
Procedure.i CountRawPartitionsByIndex(index.i)
Protected lpFileName.s = "\\.\PhysicalDrive" + Str(index)
Protected hDevice.i
Protected dwBytesReturned
Protected.b lpOutBuffer
Protected PartitionStyle.i
; Open the physical drive
hDevice = CreateFile_(lpFileName, #FILE_READ_ATTRIBUTES, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
If hDevice = #INVALID_HANDLE_VALUE
Debug "Failed to open device!"
ProcedureReturn -1
EndIf
; Determine partition style (MBR or GPT)
If DeviceIoControl_(hDevice, #IOCTL_DISK_GET_DRIVE_LAYOUT, 0, 0, @lpOutBuffer, SizeOf(lpOutBuffer), @dwBytesReturned, 0)
PartitionStyle = 0
ElseIf DeviceIoControl_(hDevice, #IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, @lpOutBuffer, SizeOf(lpOutBuffer), @dwBytesReturned, 0)
PartitionStyle = 1
Else
Debug "Failed to get partition layout!"
CloseHandle_(hDevice)
ProcedureReturn -1
EndIf
; Extract partition information based on partition style
If PartitionStyle = 0
; MBR partition style
Define pDriveLayout.p = lpOutBuffer
Define pPartitionEntry.p = @pDriveLayout\PartitionEntry[0]
; Count raw partitions (unallocated space)
Define RawPartitionCount.i = 0
For i = 0 To 3
If pPartitionEntry[i]\PartitionType = #PARTITION_ENTRY_UNUSED
Inc(RawPartitionCount)
EndIf
Next
ElseIf PartitionStyle = 1
; GPT partition style
Define pDriveLayoutEx.p = lpOutBuffer
Define pPartitionEntry.p = @pDriveLayoutEx\PartitionEntry[0]
; Count raw partitions (unallocated space)
Define RawPartitionCount.i = 0
For i = 0 To pDriveLayoutEx\PartitionCount - 1
If pPartitionEntry[i]\PartitionType = #PARTITION_ENTRY_UNUSED
Inc(RawPartitionCount)
EndIf
Next
EndIf
; Close the device handle
CloseHandle_(hDevice)
ProcedureReturn RawPartitionCount
EndProcedure
Debug CountRawPartitionsByIndex(0)