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

;运行效果

;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 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微软预测 AI 2025,AI Agents 重塑工作形式

1月初,微软在官网发布了2025年6大AI预测,分别是:AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是,微…

网络编程套接字(二)

目录 TCP网络程序 服务端初始化 创建套接字 服务端绑定 服务端监听 服务端启动 服务端获取连接 服务端处理请求 客户端初始化 客户端启动 发起连接 发起请求 网络测试 多进程版TCP网络程序 捕捉SIGCHLD信号 孙子进程提供服务 多线程版TCP网络程序 线程池版TC…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…

渗透测试--攻击常见的Web应用

本文章咱主要讨论,常见Web应用的攻击手法,其中并不完全,因为Web应用是在太多无法囊括全部,但其中的手法思想却值得我们借鉴,所以俺在此做了记录,希望对大家有帮助!主要有以下内容: 1…

外包公司名单一览表(成都)

大家好,我是苍何。 之前写了一篇武汉的外包公司名单,评论区做了个简单统计,很多人说,在外包的日子很煎熬,不再想去了。 有小伙伴留言说有些外包会强制离职,不行就转岗,让人极度没有安全感。 这…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…

Spring Boot安全加固:基于Spring Security的权限管理

引言 在当今数字化时代,随着企业信息化程度的不断提高,应用程序的安全性成为了一个至关重要的问题。Spring Boot 作为 Java 生态系统中广泛使用的开发框架,以其简洁、高效的特点深受开发者的喜爱。然而,仅仅依靠 Spring Boot 的默…

论文笔记(六十二)Diffusion Reward Learning Rewards via Conditional Video Diffusion

Diffusion Reward Learning Rewards via Conditional Video Diffusion 文章概括摘要1 引言2 相关工作3 前言4 方法4.1 基于扩散模型的专家视频建模4.2 条件熵作为奖励4.3 训练细节 5 实验5.1 实验设置5.2 主要结果5.3 零样本奖励泛化5.4 真实机器人评估5.5 消融研究 6 结论 文章…

工业缺陷检测实战——基于深度学习YOLOv10神经网络PCB缺陷检测系统

基于深度学习YOLOv10神经网络PCB缺陷检测系统,其能识别六种PCB缺陷:names {0:missing_hole, 1:mouse_bite, 2:open_circuit, 3:short, 4:spur, 5:spurious_copper} CH_names [缺失孔,鼠标咬伤,开路,短路,杂散,伪铜] 具体图片见如下: 第一步…

React+AntDesign实现类似Chatgpt交互界面

以下是一个基于React和Ant Design搭建的简单ChatGPT风格前端交互界面代码框架示例,该示例实现了基本的用户输入、发送请求以及展示回复的功能。假设后端有一个模拟接口来处理请求并返回回复。 1. 项目初始化: 确保你已经安装了Node.js和npm。通过以下命…

FANUC机器人系统镜像备份与恢复的具体步骤(图文)

FANUC机器人系统镜像备份与恢复的具体步骤(图文) 镜像备份: 如下图所示,进入文件—工具—切换设备,找到插入的U盘UT1, 如下图所示,进入U盘目录后,创建目录,这里目录名称为11, 如下图所示࿰

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引…

【Qt 常用控件】显示类控件——QLabel

目录 1.QLabel 1.1 textFormat 文本类型 普通文本和富文本 Markdown格式 1.2 alignment 文本对齐方式 1.3 wordWrap 自动换行 1.4 indent 文本缩进 1.5 margin 边距 1.6 buddy,qlabel伙伴 1.7 pixmap图片 和 scaledContents自动填充 1.QLabel 功能&#x…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错:Command failed: git checkout 2.2.0-c) npm install 报错:Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

戴尔电脑用u盘重装系统_戴尔电脑用u盘重装win10系统教程

戴尔电脑用u盘重装系统?戴尔电脑这几年默认预装win10家庭版和win11家庭版。有的用户用上了预装win11家庭版的戴尔电脑,使用一段时间依然不习惯,于是想退回win10。但不知道怎么重装win10,这几年的戴尔电脑建议采用U盘方式安装系统比…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 🏠 第N个泰波那契数模型 📌 题目解析 第N个泰波那契数 题目要求的是泰波那契数,并非斐波那契数。 &…

wps数据分析000002

目录 一、快速定位技巧 二、快速选中技巧 全选 选中部分区域 选中部分区域(升级版) 三、快速移动技巧 四、快速录入技巧 五、总结 一、快速定位技巧 ctrl→(上下左右)快速定位光标对准单元格的上下部分双击名称单元格中…

常用集合-数据结构-MySql

目录 java核心: 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

PHP礼品兑换系统小程序

🎁 礼品兑换系统:革新企业礼品管理,专属神器来袭! 💻 一款专为追求高效与个性化的现代企业量身打造的礼品兑换系统,它基于强大的ThinkPHP框架与前沿的Uniapp技术栈深度融合,不仅完美适配礼品卡…