类似WinHex一样读取硬盘扇区

易语言 2020-07-17 17:42:30

类似WinHex一样读取硬盘扇区

读硬盘的子程序位于,源码 -> 窗口程序集1-》读硬盘扇区

复制出来直接用,调用了几个API,复制程序的DLL表,就好了。

偏移 = 扇区号 × 512 ' 一个扇区512字节
读取长度 = 数量 × 512
设备名 = “\\.\\physicaldrive0”
handle = CreateFileA (设备名, 2147483648, 1, 0, 3, 128, 0)
.如果真 (handle = -1) ' 无效句柄
调试输出 (“发生错误 错误号:” + 到文本 (GetLastError ()))
返回 ({ 0 })
.如果真结束
SetFilePointer (handle, 偏移, 0, 0) ' 设置位置
数据 = 申请内存 (读取长度, 真)
.如果真 (ReadFile (handle, 数据, 读取长度, 取变量地址 (成功读取的数据长度), 0) = 假)
调试输出 (“ReadFile 发生错误 错误号:” + 到文本 (GetLastError ()))
返回 ({ 0 })
.如果真结束
字节集数据 = 指针到字节集 (数据, 读取长度)
释放内存 (数据)
CloseHandle (handle)

.计次循环首 (取字节集长度 (转换的数据), nc) ' 根据字节集长度确定循环次数
text = text + “ ” + 填充重复文本 (取十六进制文本 (转换的数据 [nc]), 2, “0”) ' 存放主要数据
.如果真 (是否显示源数据文本)
.如果真 (转换的数据 [nc] < 32) ' 如果该字节ASCII>32
转换的数据 [nc] = 46 ' 转换成原点符号形式显示
.如果真结束
Rtext = Rtext + 字符 (转换的数据 [nc])
.如果真结束
.如果真 (nc % 16 = 0) ' 每行16个字节
.如果真 (是否显示地址)
text = 填充重复文本 (取十六进制文本 (nc - 16), 4, “0”, ) + “ | ” + text
.如果真结束
.如果真 (是否显示源数据文本)
text = text + “ | ” + Rtext
.如果真结束
结果文本 = 结果文本 + text + #换行符 ' 满一行就插入回车符并添加到结果文本中
' 清空变量
text = “”
Rtext = “”
.如果真结束

.计次循环尾 ()
' 最后一行有可能数据刚好不能被16整除,则不满足条件i%16=0,所以要补上最后的一段
.如果真 (text ≠ “”)
.如果真 (取文本长度 (text) < 48)
text = 填充重复文本 (text, 48, “ ”, 假)
.如果真结束
.如果真 (是否显示地址)
text = 填充重复文本 (取十六进制文本 (nc - nc % 16), 4, “0”, 真) + “ | ” + text
.如果真结束
.如果真 (是否显示源数据文本)
text = text + “ | ” + Rtext
.如果真结束
结果文本 = 结果文本 + text + #换行符