'VB 6.0 版
8M9LY9C '这不是我写的,它更强悍了。因为可以直接读写物理扇区(CHS),而不是逻辑扇区。
.[email protected])3 P?QVT;] 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
X MkyX&y Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
fK-tvP0}* 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
PWErlA:58 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
\gtI4zl*J Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
;4E(n '如果用绝对扇区写,那么文件的建立打开都不能用VB的 open 语句了。
F|Y}X|x8Q Bg
PwIK
x 'j6)5WL$ Private Const GENERIC_READ = &H80000000
"0BuQ{CQ Private Const GENERIC_WRITE = &H40000000
'VH%cz* ykq9]Xqhv Private Const FILE_SHARE_READ = &H1
>$^[email protected]jf Private Const FILE_SHARE_WRITE = &H2
|[%CFm}+? Private Const OPEN_EXISTING = 3
Glz
yFj E05RqnqBn0 Private Const INVALID_HANDLE_VALUE = -1
iEe<+Eyns /Q |guJx '//file seek
4q<LNvJA Private Const FILE_BEGIN = 0
CqF=5z:A Private Const FILE_CURRENT = 1
4VPJv>^ Private Const FILE_END = 2
drv"I[}{A MXQS6F# Private Const ERROR_SUCCESS = 0&
_6Ex}`fyJ
u+U '|6)E '//device io control
I\8f`l 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
L\O}q +i %,+3#6 Private Const IOCTL_DISK_GET_DRIVE_GEOMETRY As Long = &H70000 '458752
jGp|:!'
w Private Const IOCTL_STORAGE_GET_MEDIA_TYPES_EX As Long = &H2D0C04
.JkcCEe{G Private Const IOCTL_DISK_FORMAT_TRACKS As Long = &H7C018
[email protected]:?=hc Private Const FSCTL_LOCK_VOLUME As Long = &H90018
2!UNFv#=$ Private Const FSCTL_UNLOCK_VOLUME As Long = &H9001C
C}})dL;( Private Const FSCTL_DISMOUNT_VOLUME As Long = &H90020
NTj: +z0 Private Const FSCTL_GET_VOLUME_BITMAP = &H9006F
6Vq]AQx BK+(Uf;g '//type
Er 4P Private Type LARGE_INTEGER
@|7Ma/8v lowpart As Long
sg=mkkD!g highpart As Long
\QpH~&QIS End Type
iJIDx9 )Z
*jAw Private Enum MEDIA_TYPE
i2h,=NHJh? Unknown
>n`!S`)9{ F5_1Pt2_512
GQU9UXe F3_1Pt44_512
/.?m9O^
F F3_2Pt88_512
QvPG
6A]T F3_20Pt8_512
OJ2O?Te8 F3_720_512
|?a 4Nl?
F5_360_512
n\U3f M>N F5_320_512
#<^ngoOj F5_320_1024
Ax'jNo
l F5_180_512
hM":?Rx F5_160_512
W0++q=F RemovableMedia
8Gw0;Uu8D FixedMedia
jj[email protected]< End Enum
uude<d"U .H.#W1` Private Type DISK_GEOMETRY
l7g<
$3 Cylinders As LARGE_INTEGER
81(.{Y839_ MediaType As MEDIA_TYPE
c5 jd
q[0 TracksPerCylinder As Long
xe4F4FC' SectorsPerTrack As Long
!W^b:qjJ BytesPerSector As Long
btQDG End Type
3`W=rIMli ]w)*8
w.) '//private vars
@R!f(\ Private hDisk As Long 'disk handle
Hg~O0p}[ Private lpGeometry As DISK_GEOMETRY 'disk info
8SG*7[T7 Private lBufferSize As Long 'the buffer size of read/write
xj1FCT2 ]
i}3`e? Public Function OpenDisk(ByVal FileName As String) As Boolean
0Q2P"1>KT/ '// 打开磁盘
09_L^'` hDisk = CreateFile(FileName, _
Wq4>!| GENERIC_READ Or GENERIC_WRITE, _
ka3(sctZ5 FILE_SHARE_READ Or FILE_SHARE_WRITE, _
,gvv297 ByVal 0&, _
P[l? OPEN_EXISTING, _
;M<jQntqS{ 0, _
[email protected]/i [email protected] 0)
@kq~q;
F OpenDisk = Not (hDisk = INVALID_HANDLE_VALUE)
T'n~QfU End Function
k8]uy2R6} NlBn
V Public Function CloseDisk() As Boolean
L(a){<c '//关闭磁盘
q.
%[!O CloseDisk = CloseHandle(hDisk)
eyx;8v cM End Function
[sM~B qre.^6x Public Function GetDiskGeometry() As Boolean
H;&^A5 '//获取磁盘参数
c<'Pt4LY Dim dwOutBytes As Long
Z+zx*(X Dim bResult As Boolean
T8ga)
BA D~KEjz!bQ bResult = DeviceIoControl(hDisk, _
hXvg<Rf IOCTL_DISK_GET_DRIVE_GEOMETRY, _
8veYs` ByVal 0&, 0, _
Rf&~7h'+ lpGeometry, Len(lpGeometry), _
!9$xfg} dwOutBytes, _
/uTU
*Oe ByVal 0&)
3#d5.Ut INm21MS$ If bResult Then lBufferSize = lpGeometry.BytesPerSector * lpGeometry.SectorsPerTrack
]cz*k/*0 GetDiskGeometry = bResult
o6 FSSKM End Function
}d,
iA FG =Ws-s f] Public Sub GetDiskInfo(MediaType As Long, _
mP1EWh| Cylinders As Long, _
X,z
qI TracksPerCylinder As Long, _
YKjm_)8]w SectorsPerTrack As Long, _
R'#[}s BytesPerSector As Long)
\= M*x '//返回磁盘的参数
\2F$FRWo MediaType = lpGeometry.MediaType
6[-N}) Cylinders = lpGeometry.Cylinders.lowpart
1>JUI5 { TracksPerCylinder = lpGeometry.TracksPerCylinder
+1 K9
R\ SectorsPerTrack = lpGeometry.SectorsPerTrack
$"+ahS<?tC BytesPerSector = lpGeometry.BytesPerSector
g$qNK`y \]uo^@$bm End Sub
yv.UNcP? O
23dtH Public Property Get BufferSize() As Long
[V\0P,l '//返回每次读/写的缓冲大小
X[ERlw1q4Q BufferSize = lBufferSize
RhJ{#G~:% End Property
f0 ;Fokt( yQ33JQr a88(,:t Public Function LockVolume() As Boolean
G0Q8"] '// 将卷锁定
vgfLI}|5 Dim dwOutBytes As Long
[Sl
uYmW Dim bResult As Boolean
+Om(&\c(6 z|VQp,ra bResult = DeviceIoControl(hDisk, _
Gw"H#9J}
T FSCTL_LOCK_VOLUME, _
{8NnRnzU ByVal 0&, 0, _
.t/XW++ ByVal 0&, 0, _
x Z3b)j2D dwOutBytes, _
{Z>OAR# ByVal 0&)
jQAK
?7':= LockVolume = bResult
__}j
{Buk End Function
TFX*kk&R ;QT.|.t6 #6])\ Public Function UnlockVolume() As Boolean
&