Search code examples
pythonctypesaccess-violationwindowserror

Python: WindowsError: exception: access violation reading 0x00000000


This short function is simply getting the available free space of a storage device, however I am getting the above error when running the code.

The function is:

def disk_space1(drive):
    freespace = ctypes.c_ulonglong()
    calcspace = ctypes.windll.kernel32.GetDiskFreeSpaceExA
    calcspace(drive, ctypes.byref(freespace))
    disk_size = freespace.value
    return disk_size

This function worked perfectly until today when it has stopped working for no reason, I haven't changed anything. What's baffling me the most is that the function works properly, if I print out the value of 'freespace' once running it, it has gone and found the correct value, but still gives the error.

What could have caused this issue?


Solution

  • You are not calling the full function signature which I believe is leading to access violations (due to random memory writes) and errors. The full function signature is (fully documented here):

    BOOL WINAPI GetDiskFreeSpaceEx(
      _In_opt_   LPCTSTR lpDirectoryName,
      _Out_opt_  PULARGE_INTEGER lpFreeBytesAvailable,
      _Out_opt_  PULARGE_INTEGER lpTotalNumberOfBytes,
      _Out_opt_  PULARGE_INTEGER lpTotalNumberOfFreeBytes
    );
    

    By changing the function to:

    def disk_space(drive):
        freespace = ctypes.c_ulonglong()
        calcspace = ctypes.windll.kernel32.GetDiskFreeSpaceExA
        err = calcspace(drive,
                        ctypes.byref(freespace),
                        None,
                        None)
        assert err != 0, 'calcspace failed'
        disk_size = freespace.value
        return disk_size
    

    I was able to run it without intermittent error.