From 414d5688bf32856f5f702115a6e5f0da77e9d44a Mon Sep 17 00:00:00 2001 From: Serge Gautherie Date: Wed, 11 Jan 2017 08:29:59 +0100 Subject: [NTOSKRNL] reactos\ntoskrnl\fstub\fstubex.c: (See r49212) *Fix IopVerifyDiskSignature() usage. reactos\ntoskrnl\io\iomgr\arcname.c: (See r49131) *Fix IopVerifyDiskSignature() usage. (Thanks curiousone for initial report!) *Improve a DPRINT(1). *"Style" nits in IopVerifyDiskSignature(). CORE-12659 diff --git a/reactos/ntoskrnl/fstub/fstubex.c b/reactos/ntoskrnl/fstub/fstubex.c index b9be7fa..2aff5f5 100644 --- a/reactos/ntoskrnl/fstub/fstubex.c +++ b/reactos/ntoskrnl/fstub/fstubex.c @@ -1820,7 +1820,7 @@ IoGetBootDiskInformation(IN OUT PBOOTDISK_INFORMATION BootDiskInformation, IO_STATUS_BLOCK IoStatusBlock; CHAR Buffer[128], ArcBuffer[128]; NTSTATUS Status = STATUS_SUCCESS; - BOOLEAN SingleDisk, IsBootDiskInfoEx; + BOOLEAN SingleDisk, IsBootDiskInfoEx, IVDSSuccess; PARC_DISK_SIGNATURE ArcDiskSignature; PARC_DISK_INFORMATION ArcDiskInformation; PARTITION_INFORMATION_EX PartitionInformation; @@ -1941,15 +1941,16 @@ IoGetBootDiskInformation(IN OUT PBOOTDISK_INFORMATION BootDiskInformation, ArcDiskSignature = CONTAINING_RECORD(NextEntry, ARC_DISK_SIGNATURE, ListEntry); + /* If they matches, ie - * - There's only one disk for both BIOS and detected - * - Signatures are matching - * - This is MBR - * (We don't check checksums here) + * - (There's only one disk for both BIOS and detected + * - Or Signatures are matching (We don't check Checksums here)) + * - And This is MBR */ + IVDSSuccess = IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature); if (((SingleDisk && DiskCount == 1) || - (IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature))) && - (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) + IVDSSuccess) && + DriveLayout->PartitionStyle == PARTITION_STYLE_MBR) { /* Create arc name */ sprintf(ArcBuffer, "\\ArcName\\%s", ArcDiskSignature->ArcName); @@ -1968,7 +1969,7 @@ IoGetBootDiskInformation(IN OUT PBOOTDISK_INFORMATION BootDiskInformation, } /* If IopVerifyDiskSignature returned no signature, take the one from DriveLayout */ - if (!Signature) + if (!IVDSSuccess || !Signature) { Signature = DriveLayout->Mbr.Signature; } diff --git a/reactos/ntoskrnl/io/iomgr/arcname.c b/reactos/ntoskrnl/io/iomgr/arcname.c index 6ef7dd0..d1158dd 100644 --- a/reactos/ntoskrnl/io/iomgr/arcname.c +++ b/reactos/ntoskrnl/io/iomgr/arcname.c @@ -428,7 +428,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, PULONG PartitionBuffer = NULL; IO_STATUS_BLOCK IoStatusBlock; CHAR Buffer[128], ArcBuffer[128]; - BOOLEAN NotEnabledPresent = FALSE; + BOOLEAN NotEnabledPresent = FALSE, IVDSSuccess; STORAGE_DEVICE_NUMBER DeviceNumber; PARC_DISK_SIGNATURE ArcDiskSignature; PWSTR SymbolicLinkList, lSymbolicLinkList; @@ -694,15 +694,15 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ListEntry); /* If they matches, ie - * - There's only one disk for both BIOS and detected/enabled - * - Signatures are matching - * - Checksums are matching - * - This is MBR + * - (There's only one disk for both BIOS and detected/enabled + * - Or Signatures and Checksums are matching) + * - And This is MBR */ + IVDSSuccess = IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature); if (((SingleDisk && DiskCount == 1) || - (IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature) && - (ArcDiskSignature->CheckSum + CheckSum == 0))) && - (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) + (IVDSSuccess && + (ArcDiskSignature->CheckSum + CheckSum == 0))) && + DriveLayout->PartitionStyle == PARTITION_STYLE_MBR) { /* Create device name */ sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != ULONG_MAX) ? DeviceNumber.DeviceNumber : DiskNumber); @@ -791,14 +791,14 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, else { /* In case there's a valid partition, a matching signature, - BUT a none matching checksum, or there's a duplicate - signature, or even worse a virus played with partition - table */ - if (ArcDiskSignature->Signature == Signature && - (ArcDiskSignature->CheckSum + CheckSum != 0) && - ArcDiskSignature->ValidPartitionTable) + BUT a nonmatching checksum, either there's a duplicate + signature, or even worse a virus may have played with + partition table */ + if (ArcDiskSignature->ValidPartitionTable && + (IVDSSuccess && ArcDiskSignature->Signature == Signature) && + (ArcDiskSignature->CheckSum + CheckSum != 0)) { - DPRINT("Be careful, or you have a duplicate disk signature, or a virus altered your MBR!\n"); + DPRINT1("Be careful: either you have a duplicate disk signature (0x%08lx), or your MBR was altered (possibly by a virus)!\n", Signature); } } } @@ -972,9 +972,9 @@ IopVerifyDiskSignature(IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, { /* Check we are using GPT and compare GUID */ if (ArcDiskSignature->IsGpt && - (((PULONG)ArcDiskSignature->GptSignature)[0] == DriveLayout->Gpt.DiskId.Data1 && - ((PUSHORT)ArcDiskSignature->GptSignature)[2] == DriveLayout->Gpt.DiskId.Data2 && - ((PUSHORT)ArcDiskSignature->GptSignature)[3] == DriveLayout->Gpt.DiskId.Data3 && + (((PULONG) ArcDiskSignature->GptSignature)[0] == DriveLayout->Gpt.DiskId.Data1 && + ((PUSHORT) ArcDiskSignature->GptSignature)[2] == DriveLayout->Gpt.DiskId.Data2 && + ((PUSHORT) ArcDiskSignature->GptSignature)[3] == DriveLayout->Gpt.DiskId.Data3 && ((PULONGLONG)ArcDiskSignature->GptSignature)[1] == ((PULONGLONG)DriveLayout->Gpt.DiskId.Data4)[0])) { /* There's no signature to give, so we just zero output */ @@ -982,6 +982,7 @@ IopVerifyDiskSignature(IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, { *Signature = 0; } + return TRUE; } }