win32汇编环境,怎么得到磁盘的盘符

devtools/2025/1/23 23:22:26/

;运行效果

;win32汇编环境,怎么得到磁盘的盘符
;以下代码主要为了展示一下原理,应用GetLogicalDrives、GetLogicalDriveStrings函数、屏蔽某些二进制位、按双字节复制内容等。以下代码最多查8个盘,即返回值中的1个字节的信息
;直接抄进RadAsm可编译运行。重点部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 

; 自定义函数声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data 
DlgName    db "MyDialog",0 
szFormat01 db 13,10
           db "通过GetLogicalDrives函数判断",13,10
           db "总计是 %d 个逻辑分区",13,10,0
szFormat02 db 13,10
           db 13,10
           db "通过GetLogicalDriveStrings函数判断",13,10
           db "总计是 %d 个逻辑分区",0
szCaption  db "提示",0
sz         db "分别是",0
szA        db "A: ",0
szB        db "B: ",0
szC        db "C: ",0
szD        db "D: ",0
szE        db "E: ",0
szF        db "F: ",0
szG        db "G: ",0
szH        db "H: ",0
.data? 
hInstance HINSTANCE             ? 

.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN      equ 1000    ;图标

ID_EDIT01     equ 11        ;编辑框控件标识符 
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start: 
    invoke GetModuleHandle, NULL 
    mov    hInstance,eax 
    invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL 
    invoke ExitProcess,eax 

DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL   @szBuffer[128]:byte
        LOCAL   @szBuffer1[256]:byte
        LOCAL   @szBuffer2[1024]:byte
        LOCAL   @hDriver:byte
        LOCAL   @Apen:byte
        LOCAL   @Bpen:byte
        LOCAL   @Cpen:byte
        LOCAL   @Dpen:byte
        LOCAL   @Epen:byte
        LOCAL   @Fpen:byte
        LOCAL   @Gpen:byte
        LOCAL   @Hpen:byte
        LOCAL   @hDriverCount       ;逻辑盘数量,默认的变量是DWORD型的,即四字节,32位的
        LOCAL   @hEdit

        .if     uMsg == WM_INITDIALOG 
                invoke    LoadIcon,hInstance,ICO_MAIN    
            invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
            invoke  RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
            invoke  RtlZeroMemory,addr @szBuffer1,sizeof @szBuffer1
            invoke  RtlZeroMemory,addr @szBuffer2,sizeof @szBuffer2
            
                ;以下通过GetLogicalDrives函数也可以判断有多少个盘符
            mov @Apen,00000001B                ;B的意思是二进制值
            mov @Bpen,00000010B
            mov @Cpen,00000100B
            mov @Dpen,00001000B
            mov @Epen,00010000B
            mov @Fpen,00100000B
            mov @Gpen,01000000B
            mov @Hpen,10000000B 
            invoke GetLogicalDrives            ;GetLogicalDrives函数检索一个表示当前可用磁盘驱动器的位掩码,就是其返回值转换成二进制时,哪位是1,则对应的某个盘。比如第0位是1,则说明A盘有效,第1位是1,则说明B盘有效,为0则无效。以此类推
                        mov @hDriver,al            ;只取返回值中的低位字节,也就是最多查询8个盘符
                        mov @hDriverCount,0
                        invoke lstrcat,addr @szBuffer,addr sz
                        mov al,@hDriver
                        and @Apen,al               ;让al与00000001B相与,即把第0位原值留下,其它7位全部置0的意思,要知道,第一位是0位开始的
                        .if @Apen == 00000001B     ;如果第0位是1,说明A盘存在。
                              inc @hDriverCount    ;盘数自增1
                              invoke lstrcat,addr @szBuffer,addr szA 
                        .endif
                        
                        mov al,@hDriver            ;让al与00000010B相与,即把第1位原值留下,其它7位全部置0的意思.
                        and @Bpen,al 
                        .if @Bpen == 00000010B     ;如果第1位是1,说明B盘存在。后面的以此类推
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szB 
                        .endif
                        
                        mov al,@hDriver
                        and @Cpen,al 
                        .if @Cpen == 00000100B
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szC 
                        .endif
                        
                        mov al,@hDriver
                        and @Dpen,al 
                        .if @Dpen == 00001000B
                              inc @hDriverCount 
                              invoke lstrcat,addr @szBuffer,addr szD
                        .endif
                        
                        mov al,@hDriver
                        and @Epen,al 
                        .if @Epen == 00010000B
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szE 
                        .endif
                        
                        mov al,@hDriver
                        and @Fpen,al 
                        .if @Fpen == 00100000B
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szF
                        .endif
                        
                        mov al,@hDriver
                        and @Gpen,al 
                        .if @Gpen == 01000000B
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szG
                        .endif
                        
                        mov al,@hDriver
                        and @Hpen,al 
                        .if @Hpen == 10000000B
                              inc @hDriverCount
                              invoke lstrcat,addr @szBuffer,addr szH
                        .endif
                        
                        invoke wsprintf,addr @szBuffer1,addr szFormat01,@hDriverCount
                        invoke lstrcat,addr @szBuffer2,addr @szBuffer1
                        invoke lstrcat,addr @szBuffer2,addr @szBuffer 

                        ;以下通过GetLogicalDriveStrings函数也可以判断有多少个盘符
                        invoke  RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
                        invoke  RtlZeroMemory,addr @szBuffer1,sizeof @szBuffer1
                        invoke  GetLogicalDriveStrings,sizeof @szBuffer,addr @szBuffer        
                        ;GetLogicalDriveStrings函数的返回值是字节数,每个盘占4个字节,依次排列,比如有12个字节,则说明有3个盘。但是每4个字节之中,第4个字节是0,即结束符,所以遍历字符串时不能以结束符为判断结束的条件
                        mov ebx,4          ;4是每个盘的信息占4个字节,通过除以4,就知道总共多少个盘符
                        div ebx
                        mov @hDriverCount,eax
                        
                        invoke wsprintf,addr @szBuffer1,addr szFormat02,@hDriverCount
                        invoke lstrcat,addr @szBuffer2,addr @szBuffer1
                        mov ebx,0
                        .while TRUE
                            .break .if ebx == @hDriverCount
                            invoke lstrlen,addr @szBuffer2          ;得到要显示到编辑框里的文本长度,因为后面直接把盘符加上去
                            mov edx,eax
                            mov ax,word ptr [@szBuffer+ebx*4]       ;因为盘符占用4个字节中开头2个字节,比如C:,所以直接按双字word复制内容     
                            mov word ptr [@szBuffer2+edx],ax
                            inc ebx
                        .endw

                        invoke GetDlgItem,hWnd,ID_EDIT01
                        mov @hEdit,eax
                        invoke SendMessage,@hEdit,WM_SETTEXT,0,addr @szBuffer2
        .elseif uMsg == WM_CLOSE 
                invoke EndDialog, hWnd,NULL 
        .else 
                mov eax,FALSE 
                ret 
        .endif 
                mov eax,TRUE 
        ret 
