Author: pschweitzer Date: Mon Nov 10 18:26:34 2014 New Revision: 65367
URL: http://svn.reactos.org/svn/reactos?rev=65367&view=rev Log: [PARTTEST] Add a dummy application that will open first disk and check first sector for MBR and then will open first partition to check for something known (& not MBR)
Added: trunk/rostests/tests/parttest/ trunk/rostests/tests/parttest/CMakeLists.txt (with props) trunk/rostests/tests/parttest/parttest.c (with props)
Added: trunk/rostests/tests/parttest/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/tests/parttest/CMakeLists.... ============================================================================== --- trunk/rostests/tests/parttest/CMakeLists.txt (added) +++ trunk/rostests/tests/parttest/CMakeLists.txt [iso-8859-1] Mon Nov 10 18:26:34 2014 @@ -0,0 +1,4 @@ +add_executable(parttest parttest.c) +set_module_type(parttest win32cui) +add_importlibs(parttest ntdll msvcrt kernel32) +add_cd_file(TARGET parttest DESTINATION reactos/bin FOR all)
Propchange: trunk/rostests/tests/parttest/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/tests/parttest/parttest.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/tests/parttest/parttest.c?... ============================================================================== --- trunk/rostests/tests/parttest/parttest.c (added) +++ trunk/rostests/tests/parttest/parttest.c [iso-8859-1] Mon Nov 10 18:26:34 2014 @@ -0,0 +1,344 @@ +/* + * PROJECT: ReactOS partitions tests/dump + * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory + * PURPOSE: Open disk & partition trying to get information about volumes & MBR + * PROGRAMMER: Pierre Schweitzer pierre@reactos.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <winternl.h> + +#ifndef NT_SUCCESS +# define NT_SUCCESS(_Status) (((NTSTATUS)(_Status)) >= 0) +#endif + +#define SECTOR_SIZE 512 +#define BOOT_RECORD_SIGNATURE 0xAA55 + +PCWSTR DiskFormat = L"\Device\Harddisk%lu\Partition%lu"; + +#include <pshpack1.h> +typedef struct { + unsigned char magic0, res0, magic1; + unsigned char OEMName[8]; + unsigned short BytesPerSector; + unsigned char SectorsPerCluster; + unsigned short ReservedSectors; + unsigned char FATCount; + unsigned short RootEntries, Sectors; + unsigned char Media; + unsigned short FATSectors, SectorsPerTrack, Heads; + unsigned long HiddenSectors, SectorsHuge; + unsigned long FATSectors32; + unsigned short ExtFlag; + unsigned short FSVersion; + unsigned long RootCluster; + unsigned short FSInfoSector; + unsigned short BootBackup; + unsigned char Res3[12]; + unsigned char Drive; + unsigned char Res4; + unsigned char ExtBootSignature; + unsigned long VolumeID; + unsigned char VolumeLabel[11], SysType[8]; + unsigned char Res2[420]; + unsigned short Signature1; +} FATBootSector, *PFATBootSector; + +typedef struct { + UCHAR Jump[3]; + UCHAR OEMID[8]; + USHORT BytesPerSector; + UCHAR SectorsPerCluster; + UCHAR Unused0[7]; + UCHAR MediaId; + UCHAR Unused1[2]; + USHORT SectorsPerTrack; + USHORT Heads; + UCHAR Unused2[4]; + UCHAR Unused3[4]; + USHORT Unknown[2]; + ULONGLONG SectorCount; + ULONGLONG MftLocation; + ULONGLONG MftMirrLocation; + CHAR ClustersPerMftRecord; + UCHAR Unused4[3]; + CHAR ClustersPerIndexRecord; + UCHAR Unused5[3]; + ULONGLONG SerialNumber; + UCHAR Checksum[4]; + UCHAR BootStrap[426]; + USHORT EndSector; +} NTFSBootSector, *PNTFSBootSector; + +typedef struct { + UCHAR BootIndicator; + UCHAR StartHead; + UCHAR StartSector; + UCHAR StartCylinder; + UCHAR SystemIndicator; + UCHAR EndHead; + UCHAR EndSector; + UCHAR EndCylinder; + ULONG SectorCountBeforePartition; + ULONG PartitionSectorCount; +} PARTITION_TABLE_ENTRY, *PPARTITION_TABLE_ENTRY; + +typedef struct { + UCHAR MasterBootRecordCodeAndData[0x1B8]; + ULONG Signature; + USHORT Reserved; + PARTITION_TABLE_ENTRY PartitionTable[4]; + USHORT MasterBootRecordMagic; +} MASTER_BOOT_RECORD, *PMASTER_BOOT_RECORD; +#include <poppack.h> + +BOOL CheckAgainstFAT(PFATBootSector Sector) +{ + if (Sector->Signature1 != 0xaa55) + { + return FALSE; + } + + if (Sector->BytesPerSector != 512 && + Sector->BytesPerSector != 1024 && + Sector->BytesPerSector != 2048 && + Sector->BytesPerSector != 4096) + { + return FALSE; + } + + if (Sector->FATCount != 1 && + Sector->FATCount != 2) + { + return FALSE; + } + + if (Sector->Media != 0xf0 && + Sector->Media != 0xf8 && + Sector->Media != 0xf9 && + Sector->Media != 0xfa && + Sector->Media != 0xfb && + Sector->Media != 0xfc && + Sector->Media != 0xfd && + Sector->Media != 0xfe && + Sector->Media != 0xff) + { + return FALSE; + } + + if (Sector->SectorsPerCluster != 1 && + Sector->SectorsPerCluster != 2 && + Sector->SectorsPerCluster != 4 && + Sector->SectorsPerCluster != 8 && + Sector->SectorsPerCluster != 16 && + Sector->SectorsPerCluster != 32 && + Sector->SectorsPerCluster != 64 && + Sector->SectorsPerCluster != 128) + { + return FALSE; + } + + if (Sector->BytesPerSector * Sector->SectorsPerCluster > 32 * 1024) + { + return FALSE; + } + + return TRUE; +} + +BOOL CheckAgainstNTFS(PNTFSBootSector Sector) +{ + ULONG k; + ULONG ClusterSize; + + /* OEMID: this field must be NTFS */ + if (RtlCompareMemory(Sector->OEMID, "NTFS ", 8) != 8) + { + return FALSE; + } + + /* Unused0: this field must be COMPLETELY null */ + for (k = 0; k < 7; k++) + { + if (Sector->Unused0[k] != 0) + { + return FALSE; + } + } + + /* Unused3: this field must be COMPLETELY null */ + for (k = 0; k < 4; k++) + { + if (Sector->Unused3[k] != 0) + { + return FALSE; + } + } + + /* Check cluster size */ + ClusterSize = Sector->BytesPerSector * Sector->SectorsPerCluster; + if (ClusterSize != 512 && ClusterSize != 1024 && + ClusterSize != 2048 && ClusterSize != 4096 && + ClusterSize != 8192 && ClusterSize != 16384 && + ClusterSize != 32768 && ClusterSize != 65536) + { + return FALSE; + } + + return TRUE; +} + +BOOL CheckAgainstMBR(PMASTER_BOOT_RECORD Sector) +{ + if (Sector->MasterBootRecordMagic != BOOT_RECORD_SIGNATURE) + { + return FALSE; + } + + return TRUE; +} + +int main(int argc, char ** argv) +{ + HANDLE FileHandle; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + WCHAR Buffer[MAX_PATH]; + UNICODE_STRING Name; + PVOID Sector; + + Sector = malloc(SECTOR_SIZE); + if (Sector == NULL) + { + fprintf(stderr, "Failed allocating memory!\n"); + return 0; + } + + /* We first open disk */ + swprintf(Buffer, DiskFormat, 0, 0); + RtlInitUnicodeString(&Name, Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + 0, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + free(Sector); + fprintf(stderr, "Failed opening disk! %lx\n", Status); + return 0; + } + + /* Read first sector of the disk */ + Status = NtReadFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + Sector, + SECTOR_SIZE, + NULL, + NULL); + NtClose(FileHandle); + if (!NT_SUCCESS(Status)) + { + free(Sector); + fprintf(stderr, "Failed reading sector 0! %lx\n", Status); + return 0; + } + + /* Is it FAT? */ + if (CheckAgainstFAT(Sector)) + { + printf("Sector 0 seems to be FAT boot sector\n"); + } + /* Is it NTFS? */ + else if (CheckAgainstNTFS(Sector)) + { + printf("Sector 0 seems to be NTFS boot sector\n"); + } + /* Is it MBR? */ + else if (CheckAgainstMBR(Sector)) + { + printf("Sector 0 might be MBR\n"); + } + /* We don't support anything else */ + else + { + printf("Sector 0 not recognized\n"); + } + + /* Redo it with first partition */ + swprintf(Buffer, DiskFormat, 0, 1); + RtlInitUnicodeString(&Name, Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + free(Sector); + fprintf(stderr, "Failed opening partition! %lx\n", Status); + return 0; + } + + /* Read first sector of the partition */ + Status = NtReadFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + Sector, + SECTOR_SIZE, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + { + free(Sector); + fprintf(stderr, "Failed reading first sector of the partition! %lx\n", Status); + return 0; + } + + /* Is it FAT? */ + if (CheckAgainstFAT(Sector)) + { + printf("Seems to be a FAT partittion\n"); + } + /* Is it NTFS? */ + else if (CheckAgainstNTFS(Sector)) + { + printf("Seems to be a NTFS partition\n"); + } + /* Is it MBR? */ + else if (CheckAgainstMBR(Sector)) + { + printf("Seems to be MBR\n"); + } + /* We don't support anything else */ + else + { + printf("Not recognized\n"); + } + + free(Sector); + + return 0; +}
Propchange: trunk/rostests/tests/parttest/parttest.c ------------------------------------------------------------------------------ svn:eol-style = native