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 ?

    _ 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
                                    • _ _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
                                      
                                      L Offline
                                      L Offline
                                      Lost User
                                      wrote on last edited by
                                      #22

                                      It is just the same as OpenFile behind the scenes so nothing to do with CFile. Your call probably fails because you are not including the share flags in your call to CFile::Open(), which are required when trying to access a device.

                                      _ 1 Reply Last reply
                                      0
                                      • L Lost User

                                        It is just the same as OpenFile behind the scenes so nothing to do with CFile. Your call probably fails because you are not including the share flags in your call to CFile::Open(), which are required when trying to access a device.

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

                                        Thanks, solved.

                                        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