Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Reading sectors

Reading sectors

Scheduled Pinned Locked Moved C / C++ / MFC
debugginghelpquestionworkspace
23 Posts 5 Posters 4 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • _ _Flaviu

    I have written a little piece of code to read few (first 512) bytes from USB drive. here is the code:

    HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
    	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
    	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
    TRACE("Volume handle: %p\\n", hVolume);
    LONG lDistLow = 0;
    PLONG plDistHigh = 0;
    if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lDistLow, plDistHigh, FILE\_BEGIN) &&
    	NO\_ERROR != GetLastError())
    {
    	TRACE("Error: %d\\n", GetLastError());
    	return FALSE;
    }
    else
    {
    	TRACE("%d\\t%d\\n", lDistLow, plDistHigh);
    }
    
    DWORD dwLen = 512;
    DWORD dwNum = 0;
    void\* pBuffer = NULL;
    ReadFile(hVolume, pBuffer, dwLen, &dwNum, NULL);
    TRACE("%p\\t%d\\t%d\\n", pBuffer, dwLen, dwNum);
    

    but the result is:

    Volume handle: 00000438
    0 0
    00000000 512 0

    this pBuffer NULL tell me that I am not able to read that sectors ... why ? The program is running as admin and sVolume is feed by _T("\\\\.\\F:"), first TRACE macro printed is a prove that is OK that part. SetFilePointer is used to position the reading part, and I intend to setup offset to the beginning, right ?

    V Offline
    V Offline
    Victor Nijegorodov
    wrote on last edited by
    #2

    What does ReadFile return? TRUE or FALSE?

    _ 1 Reply Last reply
    0
    • _ _Flaviu

      I have written a little piece of code to read few (first 512) bytes from USB drive. here is the code:

      HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
      	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
      	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
      TRACE("Volume handle: %p\\n", hVolume);
      LONG lDistLow = 0;
      PLONG plDistHigh = 0;
      if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lDistLow, plDistHigh, FILE\_BEGIN) &&
      	NO\_ERROR != GetLastError())
      {
      	TRACE("Error: %d\\n", GetLastError());
      	return FALSE;
      }
      else
      {
      	TRACE("%d\\t%d\\n", lDistLow, plDistHigh);
      }
      
      DWORD dwLen = 512;
      DWORD dwNum = 0;
      void\* pBuffer = NULL;
      ReadFile(hVolume, pBuffer, dwLen, &dwNum, NULL);
      TRACE("%p\\t%d\\t%d\\n", pBuffer, dwLen, dwNum);
      

      but the result is:

      Volume handle: 00000438
      0 0
      00000000 512 0

      this pBuffer NULL tell me that I am not able to read that sectors ... why ? The program is running as admin and sVolume is feed by _T("\\\\.\\F:"), first TRACE macro printed is a prove that is OK that part. SetFilePointer is used to position the reading part, and I intend to setup offset to the beginning, right ?

      G Offline
      G Offline
      Graham Breach
      wrote on last edited by
      #3

      Your pBuffer value is NULL, so you are trying to read data into the memory address 0 - you have to allocate some space to read the data into and use that for your pBuffer value. For 512 bytes a stack-based array should do the trick.

      1 Reply Last reply
      0
      • _ _Flaviu

        I have written a little piece of code to read few (first 512) bytes from USB drive. here is the code:

        HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
        	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
        	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
        TRACE("Volume handle: %p\\n", hVolume);
        LONG lDistLow = 0;
        PLONG plDistHigh = 0;
        if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lDistLow, plDistHigh, FILE\_BEGIN) &&
        	NO\_ERROR != GetLastError())
        {
        	TRACE("Error: %d\\n", GetLastError());
        	return FALSE;
        }
        else
        {
        	TRACE("%d\\t%d\\n", lDistLow, plDistHigh);
        }
        
        DWORD dwLen = 512;
        DWORD dwNum = 0;
        void\* pBuffer = NULL;
        ReadFile(hVolume, pBuffer, dwLen, &dwNum, NULL);
        TRACE("%p\\t%d\\t%d\\n", pBuffer, dwLen, dwNum);
        

        but the result is:

        Volume handle: 00000438
        0 0
        00000000 512 0

        this pBuffer NULL tell me that I am not able to read that sectors ... why ? The program is running as admin and sVolume is feed by _T("\\\\.\\F:"), first TRACE macro printed is a prove that is OK that part. SetFilePointer is used to position the reading part, and I intend to setup offset to the beginning, right ?

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #4

        _Flaviu wrote:

        pBuffer NULL tell me that I am not able to read that sectors

        No, pBuffer = NULL; tells you that you have not allocated any space to pBuffer. And don't use void* unless you are trying to allocate nothing. You can allocate space either of the following ways.

        unsigned char* pBuffer = new unsigned char[dwLen]; // allocate some space for the data to be read into
        // or
        unsigned char buffer[dwLen]; // allocate on the stack
        ReadFile(hVolume, buffer, dwLen, &dwNum, NULL);

        _ 1 Reply Last reply
        0
        • _ _Flaviu

          I have written a little piece of code to read few (first 512) bytes from USB drive. here is the code:

          HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
          	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
          	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
          TRACE("Volume handle: %p\\n", hVolume);
          LONG lDistLow = 0;
          PLONG plDistHigh = 0;
          if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lDistLow, plDistHigh, FILE\_BEGIN) &&
          	NO\_ERROR != GetLastError())
          {
          	TRACE("Error: %d\\n", GetLastError());
          	return FALSE;
          }
          else
          {
          	TRACE("%d\\t%d\\n", lDistLow, plDistHigh);
          }
          
          DWORD dwLen = 512;
          DWORD dwNum = 0;
          void\* pBuffer = NULL;
          ReadFile(hVolume, pBuffer, dwLen, &dwNum, NULL);
          TRACE("%p\\t%d\\t%d\\n", pBuffer, dwLen, dwNum);
          

          but the result is:

          Volume handle: 00000438
          0 0
          00000000 512 0

          this pBuffer NULL tell me that I am not able to read that sectors ... why ? The program is running as admin and sVolume is feed by _T("\\\\.\\F:"), first TRACE macro printed is a prove that is OK that part. SetFilePointer is used to position the reading part, and I intend to setup offset to the beginning, right ?

          _ Offline
          _ Offline
          _Superman_
          wrote on last edited by
          #5

          As others have pointed out, the issue is with pBuffer not associated with any allocated memory. In addition to this, I would like to point out one more flaw in your code, although it doesn't matter in this case. The third parameter to SetFilePointer[^] must be an address of a LONG variable. PLONG does not declare a LONG variable. It's only a pointer to a LONG variable. Here SetFilePointer will actually try to write to memory 0. What you need to do is declare a LONG variable and provide its address -

          LONG highValue; SetFilePointer(..., ..., &highValue, ...);

          You can also pass a nullptr, if you're not intersted in that value.

          «_Superman_»  _I love work. It gives me something to do between weekends.

          _Microsoft MVP (Visual C++) (October 2009 - September 2013)

          Polymorphism in C

          _ 1 Reply Last reply
          0
          • V Victor Nijegorodov

            What does ReadFile return? TRUE or FALSE?

            _ Offline
            _ Offline
            _Flaviu
            wrote on last edited by
            #6

            The ReadFile function returned FALSE, which tell me that reading has failed.

            V 1 Reply Last reply
            0
            • _ _Superman_

              As others have pointed out, the issue is with pBuffer not associated with any allocated memory. In addition to this, I would like to point out one more flaw in your code, although it doesn't matter in this case. The third parameter to SetFilePointer[^] must be an address of a LONG variable. PLONG does not declare a LONG variable. It's only a pointer to a LONG variable. Here SetFilePointer will actually try to write to memory 0. What you need to do is declare a LONG variable and provide its address -

              LONG highValue; SetFilePointer(..., ..., &highValue, ...);

              You can also pass a nullptr, if you're not intersted in that value.

              «_Superman_»  _I love work. It gives me something to do between weekends.

              _Microsoft MVP (Visual C++) (October 2009 - September 2013)

              Polymorphism in C

              _ Offline
              _ Offline
              _Flaviu
              wrote on last edited by
              #7

              It will interest me, not this time, but in the real program. I modified the code like this:

              LONG lValueLow = 0;
              LONG lValueHigh = 0;
              if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lValueLow, &lValueHigh, FILE\_BEGIN) &&
              	NO\_ERROR != GetLastError())
              {
              	TRACE("Error: %d\\n", GetLastError());
              	return FALSE;
              }
              else
              {
              	TRACE("%d\\t%d\\n", lValueLow, lValueHigh);
              }
              

              Thank you Superman !

              L 1 Reply Last reply
              0
              • L Lost User

                _Flaviu wrote:

                pBuffer NULL tell me that I am not able to read that sectors

                No, pBuffer = NULL; tells you that you have not allocated any space to pBuffer. And don't use void* unless you are trying to allocate nothing. You can allocate space either of the following ways.

                unsigned char* pBuffer = new unsigned char[dwLen]; // allocate some space for the data to be read into
                // or
                unsigned char buffer[dwLen]; // allocate on the stack
                ReadFile(hVolume, buffer, dwLen, &dwNum, NULL);

                _ Offline
                _ Offline
                _Flaviu
                wrote on last edited by
                #8

                Is not accepted:

                unsigned char buffer[dwLen]; // error C2057: expected constant expression

                Of course, putting 512 is ok, but I need to allocate that length of buffer through a variable. I prefer this option, on stack, as far as I know, is faster than heap.

                L 1 Reply Last reply
                0
                • _ _Flaviu

                  The ReadFile function returned FALSE, which tell me that reading has failed.

                  V Offline
                  V Offline
                  Victor Nijegorodov
                  wrote on last edited by
                  #9

                  In this case you have to call GetLastError to obtain the exact reason of the failure!

                  _ 1 Reply Last reply
                  0
                  • V Victor Nijegorodov

                    In this case you have to call GetLastError to obtain the exact reason of the failure!

                    _ Offline
                    _ Offline
                    _Flaviu
                    wrote on last edited by
                    #10

                    I didn't feed correctly the buffer. After I setup correctly that parameter, ReadFile return TRUE.

                    1 Reply Last reply
                    0
                    • _ _Flaviu

                      Is not accepted:

                      unsigned char buffer[dwLen]; // error C2057: expected constant expression

                      Of course, putting 512 is ok, but I need to allocate that length of buffer through a variable. I prefer this option, on stack, as far as I know, is faster than heap.

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #11

                      You can fix that easily by doing it this way:

                      #define SECTOR_SIZE 512
                      DWORD dwLen = SECTOR_SIZE;
                      DWORD dwNum = 0;
                      char buffer[SECTOR_SIZE];
                      ReadFile(hVolume, buffer, dwLen, &dwNum, NULL);

                      If you are using C++ then instead of #define you can use this:

                      const int SECTOR_SIZE = 512

                      _ 1 Reply Last reply
                      0
                      • L Lost User

                        You can fix that easily by doing it this way:

                        #define SECTOR_SIZE 512
                        DWORD dwLen = SECTOR_SIZE;
                        DWORD dwNum = 0;
                        char buffer[SECTOR_SIZE];
                        ReadFile(hVolume, buffer, dwLen, &dwNum, NULL);

                        If you are using C++ then instead of #define you can use this:

                        const int SECTOR_SIZE = 512

                        _ Offline
                        _ Offline
                        _Flaviu
                        wrote on last edited by
                        #12

                        Good idea. I have tried in this way:

                        CByteArray arrByte;
                        arrByte.SetSize(512);
                        BOOL bRet = ReadFile(hVolume, arrByte.GetData(), dwLen, &dwNum, NULL);
                        

                        and seem to go well.

                        L 1 Reply Last reply
                        0
                        • _ _Flaviu

                          It will interest me, not this time, but in the real program. I modified the code like this:

                          LONG lValueLow = 0;
                          LONG lValueHigh = 0;
                          if (INVALID\_SET\_FILE\_POINTER == SetFilePointer(hVolume, lValueLow, &lValueHigh, FILE\_BEGIN) &&
                          	NO\_ERROR != GetLastError())
                          {
                          	TRACE("Error: %d\\n", GetLastError());
                          	return FALSE;
                          }
                          else
                          {
                          	TRACE("%d\\t%d\\n", lValueLow, lValueHigh);
                          }
                          

                          Thank you Superman !

                          L Offline
                          L Offline
                          Lost User
                          wrote on last edited by
                          #13

                          You do not need lValueHigh unless the distance to move is a 64 bit value: just specify NULL instead. Also I suggest you study the difference between a variable and a pointer to a variable, you seem somewhat confused about it.

                          _ 1 Reply Last reply
                          0
                          • L Lost User

                            You do not need lValueHigh unless the distance to move is a 64 bit value: just specify NULL instead. Also I suggest you study the difference between a variable and a pointer to a variable, you seem somewhat confused about it.

                            _ Offline
                            _ Offline
                            _Flaviu
                            wrote on last edited by
                            #14

                            Understood now, I didn't paid attention on that function (lpDistanceToMoveHigh, is obviously now, or, at least I think is obviously).

                            1 Reply Last reply
                            0
                            • _ _Flaviu

                              Good idea. I have tried in this way:

                              CByteArray arrByte;
                              arrByte.SetSize(512);
                              BOOL bRet = ReadFile(hVolume, arrByte.GetData(), dwLen, &dwNum, NULL);
                              

                              and seem to go well.

                              L Offline
                              L Offline
                              Lost User
                              wrote on last edited by
                              #15

                              If you are writing MFC code then you should be using CFile to handle all your I/O.

                              _ 2 Replies Last reply
                              0
                              • L Lost User

                                If you are writing MFC code then you should be using CFile to handle all your I/O.

                                _ Offline
                                _ Offline
                                _Flaviu
                                wrote on last edited by
                                #16

                                I'll try to use CFile Class | Microsoft Docs[^] Can I replace SetFilePointer as well with something from MFC yard ?

                                V L 2 Replies Last reply
                                0
                                • _ _Flaviu

                                  I'll try to use CFile Class | Microsoft Docs[^] Can I replace SetFilePointer as well with something from MFC yard ?

                                  V Offline
                                  V Offline
                                  Victor Nijegorodov
                                  wrote on last edited by
                                  #17

                                  [CFile Class | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/mfc/reference/cfile-class?view=vs-2019#seek)

                                  1 Reply Last reply
                                  0
                                  • _ _Flaviu

                                    I'll try to use CFile Class | Microsoft Docs[^] Can I replace SetFilePointer as well with something from MFC yard ?

                                    L Offline
                                    L Offline
                                    Lost User
                                    wrote on last edited by
                                    #18

                                    CFile Class.Seek | Microsoft Docs[^]. You need to read through all the documentation for the class to see what is available.

                                    _ 1 Reply Last reply
                                    0
                                    • L Lost User

                                      CFile Class.Seek | Microsoft Docs[^]. You need to read through all the documentation for the class to see what is available.

                                      _ Offline
                                      _ Offline
                                      _Flaviu
                                      wrote on last edited by
                                      #19

                                      I should know that ... thank you.

                                      1 Reply Last reply
                                      0
                                      • L Lost User

                                        If you are writing MFC code then you should be using CFile to handle all your I/O.

                                        _ Offline
                                        _ Offline
                                        _Flaviu
                                        wrote on last edited by
                                        #20

                                        Good idea. I have few troubles with accessing USB drive with CFile, but once I'll solve it, the code will be simple. Here is my trial, none on them has worked:

                                        file.Open(_T("\\\\.\\F:"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                        file.Open(_T("F:"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                        file.Open(_T("F:\\"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                        HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
                                        	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
                                        	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
                                        CFile file(hVolume);
                                        CFileStatus status;
                                        file.GetStatus(status); // return FALSE
                                        
                                        V L 2 Replies Last reply
                                        0
                                        • _ _Flaviu

                                          Good idea. I have few troubles with accessing USB drive with CFile, but once I'll solve it, the code will be simple. Here is my trial, none on them has worked:

                                          file.Open(_T("\\\\.\\F:"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                          file.Open(_T("F:"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                          file.Open(_T("F:\\"), CFile::modeRead | CFile::osSequentialScan); // return FALSE

                                          HANDLE hVolume = ::CreateFile(sVolume, GENERIC\_READ,
                                          	FILE\_SHARE\_READ | FILE\_SHARE\_WRITE, 
                                          	NULL, OPEN\_EXISTING, FILE\_FLAG\_SEQUENTIAL\_SCAN, NULL);
                                          CFile file(hVolume);
                                          CFileStatus status;
                                          file.GetStatus(status); // return FALSE
                                          
                                          V Offline
                                          V Offline
                                          Victor Nijegorodov
                                          wrote on last edited by
                                          #21

                                          When using CFile::Open you should pass the CFileException* parameter to get the failure cause if CFile::Open fails. See the example in [CFile::Open](https://docs.microsoft.com/en-us/cpp/mfc/reference/cfile-class?view=vs-2019#open)

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups