'VB 6.0 版 X;!*D
'这不是我写的,它更强悍了。因为可以直接读写物理扇区(CHS),而不是逻辑扇区。 ?$/::
uo
Pl B3"{}0Q
Private 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 }`w(sec:3
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long ?2"g*Bak
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long '//declare has changed UCVYO.
9"
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long '//declare has changed fS"u"]j*e
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long QP'sS*saJ
'如果用绝对扇区写,那么文件的建立打开都不能用VB的 open 语句了。 Iy_5k8]
A$wC!P|;
&oMEz 0
Private Const GENERIC_READ = &H80000000 b:S$oE
Private Const GENERIC_WRITE = &H40000000 7]rIq\bM
T:Cq}4k<
Private Const FILE_SHARE_READ = &H1 ^|MS2'
Private Const FILE_SHARE_WRITE = &H2 fK7
?"^`/
Private Const OPEN_EXISTING = 3 G u`xJ
WXxnOLJr
Private Const INVALID_HANDLE_VALUE = -1 hF-QbO
r-T1^u
'//file seek ,WE2.MWR
Private Const FILE_BEGIN = 0 4 ?BQ&d
Private Const FILE_CURRENT = 1 T
t~4'{Bc
Private Const FILE_END = 2 C|]c#X2t3
11l=zv
Private Const ERROR_SUCCESS = 0& 7g*!6-W[
vl/!w2
'//device io control FsqH:I4O
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long |cC3L09
iM8Cw/DS
Private Const IOCTL_DISK_GET_DRIVE_GEOMETRY As Long = &H70000 '458752 &n1Vv_Lb
Private Const IOCTL_STORAGE_GET_MEDIA_TYPES_EX As Long = &H2D0C04 {qw'gJmX
Private Const IOCTL_DISK_FORMAT_TRACKS As Long = &H7C018 M5VW1Ns
Private Const FSCTL_LOCK_VOLUME As Long = &H90018 G
`|7NL
Private Const FSCTL_UNLOCK_VOLUME As Long = &H9001C YW7w>}aW
Private Const FSCTL_DISMOUNT_VOLUME As Long = &H90020 Vs"b
Private Const FSCTL_GET_VOLUME_BITMAP = &H9006F r^Ra`:ca
RJ?)O#}
'//type 5mAb9F8@
Private Type LARGE_INTEGER .f$2-5q
lowpart As Long Q9cSrU[$
highpart As Long C
O6}D
End Type "w"a0nv
7FH-l(W
Private Enum MEDIA_TYPE CNRSc4Le
Unknown Kz;Ar&^`N
F5_1Pt2_512 5 SQ!^1R 9
F3_1Pt44_512 W<q<}RSn
F3_2Pt88_512 W7!Rf7TK
F3_20Pt8_512 sO) H#G
F3_720_512 Py*WHHO
F5_360_512 uYeb RCdR
F5_320_512 Kii@Z5R_?
F5_320_1024 9po=[{Bp
F5_180_512 Qy9_tvq
X
F5_160_512 X8tPn_`x
RemovableMedia B9"d7E#wHF
FixedMedia _EMXx4J
End Enum 4Y?fbb<
N-l`U(Z~P
Private Type DISK_GEOMETRY q# j[0,^ $
Cylinders As LARGE_INTEGER [lIX&!T"
MediaType As MEDIA_TYPE -9LvAV>
TracksPerCylinder As Long vL _yM
SectorsPerTrack As Long B}04E^
BytesPerSector As Long JcRxNH
)<"
End Type \Hb!<mrp
al#(<4sJ
'//private vars ]n4PM=hz
Private hDisk As Long 'disk handle -+){ ;,
Private lpGeometry As DISK_GEOMETRY 'disk info x6K_!L*Fx]
Private lBufferSize As Long 'the buffer size of read/write 46vC/
F(1E@xs
Public Function OpenDisk(ByVal FileName As String) As Boolean B\
'rxbH
'// 打开磁盘 LHtO|Utn(
hDisk = CreateFile(FileName, _ |~A*?6:@
GENERIC_READ Or GENERIC_WRITE, _ 'Qt[cW
FILE_SHARE_READ Or FILE_SHARE_WRITE, _ -|'@:cIZ
ByVal 0&, _ jW&*?6<
OPEN_EXISTING, _ fmYx
0, _ k:n{AoUc
0)
MZ%J
]Nd
OpenDisk = Not (hDisk = INVALID_HANDLE_VALUE) F+
Kju2
End Function ;*rGZ?%*
OX.5olb
Public Function CloseDisk() As Boolean ;8#6da,
'//关闭磁盘 yPmo1|'X>d
CloseDisk = CloseHandle(hDisk) | K|AUI
End Function X#T|.mCdC
7y^)n<'co
Public Function GetDiskGeometry() As Boolean nOyG7:
'//获取磁盘参数 =H7p&DhD