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.
  • _ Offline
    _ Offline
    _Flaviu
    wrote on last edited by
    #1

    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 G L _ 4 Replies 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 ?

      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
                                          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