Было бы проще, если бы вы разместили исполняемый код: получить подходящее имя тома для этого вызова немного сложно. buf
- это массив, содержащий length
символов. Последние два символа являются нулевыми, поэтому игнорируйте их, преобразуйте массив в строку, используя ''.join()
, и разделите на нулевые символы.
import ctypes
kernel32 = ctypes.windll.kernel32
def volumes():
buf = ctypes.create_unicode_buffer(1024)
length = ctypes.c_int32()
handle = kernel32.FindFirstVolumeW(buf, ctypes.sizeof(buf))
if handle:
yield buf.value
while kernel32.FindNextVolumeW(handle, buf, ctypes.sizeof(buf)):
yield buf.value
kernel32.FindVolumeClose(handle)
def VolumePathNames(volume):
buf = ctypes.create_unicode_buffer(1024)
length = ctypes.c_int32()
kernel32.GetVolumePathNamesForVolumeNameW(ctypes.c_wchar_p(volume),
buf, ctypes.sizeof(buf), ctypes.pointer(length))
return ''.join(buf[:length.value-2]).split('\0')
for volume in volumes():
print volume
print VolumePathNames(volume)
Когда я запускаю это, все списки содержат только одно имя, но если вы дважды проверьте длину, то это все, что они содержали в возвращаемом буфере.