none
(Visual C#) Cannot Get ReadFile to work with a Physical Drive RRS feed

  • Question

  • I can get ReadFile to read a simple text file, but when I attempt to read a physical drive, I get the error "The parameter is incorrect."

    using System;
    using System.Runtime.InteropServices;
    
    namespace ReadFileTest
    {
        class Program
        {
            [DllImport("kernel32.dll")]
            static extern unsafe uint GetLastError();
    
            [DllImport("kernel32", SetLastError = true)]
            static extern unsafe System.IntPtr CreateFile
            (
                string FileName,          // file name
                uint DesiredAccess,       // access mode
                uint ShareMode,           // share mode
                uint SecurityAttributes,  // Security Attributes
                uint CreationDisposition, // how to create
                uint FlagsAndAttributes,  // file attributes
                int hTemplateFile         // handle to template file
            );
    
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern unsafe bool ReadFile
            (
                IntPtr hFile, 
                [Out] byte[] lpBuffer,
                uint nNumberOfBytesToRead, 
                out uint lpNumberOfBytesRead, 
                IntPtr lpOverlapped
            );
    
            const uint GENERIC_READ = 0x80000000;
            const uint GENERIC_WRITE = 0x050000000;
            const uint GENERIC_ALL = 0x10000000;
            const uint FILE_SHARE_READ = 1;
            const uint FILE_SHARE_WRITE = 2;
    
            const uint OPEN_EXISTING = 3;
            const int INVALID_HANDLE_VALUE = -1;
    
            static void Main(string[] args)
            {
                unsafe 
                {
                    // Reading a simple text file works perfectly:
                    //IntPtr handle = CreateFile("D:\\Test.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
                    
                    // CreateFile of a physical drive gives me a valid handle.
                    // But when attempting to read the drive, (all of my drives give the same result), I get the error "The parameter is incorrect."
                    IntPtr handle = CreateFile(@"\\.\PHYSICALDRIVE2", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
                    
                    // GetLastError returns this:
                    // ERROR_INVALID_PARAMETER87 (0x57)
                    // The parameter is incorrect.
    
                    byte[] b = { 1, 2, 3, 4, 5 };
                    uint n = 1;
    
                    while (n != 0)
                    {
                        bool ret = ReadFile(handle, b, (uint)5, out n, (IntPtr)0);
                        uint e = GetLastError();
                    }
    
                }
            }
        }
    }
    
    // I have unmounted the physical drive and run the test with the same results.
    // I tried using pointers for the parameters, same result.
    // I tried different variations of options for CreateFile.
    // Don't know which parameter is giving the error.
    

    Friday, January 9, 2015 4:38 PM

Answers

  • If the drive has real partitions on it, you will not be able to open the drive because of security.  This has been the case for a number of versions. What are you trying to do?


    Don Burn Windows Filesystem and Driver Consulting Website: http://www.windrvr.com

    Friday, January 9, 2015 4:44 PM

All replies

  • If the drive has real partitions on it, you will not be able to open the drive because of security.  This has been the case for a number of versions. What are you trying to do?


    Don Burn Windows Filesystem and Driver Consulting Website: http://www.windrvr.com

    Friday, January 9, 2015 4:44 PM
  • Trying to perform a low-level read on the hard drive.  CreateFile gives me a handle, so I assume there is no security issue.
    Friday, January 9, 2015 8:50 PM
  • You stated in the code comments CreateFile returned ERROR_INVALID_PARAMETER so where is the error coming from?

     

    Don Burn Windows Filesystem and Driver Consulting Website: http://www.windrvr.com

    Friday, January 9, 2015 9:30 PM