DlgProc endp 

end start 
 


http://www.ppmy.cn/devtools/152985.html

相关文章

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果,如下图: 一、SD卡 速读…

linux虚拟机连接不上Xshell

本文介绍了在尝试通过Xshell连接Linux虚拟机时遇到的问题及解决方案。错误表现为无法连接到指定IP的SSH服务。常规检查包括确认网络连通性、防火墙状态和SSH服务状态。作者发现问题根源在于虚拟机的网络配置错误,子网配置与分配的IP地址不匹配。修复网络配置后&…

java微服务的异常

1.依赖异常 须知: 【 如果项目的结构是单个模块的,需要给每个单个模块添加起步依赖 spring-boot-starter-parent,指定版本 】 【 如果项目的结构是子父模块的,只需要给父模块添加起步依赖 spring-boot-starter-parent,…

Apache Hive--排序函数解析

在大数据处理与分析中,Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利,排序函数便是其中一类非常实用的工具。通过排序函数,我们能够在查询结果集中为每一行数据分配一个排名值,这对于数据分析…

前端如何实现分页

前言 虽然在实际开发中,大多数分页都是由后端处理,但还是有小部分场景需要前端来实现分页。 实现并不难,仅作为记录,方便下次拿来直接使用。 准备数据源 数据源可以是从后端获取的数据列表,也可以是前端模拟的数据集…

正向代理(动态 IP 代理)和反向代理

引入 VPN 是正向代理 Nginx,Getway是反向代理 那么你清楚正向代理和反向代理实际区别吗 从链路来看 客户端的服务 服务端的服务 完整链路 正向代理 概念 正向代理,是一个位于客户端和原始服务器之前的服务器,为了从目标服务器取得内容&…

Linux终端之旅: 权限管理三剑客与特殊权限

Linux 权限的概念 Linux 下有两种用户:超级用户( root )、普通用户。 超级用户:可以在linux下做任何事,不受-rwx权限的影响 普通用户:linux使用者,受权限的影响 超级用户的命令提示符是“#”&…

arcgis for js只显示范围内的天地图,其余部分透明

效果 只显示范围内的天地图,其余部分透明化 实现 复制后直接运行即可 <!DOCTYPE html> <html lang"zn"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><met…