[filedisk] Add MBR check for GRUB4DOS disks
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 1 Jun 2010 07:09:12 +0000 (03:09 -0400)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 1 Jun 2010 07:09:12 +0000 (03:09 -0400)
We lack any good means of finding the correct backing disk for
a boot-time file-backed disk.  Here is a really cheap check
which will test for an MBR where we would expect on on the
backing disk.  This doesn't support CD/DVD, obviously.

src/winvblock/filedisk/grub4dos.c

index 272ac06..9758d34 100644 (file)
@@ -55,7 +55,37 @@ check_disk_match (
   IN filedisk__type_ptr filedisk_ptr
  )
 {
-  return STATUS_SUCCESS;
+  mbr_ptr buf;
+  NTSTATUS status;
+  IO_STATUS_BLOCK io_status;
+  winvblock__bool pass = FALSE;
+
+  /*
+   * Allocate a buffer for testing for an MBR
+   */
+  buf = ExAllocatePool ( NonPagedPool, sizeof ( mbr ) );
+  if ( buf == NULL )
+    return STATUS_INSUFFICIENT_RESOURCES;
+  /*
+   * Read in the buffer
+   */
+  status =
+    ZwReadFile ( file, NULL, NULL, NULL, &io_status, buf, sizeof ( mbr ),
+                &filedisk_ptr->offset, NULL );
+  if ( !NT_SUCCESS ( status ) )
+    return status;
+  /*
+   * Check for an MBR signature
+   */
+  if ( buf->mbr_sig == 0xaa55 )
+    pass = TRUE;
+  /*
+   * Free buffer and return status
+   */
+  ExFreePool ( buf );
+  if ( pass )
+    return STATUS_SUCCESS;
+  return STATUS_UNSUCCESSFUL;
 }
 
 /**