[ROSAPPS:PARTINFO] Code formatting.

This commit is contained in:
Hermès Bélusca-Maïto 2020-11-26 01:25:53 +01:00
parent de16ef3da0
commit 118fa50269
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0

View file

@ -2,210 +2,206 @@
* partinfo - partition info program * partinfo - partition info program
*/ */
#include <stdio.h>
#include <stdlib.h>
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include <windows.h> #include <windows.h>
#include <stdlib.h>
#include <ntndk.h> #include <ntndk.h>
#include <stdio.h>
//#define DUMP_DATA // #define DUMP_DATA
#define DUMP_SIZE_INFO #define DUMP_SIZE_INFO
#ifdef DUMP_DATA #ifdef DUMP_DATA
void HexDump(char *buffer, ULONG size) void HexDump(
IN PVOID buffer,
IN ULONG size)
{ {
ULONG offset = 0; ULONG_PTR offset = 0;
unsigned char *ptr; PUCHAR ptr;
while (offset < (size & ~15)) while (offset < (size & ~15))
{ {
ptr = (unsigned char*)((ULONG)buffer + offset); ptr = (PUCHAR)((ULONG_PTR)buffer + offset);
printf("%08lx %02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx-%02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx\n", printf("%08lx %02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx-%02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx\n",
offset, offset,
ptr[0], ptr[0], ptr[1], ptr[2] , ptr[3] , ptr[4] , ptr[5] , ptr[6] , ptr[7],
ptr[1], ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]);
ptr[2],
ptr[3],
ptr[4],
ptr[5],
ptr[6],
ptr[7],
ptr[8],
ptr[9],
ptr[10],
ptr[11],
ptr[12],
ptr[13],
ptr[14],
ptr[15]);
offset += 16; offset += 16;
} }
ptr = (unsigned char*)((ULONG)buffer + offset); ptr = (PUCHAR)((ULONG_PTR)buffer + offset);
printf("%08lx ", offset); printf("%08lx ", offset);
while (offset < size) while (offset < size)
{ {
printf(" %02hx", *ptr); printf(" %02hx", *ptr);
offset++; offset++;
ptr++; ptr++;
} }
printf("\n\n\n"); printf("\n\n\n");
} }
#endif #endif
void Usage(void) void Usage(void)
{ {
puts("Usage: partinfo <drive number>"); puts("Usage: partinfo <drive number>");
} }
int main(int argc, char *argv[])
int main (int argc, char *argv[])
{ {
HANDLE hDisk; NTSTATUS Status;
DWORD dwRead; ULONG ulDrive;
DWORD i; HANDLE hDisk;
char *Buffer; DWORD dwRead;
DRIVE_LAYOUT_INFORMATION *LayoutBuffer; DWORD i;
DISK_GEOMETRY DiskGeometry; SYSTEM_DEVICE_INFORMATION DeviceInfo;
ULONG ulDrive; DISK_GEOMETRY DiskGeometry;
CHAR DriveName[40]; PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
SYSTEM_DEVICE_INFORMATION DeviceInfo; CHAR DriveName[40];
NTSTATUS Status;
if (argc != 2) if (argc != 2)
{ {
Usage(); Usage();
return(0); return 0;
} }
ulDrive = strtoul(argv[1], NULL, 10); ulDrive = strtoul(argv[1], NULL, 10);
if (errno != 0) if (errno != 0)
{ {
printf("Error: Malformed drive number\n"); printf("Error: Malformed drive number\n");
return(0); return 0;
} }
/* Check drive number */ /*
Status = NtQuerySystemInformation(SystemDeviceInformation, * Retrieve the number of disks on the system.
&DeviceInfo, */
sizeof(SYSTEM_DEVICE_INFORMATION), Status = NtQuerySystemInformation(SystemDeviceInformation,
&i); &DeviceInfo,
if (!NT_SUCCESS(Status)) sizeof(DeviceInfo),
&i);
if (!NT_SUCCESS(Status))
{ {
printf("NtQuerySystemInformation() failed (Status %lx)\n", Status); printf("NtQuerySystemInformation() failed (Status %lx)\n", Status);
return(0); return 0;
}
if (DeviceInfo.NumberOfDisks == 0)
{
printf("No disk drive installed!\n");
return 0;
} }
if (DeviceInfo.NumberOfDisks == 0) if (ulDrive >= DeviceInfo.NumberOfDisks)
{ {
printf("No disk drive installed!\n"); printf("Invalid disk drive number! Valid drive numbers [0-%lu]\n",
return(0); DeviceInfo.NumberOfDisks-1);
return 0;
} }
if (ulDrive >= DeviceInfo.NumberOfDisks) /* Build the full drive name */
sprintf(DriveName, "\\\\.\\PHYSICALDRIVE%lu", ulDrive);
/* Open the drive */
hDisk = CreateFileA(DriveName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{ {
printf("Invalid disk drive number! Valid drive numbers [0-%lu]\n", printf("Invalid disk handle!");
DeviceInfo.NumberOfDisks-1); return 0;
return(0);
} }
/* Build full drive name */ /*
sprintf(DriveName, "\\\\.\\PHYSICALDRIVE%lu", ulDrive); * Get the drive geometry.
*/
/* Open drive */ if (!DeviceIoControl(hDisk,
hDisk = CreateFileA(DriveName, IOCTL_DISK_GET_DRIVE_GEOMETRY,
GENERIC_READ, NULL,
FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
NULL, &DiskGeometry,
OPEN_EXISTING, sizeof(DiskGeometry),
0, &dwRead,
NULL); NULL))
if (hDisk == INVALID_HANDLE_VALUE)
{ {
printf("Invalid disk handle!"); printf("DeviceIoControl(IOCTL_DISK_GET_DRIVE_GEOMETRY) failed! Error: %lu\n",
return 0; GetLastError());
} CloseHandle(hDisk);
return 0;
/* Get drive geometry */
if (!DeviceIoControl(hDisk,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
&DiskGeometry,
sizeof(DISK_GEOMETRY),
&dwRead,
NULL))
{
CloseHandle(hDisk);
printf("DeviceIoControl failed! Error: %lu\n",
GetLastError());
return 0;
} }
#ifdef DUMP_DATA #ifdef DUMP_DATA
HexDump((char*)&DiskGeometry, dwRead); HexDump(&DiskGeometry, dwRead);
#endif #endif
printf("Drive number: %lu\n", ulDrive); printf("Drive number: %lu\n", ulDrive);
printf("Cylinders: %I64u\nMediaType: %x\nTracksPerCylinder: %lu\n" printf("Cylinders: %I64u\nMediaType: %x\nTracksPerCylinder: %lu\n"
"SectorsPerTrack: %lu\nBytesPerSector: %lu\n\n", "SectorsPerTrack: %lu\nBytesPerSector: %lu\n\n",
DiskGeometry.Cylinders.QuadPart, DiskGeometry.Cylinders.QuadPart,
DiskGeometry.MediaType, DiskGeometry.MediaType,
DiskGeometry.TracksPerCylinder, DiskGeometry.TracksPerCylinder,
DiskGeometry.SectorsPerTrack, DiskGeometry.SectorsPerTrack,
DiskGeometry.BytesPerSector); DiskGeometry.BytesPerSector);
#if 0 // TODO!
/* Get extended drive geometry */
// IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
#endif
Buffer = (char*)malloc(8192); /*
if (Buffer == NULL) * Retrieve the legacy partition layout
*/
LayoutBuffer = (PDRIVE_LAYOUT_INFORMATION)malloc(8192);
if (LayoutBuffer == NULL)
{ {
CloseHandle(hDisk); printf("Out of memory!");
printf("Out of memory!"); CloseHandle(hDisk);
return 0; return 0;
} }
memset(Buffer, 0, 8192); memset(LayoutBuffer, 0, 8192);
if (!DeviceIoControl(hDisk, if (!DeviceIoControl(hDisk,
IOCTL_DISK_GET_DRIVE_LAYOUT, IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL, NULL,
0, 0,
Buffer, LayoutBuffer,
8192, 8192,
&dwRead, &dwRead,
NULL)) NULL))
{ {
CloseHandle(hDisk); printf("DeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT) failed! Error: %lu\n",
printf("DeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT) failed! Error: %lu\n", GetLastError());
GetLastError()); CloseHandle(hDisk);
free(Buffer); free(LayoutBuffer);
return 0; return 0;
} }
CloseHandle(hDisk); CloseHandle(hDisk);
#ifdef DUMP_DATA #ifdef DUMP_DATA
HexDump(Buffer, dwRead); HexDump(LayoutBuffer, dwRead);
#endif #endif
LayoutBuffer = (DRIVE_LAYOUT_INFORMATION*)Buffer; printf("Partitions %lu Signature %lx\n",
LayoutBuffer->PartitionCount,
LayoutBuffer->Signature);
printf("Partitions %lu Signature %lx\n", for (i = 0; i < LayoutBuffer->PartitionCount; i++)
LayoutBuffer->PartitionCount,
LayoutBuffer->Signature);
for (i = 0; i < LayoutBuffer->PartitionCount; i++)
{ {
printf(" %ld: nr: %ld boot: %1x type: %x start: 0x%I64x count: 0x%I64x\n", printf(" %ld: nr: %ld boot: %1x type: %x start: 0x%I64x count: 0x%I64x\n",
i, i,
LayoutBuffer->PartitionEntry[i].PartitionNumber, LayoutBuffer->PartitionEntry[i].PartitionNumber,
LayoutBuffer->PartitionEntry[i].BootIndicator, LayoutBuffer->PartitionEntry[i].BootIndicator,
LayoutBuffer->PartitionEntry[i].PartitionType, LayoutBuffer->PartitionEntry[i].PartitionType,
LayoutBuffer->PartitionEntry[i].StartingOffset.QuadPart, LayoutBuffer->PartitionEntry[i].StartingOffset.QuadPart,
LayoutBuffer->PartitionEntry[i].PartitionLength.QuadPart); LayoutBuffer->PartitionEntry[i].PartitionLength.QuadPart);
} }
free(Buffer); free(LayoutBuffer);
return 0; // TODO: Retrieve the extended partition layout
return 0;
} }