Fix get_all_volumes for 64-bit python.

This commit is contained in:
voussoir 2021-08-24 22:34:09 -07:00
parent 3d29322cc1
commit 51d9a5202a
No known key found for this signature in database
GPG key ID: 5F7554F8C26DACCB

View file

@ -5,7 +5,12 @@ on Windows.
import ctypes import ctypes
import re import re
import string import string
kernel32 = ctypes.windll.kernel32 import ctypes.wintypes
kernel32 = ctypes.WinDLL('kernel32')
from voussoirkit import vlogging
log = vlogging.getLogger(__name__, 'windrives')
def get_all_volumes(): def get_all_volumes():
''' '''
@ -17,15 +22,33 @@ def get_all_volumes():
Thank you Duncan. Thank you Duncan.
https://stackoverflow.com/a/3075879 https://stackoverflow.com/a/3075879
Thank you Mark Tolonen.
https://stackoverflow.com/a/66976493
''' '''
type_unicode = ctypes.wintypes.LPCWSTR
type_dword = ctypes.wintypes.DWORD
type_handle = ctypes.wintypes.HANDLE
kernel32.FindFirstVolumeW.argtypes = (type_unicode, type_dword)
kernel32.FindFirstVolumeW.restype = type_handle
kernel32.FindNextVolumeW.argtypes = (type_handle, type_unicode, type_dword)
kernel32.FindNextVolumeW.restype = type_handle
kernel32.FindVolumeClose.argtypes = (type_handle,)
kernel32.FindVolumeClose.restype = type_handle
buffer = ctypes.create_unicode_buffer(1024)
buffer_size = ctypes.sizeof(buffer)
handle = kernel32.FindFirstVolumeW(buffer, buffer_size)
volumes = [] volumes = []
buf = ctypes.create_unicode_buffer(1024)
length = ctypes.c_int32()
handle = kernel32.FindFirstVolumeW(buf, ctypes.sizeof(buf))
if handle: if handle:
volumes.append(buf.value) volumes.append(buffer.value)
while kernel32.FindNextVolumeW(handle, buf, ctypes.sizeof(buf)): while kernel32.FindNextVolumeW(handle, buffer, buffer_size):
volumes.append(buf.value) volumes.append(buffer.value)
kernel32.FindVolumeClose(handle) kernel32.FindVolumeClose(handle)
return volumes return volumes
@ -149,12 +172,12 @@ def get_volume_mount(volume):
If it has two mount paths, only the first one is returned. If it has two mount paths, only the first one is returned.
So, I'll just use a single return value until further notice. So, I'll just use a single return value until further notice.
''' '''
buf = ctypes.create_unicode_buffer(1024) buffer = ctypes.create_unicode_buffer(1024)
length = ctypes.c_int32() length = ctypes.c_int32()
kernel32.GetVolumePathNamesForVolumeNameW( kernel32.GetVolumePathNamesForVolumeNameW(
ctypes.c_wchar_p(volume), ctypes.c_wchar_p(volume),
buf, buffer,
ctypes.sizeof(buf), ctypes.sizeof(buffer),
ctypes.pointer(length), ctypes.pointer(length),
) )
return buf.value return buffer.value