Fix get_all_volumes for 64-bit python.
This commit is contained in:
parent
3d29322cc1
commit
51d9a5202a
1 changed files with 34 additions and 11 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue