以原生态的方式获取Windows下的卷Guid

参考
1. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstvolumew
2. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findnextvolumew
3. https://docs.microsoft.com/en-us/windows/win32/fileio/displaying-volume-paths

第一次尝试独立用ctypes调用Windows的api,比较生疏,用了一个半小时左右才搞清楚
注意:该方法只能获取所有有Guid path的卷,部分没有Guid的分区(比如微软保留分区,MSR;以及Linux下的分区,如果你有双系统)都是看不到的,它们只有一个像“\Device\HarddiskVolume5”一样的Device path,我是从DiskGenius上面才看到的。至于怎么获取所有的Device path,我还要继续发掘

直接亮代码吧,不想多说什么

import win32con
import ctypes
from ctypes import wintypes


kernel32 = ctypes.windll.kernel32
lpsz_volume_name = wintypes.LPWSTR("")
cch_buffer_length = wintypes.DWORD(win32con.MAX_PATH)

handle = kernel32.FindFirstVolumeW(lpsz_volume_name, cch_buffer_length)


while True:
    # 长度为49,因为GUID的长度是固定的,加上前面的\\?\Volume{和后面的}\,总共长度是49
    # 但是官方的C++版本里面也没有写死49
    # 但奈何本人没用过C++,只是凭直觉摸索了一点东西
    # 毕竟本来长度就是固定的,且凑合着用吧
    result = ctypes.wstring_at(lpsz_volume_name, 49)
    print(result)
    # 继续枚举
    success = kernel32.FindNextVolumeW(handle, lpsz_volume_name, cch_buffer_length)
    # 如果success为0,即False,说明枚举完了,退出循环
    if not success:
        break

# 最后一定要关闭
kernel32.FindVolumeClose(handle)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