--------------------------------------------------------------
这是我在CSDN上弄的东西,但是看不懂啊 !希望大虾们多多指教
解决方案 »
- 求助 VB 数据三处问题
- 从类型“DBNull”到类型“Integer”的强制转换无效
- 编译为P-代码和编译为本机代码的差别是什么?
- 请高手帮忙,刚学vb!
- 请问各位GIS高手在哪儿能下载到MapX啊?在线急等,多谢了!!
- 一个表的问题,如何解决容易,能用存储过程吗,请指教
- 前段时间安装了个MSDN中文精简版用得好好的,现在问题却来了..
- 这是不是winsock控件的bug?
- 快速排序的问题,请教高手。
- 简单..............
- 如何将String类型转换为Byte类型?
- 我又遇到了一个问题。我在编一个纸牌得游戏。一共有两副牌,也就是108张牌,我要随机的把牌全部发光,而且一张牌只能出现2次,必须是两次
Public Const GENERIC_WRITE = &H40000000
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const OPEN_EXISTING = 3'//为了简单起见,注意下面的声明语句部分地方已经改动过
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwShareMode As Long, _
lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As
Long
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long,
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long,
lpOverlapped As Long) As Long
Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long,
lpBuffer As Any, _
ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long,
lpOverlapped As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As LongDim Buffer(1 To 512) As Byte
Dim hDevice As Long
Dim hadRead As Long
hDevice = CreateFile("\\.\PHYSICALDRIVE0", GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0&, 0&)Call ReadFile(hDevice, Buffer(1), 512, hadRead, ByVal 0&) '//(****)Dim i As Long
For i = 1 To 512
Debug.Print Hex$(Buffer(i));
NextCall CloseHandle(hDevice)这样数组buffer()里的512Byte的数据即为第一个物理硬盘的BootRecord数据了。我们
可以将它保存在另外一个文件里,这样当万一我们的硬盘受到病毒的破坏导致分区不见
了,就可以从这个文件恢复BootRecord,从而修复硬盘。啊,那么怎样写数据入BootRecord呢?
MSDN里没有怎么讲,凭着我不入地狱谁入地狱的精神,我试过用WriteFile API函数就
可以了,
首先看看怎样在瞬间“清空”硬盘的BootRecord。将上面带 (****) 号的一句换成:'//注意!千万不要调试/运行本段程序,除非你不想要你的硬盘了(在别人的机上除外
哦 :)))
Call WriteFile(hDevice,Buffer(1),512,hadRead,Byval 0&)由于Buffer()里面的数据都是00000……,这样,机器上的第一个物理硬盘的
BootRecord数据全部变成0…000了,换句话说,MBR和主分区表DPT都被破坏了。如果想
破坏硬盘上的所有数据,那也是很简单的事,只要不断地 WriteFile,用0000填充硬盘
上的所有数据就可以了,这样硬盘上的其他部分(DBR、FAT、DIR、DATA)都会被清
空。(哎呀,怎么越讲越离题了!都教人搞破坏去了,该批斗!)言归正传了,如果首先在Buffer()存有原来硬盘的BootRecord数据,再调用WriteFile
,那么就是变成恢复硬盘的BootRecord了,(要是少了这一步,那真是一失足成千古恨
)。