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 
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis(19/134)

大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符&#xf…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…

深度学习系列75:sql大模型工具vanna

1. 概述 vanna是一个可以将自然语言转为sql的工具。简单的demo如下: !pip install vanna import vanna from vanna.remote import VannaDefault vn VannaDefault(modelchinook, api_keyvanna.get_api_key(my-emailexample.com)) vn.connect_to_sqlite(https://va…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…

[0242-06].第06节:SpringBoot对SpringMVC的自动配置

SpringBoot学习大纲 一、基于SpringBoot搭建Web工程: 1.1.编码实现步骤: a.创建SpringBoot项目 b.选中依赖:选中我们所需要的模块 1.2.SSM中的WEB开发配置与SpringBoot中WEB开发自动配置对比: a.SSM中的WEB开发: 1…

【21】Word:德国旅游业务❗

目录 题目 NO1.2.3 NO4 NO5.6 NO7 NO8.9.10.11 题目 NO1.2.3 F12:另存为布局→页面设置→页边距:上下左右选中“德国主要城市”→开始→字体对话框→字体/字号→文本效果:段落对话框→对齐方式/字符间距/段落间距 NO4 布局→表对话框…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper:是C标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母,需包含头文件cctype.h(也可用万能头文件包含)。返回布尔类型值。例如: #…

微服务知识——4大主流微服务架构方案

文章目录 1、微服务聚合模式2、微服务共享模式3、微服务代理模式4、微服务异步消息模式 微服务是大型架构的必经之路,也是大厂重点考察对象,下面我就重点详解4大主流微服务架构方案。 1、微服务聚合模式 微服务聚合设计模式,解决了如何从多个…

【HTML+CSS】使用HTML与后端技术连接数据库

目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…

cadence笔记--画PMU6050原理图和封装

简介 本文主要介绍使用Cadence自己画一个PMU6050的原理图PCB的实际用例,Cadence使用的是24.1版本。 原理图 首先获取PMU6050引脚参数,使用立创商城查询PMU6050型号,点击数据手册如下图所示: 如下图所示,左边是原理图&…

Text2SQL 智能报表方案介绍

0 背景 Text2SQL智能报表方案旨在通过自然语言处理(NLP)技术,使用户能够以自然语言的形式提出问题,并自动生成相应的SQL查询,从而获取所需的数据报表,用户可根据得到结果展示分析从而为结论提供支撑&#…

FFmpeg音视频采集

文章目录 音视频采集音频采集获取设备信息录制麦克风录制声卡 视频采集摄像机画面采集 音视频采集 DirectShow(简称DShow)是一个Windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能,它支持多种多样的媒体文件格式&…

【漫话机器学习系列】056.F1值(F1 score)

F1值(F1 Score) 定义 F1值是机器学习中一种用于评估模型性能的指标,特别适合用于 不平衡数据集 的分类任务。它是 精确率(Precision) 和 召回率(Recall) 的调和平均值。通过综合考虑精确率和召…

Mac安装Homebrew

目录 安装修改homeBrew源常用命令安装卸载软件升级软件相关清理相关 安装 官网 https://brew.sh/不推荐官网安装方式(很慢很慢或者安装失败联网失败) 检测是否安装homebrewbrew -v执行安装命令 苹果电脑 常规安装脚本 (推荐 完全体 几分钟就…

一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用

文章目录 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload1. 建议按文章顺序从头看,一看到底,豁然开朗2. preload和prefetch的区别2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白话讲清楚webpack基本使用——9——…

【Elasticsearch 】 聚合分析:桶聚合

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

tensorflow源码编译在C++环境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下载软件对应的版本,最好一模一样 1、下载TensorFlow源码 https://github.com/tensorflow/tensorflow 2、安装编译protobuf(3.9.2) protobuf版本要和TensorFlo…

使用 F12 查看 Network 及数据格式

在浏览器中,F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求,包括 API 请求,以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例,介绍如何使用 F12 控制台查看 Network 里…

Redis 2.6.12在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个版本的安装包是跟同事要的,em,如果真的需要这个版本的话可以跟我要: 解压后双击第一个bat文件,即可挂起Redis服务: