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.pswp.cn/web/66707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66707.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB vs Redis:相似與區別

前言 在當今的數據庫領域,MongoDB 和 Redis 都是備受關注的非關系型數據庫(NoSQL),它們各自具有獨特的優勢和適用場景。本文將深入探討 MongoDB 和 Redis 的特點,并詳細對比它們之間的相似之處和區別,幫助…

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-服務注…

Spark Streaming的核心功能及其示例PySpark代碼

Spark Streaming是Apache Spark中用于實時流數據處理的模塊。以下是一些常見功能的實用PySpark代碼示例: 基礎流處理:從TCP套接字讀取數據并統計單詞數量 from pyspark import SparkContext from pyspark.streaming import StreamingContext# 創建Spar…

深度學習系列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程序或OO類、使用哪些庫和框架 程序經理說,軟件架構就是模塊的劃分和接口的定義 系統分析員說,軟件架構就是為業務領域對象的關系建模 配置管理員說,軟件架構就是開發出來的…

1/20賽后總結

1/20賽后總結 T1『討論區管理員』的旅行 - BBC編程訓練營 算法:IDA* 分數:0 damn it! Ac_code走丟了~~(主要是沒有寫出來)~~ T2華強買瓜 - BBC編程訓練營 算法:雙向DFS或者DFS剪枝 分數:0 Ac_code…

大數據與AI驅動的商業查詢平臺:企業市場拓展的變革引擎?

在競爭白熱化的商業環境里,企業對準確市場信息的高效獲取能力,直接關系到業務拓展的成敗。商業查詢平臺借助大數據和人工智能技術,為企業提供精準客戶篩選、市場拓展分析以及風險評估服務,正逐漸成為企業市場開拓的得力助手。本文…

redis 各個模式的安裝

一、Redis單機安裝 1、安裝gcc依賴 Redis是C語言編寫的,編譯需要GCC。 Redis6.x.x版本支持了多線程,需要gcc的版本大于4.9,但是CentOS7的默認版本是4.8.5。 升級gcc版本: yum -y install centos-release-scl yum -y install d…

TiDB 的優勢與劣勢

TiDB 的優勢與劣勢 TiDB 作為一款新興的分布式數據庫,在業界逐漸嶄露頭角。它兼具傳統關系型數據庫的特性,又充分利用分布式架構的優勢。那么,TiDB 究竟有怎樣的優缺點呢?今天我們來聊聊 TiDB 的優勢與劣勢,幫你全面了…

藍橋杯算法日常|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 使用…

T-SQL語言的數據庫編程

T-SQL語言的數據庫編程 1. 引言 在信息化迅速發展的今天,數據庫已經成為數據管理和使用的重要工具。其中,T-SQL(Transact-SQL)作為微軟SQL Server的擴展SQL語言,不僅用于數據查詢和管理,還能夠進行復雜的…

通信協議—WebSocket

一、WebSocket編程概念 1.1 什么是WebSocket WebSocket 是一種全雙工通信協議,允許在客戶端(通常是瀏覽器)和服務器之間建立持久連接,以實現實時的雙向通信。它是 HTML5 標準的一部分,相比傳統的 HTTP 請求&#xff…

cadence筆記--畫PMU6050原理圖和封裝

簡介 本文主要介紹使用Cadence自己畫一個PMU6050的原理圖PCB的實際用例,Cadence使用的是24.1版本。 原理圖 首先獲取PMU6050引腳參數,使用立創商城查詢PMU6050型號,點擊數據手冊如下圖所示: 如下圖所示,左邊是原理圖&…