I hope it will be OK this time
Code: Select all
Structure PARTITION_INFORMATION
StartingOffset.q
PartitionLength.q
HiddenSectors.l
PartitionNumber.l
PartitionType.b
BootIndicator.b
RecognizedPartition.b
RewritePartition.b
dummy.l
EndStructure
Structure DRIVE_LAYOUT_INFORMATION
PartitionCount.l
Signature.l
PartitionEntry.PARTITION_INFORMATION[50]
EndStructure
Procedure.s GetPartitionType(type.b)
Select type
Case 0
ProcedureReturn "Unused"
Case 1
ProcedureReturn "12-bit FAT"
Case 2, 3
ProcedureReturn "Xenix"
Case 4
ProcedureReturn "16-bit FAT"
Case 5
ProcedureReturn "Extended"
Case 6
ProcedureReturn "Huge partition MS-DOS V4"
Case 7
ProcedureReturn "Installable File System (NTFS/HPFS/FAT64)"
Case 8
ProcedureReturn "OS/2 (v1.0-1.3 only)/AIX boot partition/Commodore DOS/SplitDrive/DELL partition spanning multiple drives/QNX 1.x and 2.x (qny)"
Case 9
ProcedureReturn "AIX data partition/Coherent filesystem/QNX 1.x and 2.x (qnz)"
Case $A
ProcedureReturn "OS/2 Boot Manager/OPUS/Coherent swap"
Case $B
ProcedureReturn "FAT32"
Case $C
ProcedureReturn "FAT32 using extended int13 services"
Case $E
ProcedureReturn "Win95 partition using extended int13 services"
Case $F
ProcedureReturn "Extended using extended int13 services"
Case $41
ProcedureReturn "PowerPC Reference Platform (PReP) Boot Partition"
Case $42
ProcedureReturn "Logical Disk Manager partition"
Case $63
ProcedureReturn "Unix"
Case $C0
ProcedureReturn "NTFT uses high order bits"
Case $80
ProcedureReturn "NTFT"
EndSelect
EndProcedure
Procedure.s SpaceDivider(space.q)
tm.s:mt.d=space: GroupDemicals.s = ","
If mt>1000: mt / 1024:tm = " KB":EndIf
If mt>1000: mt / 1024:tm = " MB":EndIf
If mt>1000: mt / 1024:tm = " GB":EndIf
If mt>1000: mt / 1024:tm = " TB":EndIf
ProcedureReturn ReplaceString(StrD(mt,3), ".", GroupDemicals) + tm
EndProcedure
IOCTL_DISK_GET_DRIVE_LAYOUT.l = 475148
aa.DRIVE_LAYOUT_INFORMATION
IOCTL_DISK_GET_PARTITION_INFO.l = 475140
bb.PARTITION_INFORMATION
Dim Drv(0)
Dim Part.q(0)
mask = GetLogicalDrives_()
For HDSpace = 0 To 31
If mask & (1 << HDSpace )
Drive$ = Chr(65+HDSpace)+":\"
Result = GetDriveType_(@Drive$)
If Result = 3
Partition$ = "\\.\\.\"+ Chr(65+HDSpace)+":"
hDrive = CreateFile_(Partition$,#GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ + #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
Result = DeviceIoControl_(hDrive,IOCTL_DISK_GET_PARTITION_INFO, #Null,0,@bb, SizeOf(PARTITION_INFORMATION), @BytesRet,0)
If Result = 1
CloseHandle_(hDrive)
ReDim Drv(x+1)
ReDim Part(x+1)
Drv(x+1) = 65+HDSpace
Part(x+1) = bb\PartitionLength
x + 1
EndIf
EndIf
EndIf
Next
For ii=0 To 49
; BytesRet = 0: tmp = 0
hdh.l = CreateFile_("\\.\PhysicalDrive" + Str(ii),#GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE,0, #OPEN_EXISTING, 0, 0)
Result = DeviceIoControl_(hdh,IOCTL_DISK_GET_DRIVE_LAYOUT, #Null,0,@aa, SizeOf(DRIVE_LAYOUT_INFORMATION), @BytesRet,0)
If Result = 1
For i=0 To aa\PartitionCount-1
If aa\PartitionEntry[i]\PartitionNumber > 0 And aa\PartitionEntry[i]\StartingOffset > 0
For k = 1 To x
If aa\PartitionEntry[i]\PartitionLength = part(k)
DriveLabel$ = Chr(Drv(k)) +":\"
EndIf
Next
Debug DriveLabel$ + " Partition # " + Str(aa\PartitionEntry[i]\PartitionNumber) + " "+GetPartitionType(aa\PartitionEntry[i]\PartitionType) + " , length = " + Str(aa\PartitionEntry[i]\PartitionLength) + " bytes (" + SpaceDivider(aa\PartitionEntry[i]\PartitionLength) + ")"
Debug "Starting Offset = " + Str(aa\PartitionEntry[i]\StartingOffset)
Debug "Partition Length = " + Str(aa\PartitionEntry[i]\PartitionLength)
Debug "Hidden Sectors = " + Str(aa\PartitionEntry[i]\HiddenSectors)
Debug "Partition Number = " + Str(aa\PartitionEntry[i]\PartitionNumber)
Debug "Partition Type = " + Str(aa\PartitionEntry[i]\PartitionType)
Debug "Boot Indicator = " + Str(aa\PartitionEntry[i]\BootIndicator)
Debug "Recognized Partition = " + Str(aa\PartitionEntry[i]\RecognizedPartition)
Debug "Rewrite Partition = " + Str(aa\PartitionEntry[i]\RewritePartition)
Debug "dummy = " + Str(aa\PartitionEntry[i]\dummy)
Debug "================"
EndIf
Next
Debug ""
EndIf
Next