mattymanza365
mattymanza365

Reputation: 45

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?

Upvotes: 2

Views: 12167

Answers (1)

cziemba
cziemba

Reputation: 664

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.

Upvotes: 5

Related Questions