📄 csdn技术中心 实战deviceiocontrol 之三:制作磁盘镜像文件.mht
字号:
}
H1.bhw98 {
MARGIN-TOP: 25px; FONT-WEIGHT: bolder; FONT-SIZE: 12pt; MARGIN-BOTTOM: =
5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial
}
H2.bhw98 {
MARGIN-TOP: 20px; FONT-WEIGHT: bolder; FONT-SIZE: 10.5pt; =
MARGIN-BOTTOM: 5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial
}
H3.bhw98 {
MARGIN-TOP: 15px; FONT-WEIGHT: bolder; FONT-SIZE: 9pt; MARGIN-BOTTOM: =
5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial
}
SPAN.key {
COLOR: #0000ff
}
SPAN.num {
COLOR: #800000
}
SPAN.str {
COLOR: #8b008b
}
SPAN.rem {
COLOR: #008000
}
</STYLE>
<P class=3Dbhw98><STRONG class=3Dbhw98>Q</STRONG>=20
=
DOS=C3=FC=C1=EEDISKCOPY=B8=F8=CE=D2=BA=DC=C9=EE=B5=C4=D3=A1=CF=F3=A3=AC=CF=
=D6=D4=DA=D2=B2=D3=D0=D0=ED=B6=E0=A1=B0=BF=CB=C2=A1=A1=B1=C8=ED=BC=FE=A3=AC=
=BF=C9=D2=D4=B6=D4=B4=C5=C5=CC=BD=F8=D0=D0=C8=AB=C5=CC=B8=B4=D6=C6=A1=A3=CE=
=D2=CF=EB=A3=AC=D2=AA=D6=C6=D7=F7=B4=C5=C5=CC=BE=B5=CF=F1=CE=C4=BC=FE=A3=AC=
DeviceIoControl=D3=A6=B8=C3=BA=DC=D3=D0=D3=C3=CE=E4=D6=AE=B5=D8=B0=C9=A3=BF=
=20
<P class=3Dbhw98><STRONG class=3Dbhw98>A</STRONG>=20
=
=CA=C7=B5=C4=A1=A3=D5=E2=C0=EF=BE=D9=D2=BB=B8=F6=D6=C6=D7=F7=C8=ED=C5=CC=BE=
=B5=CF=F1=CE=C4=BC=FE=A3=AC=B9=A6=C4=DC=C0=E0=CB=C6=D3=DA=A1=B0DISKCOPY=A1=
=B1=B5=C4=C0=FD=D7=D3=A1=A3
<P =
class=3Dbhw98>=B1=BE=C0=FD=CA=B5=CF=D6=C6=E4=B9=A6=C4=DC=B5=C4=BA=CB=D0=C4=
=B4=FA=C2=EB=C8=E7=CF=C2=A3=BA <PRE class=3Dbhw98><CODE =
class=3Dbhw98><SPAN class=3Drem>// =B4=F2=BF=AA=B4=C5=C5=CC</SPAN>
HANDLE OpenDisk(LPCTSTR filename)
{
HANDLE hDisk;
=20
<SPAN class=3Drem>// =B4=F2=BF=AA=C9=E8=B1=B8</SPAN>
hDisk =3D ::CreateFile(filename, <SPAN class=3Drem>// =
=CE=C4=BC=FE=C3=FB</SPAN>
GENERIC_READ | GENERIC_WRITE, <SPAN class=3Drem>// =
=B6=C1=D0=B4=B7=BD=CA=BD</SPAN>
FILE_SHARE_READ | FILE_SHARE_WRITE, <SPAN class=3Drem>// =
=B9=B2=CF=ED=B7=BD=CA=BD</SPAN>
NULL, <SPAN class=3Drem>// =
=C4=AC=C8=CF=B5=C4=B0=B2=C8=AB=C3=E8=CA=F6=B7=FB</SPAN>
OPEN_EXISTING, <SPAN class=3Drem>// =
=B4=B4=BD=A8=B7=BD=CA=BD</SPAN>
<SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =
=B2=BB=D0=E8=C9=E8=D6=C3=CE=C4=BC=FE=CA=F4=D0=D4</SPAN>
NULL); <SPAN class=3Drem>// =
=B2=BB=D0=E8=B2=CE=D5=D5=C4=A3=B0=E5=CE=C4=BC=FE</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> hDisk;
}
=20
<SPAN class=3Drem>// =BB=F1=C8=A1=B4=C5=C5=CC=B2=CE=CA=FD</SPAN>
BOOL GetDiskGeometry(HANDLE hDisk, PDISK_GEOMETRY lpGeometry)
{
DWORD dwOutBytes;
BOOL bResult;
=20
<SPAN class=3Drem>// =
=D3=C3IOCTL_DISK_GET_DRIVE_GEOMETRY=C8=A1=B4=C5=C5=CC=B2=CE=CA=FD</SPAN>
bResult =3D ::DeviceIoControl(hDisk, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
IOCTL_DISK_GET_DRIVE_GEOMETRY, <SPAN class=3Drem>// =
=C8=A1=B4=C5=C5=CC=B2=CE=CA=FD</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=C8=EB=CA=FD=BE=DD</SPAN>
lpGeometry, <SPAN class=3Dkey>sizeof</SPAN>(DISK_GEOMETRY), =
<SPAN class=3Drem>// =CA=E4=B3=F6=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =
=B4=D3=D6=B8=B6=A8=B4=C5=B5=C0=BF=AA=CA=BC=B6=C1=B4=C5=C5=CC</SPAN>
BOOL ReadTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, LPVOID pBuf, =
DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
DWORD VirtBufSize;
DWORD BytesRead;
=20
<SPAN class=3Drem>// =B4=F3=D0=A1</SPAN>
VirtBufSize =3D lpGeometry->TracksPerCylinder * =
lpGeometry->SectorsPerTrack * lpGeometry->BytesPerSector;
=20
<SPAN class=3Drem>// =C6=AB=D2=C6</SPAN>
::SetFilePointer(hDisk, VirtBufSize*dwStartCylinder, NULL, =
FILE_BEGIN);
=20
<SPAN class=3Dkey>return</SPAN> ::ReadFile(hDisk, pBuf, =
VirtBufSize*dwCylinderNumber, &BytesRead, NULL);
}
=20
<SPAN class=3Drem>// =
=B4=D3=D6=B8=B6=A8=B4=C5=B5=C0=BF=AA=CA=BC=D0=B4=B4=C5=C5=CC</SPAN>
BOOL WriteTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, LPVOID pBuf, =
DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
DWORD VirtBufSize;
DWORD BytesWritten;
=20
<SPAN class=3Drem>// =B4=F3=D0=A1</SPAN>
VirtBufSize =3D lpGeometry->TracksPerCylinder * =
lpGeometry->SectorsPerTrack * lpGeometry->BytesPerSector;
=20
<SPAN class=3Drem>// =C6=AB=D2=C6</SPAN>
::SetFilePointer(hDisk, VirtBufSize*dwStartCylinder, NULL, =
FILE_BEGIN);
=20
<SPAN class=3Dkey>return</SPAN> ::WriteFile(hDisk, pBuf, =
VirtBufSize*dwCylinderNumber, &BytesWritten, NULL);
}
=20
<SPAN class=3Drem>// =
=B4=D3=D6=B8=B6=A8=B4=C5=B5=C0=BF=AA=CA=BC=B8=F1=CA=BD=BB=AF=B4=C5=C5=CC<=
/SPAN>
BOOL LowLevelFormatTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, DWORD =
dwStartCylinder, DWORD dwCylinderNumber)
{
FORMAT_PARAMETERS FormatParameters;
PBAD_TRACK_NUMBER lpBadTrack;
DWORD dwOutBytes;
DWORD dwBufSize;
BOOL bResult;
=20
FormatParameters.MediaType =3D lpGeometry->MediaType;
FormatParameters.StartCylinderNumber =3D dwStartCylinder;
FormatParameters.EndCylinderNumber =3D dwStartCylinder + =
dwCylinderNumber - <SPAN class=3Dnum>1</SPAN>;
FormatParameters.StartHeadNumber =3D <SPAN class=3Dnum>0</SPAN>;
FormatParameters.EndHeadNumber =3D lpGeometry->TracksPerCylinder =
- <SPAN class=3Dnum>1</SPAN>;
=20
dwBufSize =3D lpGeometry->TracksPerCylinder * <SPAN =
class=3Dkey>sizeof</SPAN>(BAD_TRACK_NUMBER);
=20
lpBadTrack =3D (PBAD_TRACK_NUMBER) new BYTE[dwBufSize];
=20
<SPAN class=3Drem>// =
=D3=C3IOCTL_DISK_FORMAT_TRACKS=B6=D4=C1=AC=D0=F8=B4=C5=B5=C0=BD=F8=D0=D0=B5=
=CD=BC=B6=B8=F1=CA=BD=BB=AF</SPAN>
bResult =3D ::DeviceIoControl(hDisk, <SPAN =
class=3Drem>// =C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
IOCTL_DISK_FORMAT_TRACKS, <SPAN =
class=3Drem>// =B5=CD=BC=B6=B8=F1=CA=BD=BB=AF</SPAN>
&FormatParameters, <SPAN =
class=3Dkey>sizeof</SPAN>(FormatParameters), <SPAN class=3Drem>// =
=CA=E4=C8=EB=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
lpBadTrack, dwBufSize, <SPAN =
class=3Drem>// =CA=E4=B3=F6=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
&dwOutBytes, <SPAN =
class=3Drem>// =CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN =
class=3Drem>// =D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
delete lpBadTrack;
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =BD=AB=BE=ED=CB=F8=B6=A8</SPAN>
BOOL LockVolume(HANDLE hDisk)
{
DWORD dwOutBytes;
BOOL bResult;
=20
<SPAN class=3Drem>// =D3=C3FSCTL_LOCK_VOLUME=CB=F8=BE=ED</SPAN>
bResult =3D ::DeviceIoControl(hDisk, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
FSCTL_LOCK_VOLUME, <SPAN class=3Drem>// =
=CB=F8=BE=ED</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=C8=EB=CA=FD=BE=DD</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=B3=F6=CA=FD=BE=DD</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =BD=AB=BE=ED=BD=E2=CB=F8</SPAN>
BOOL UnlockVolume(HANDLE hDisk)
{
DWORD dwOutBytes;
BOOL bResult;
=20
<SPAN class=3Drem>// =
=D3=C3FSCTL_UNLOCK_VOLUME=BF=AA=BE=ED=CB=F8</SPAN>
bResult =3D ::DeviceIoControl(hDisk, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
FSCTL_UNLOCK_VOLUME, <SPAN class=3Drem>// =
=BF=AA=BE=ED=CB=F8</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=C8=EB=CA=FD=BE=DD</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=B3=F6=CA=FD=BE=DD</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =BD=AB=BE=ED=D0=B6=CF=C2</SPAN>
<SPAN class=3Drem>// =
=B8=C3=B2=D9=D7=F7=CA=B9=CF=B5=CD=B3=D6=D8=D0=C2=B1=E6=CA=B6=B4=C5=C5=CC=A3=
=AC=B5=C8=D0=A7=D3=DA=D6=D8=D0=C2=B2=E5=C5=CC</SPAN>
BOOL DismountVolume(HANDLE hDisk)
{
DWORD dwOutBytes;
BOOL bResult;
=20
<SPAN class=3Drem>// =D3=C3FSCTL_DISMOUNT_VOLUME=D0=B6=BE=ED</SPAN>
bResult =3D ::DeviceIoControl(hDisk, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
FSCTL_DISMOUNT_VOLUME, <SPAN class=3Drem>// =
=D0=B6=BE=ED</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=C8=EB=CA=FD=BE=DD</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
<SPAN class=3Drem>// =B2=BB=D0=E8=D2=AA=CA=E4=B3=F6=CA=FD=BE=DD</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
</CODE></PRE>
<P=20
=
class=3Dbhw98>=BD=AB=C8=ED=C5=CC=B1=A3=B4=E6=B3=C9=BE=B5=CF=F1=CE=C4=BC=FE=
=B5=C4=B2=BD=D6=E8=BC=F2=B5=A5=C3=E8=CA=F6=CE=AA=A3=BA<BR>1=A1=A2=B4=B4=BD=
=A8=BF=D5=B5=C4=BE=B5=CF=F1=CE=C4=BC=FE=A1=A3<BR>2=A1=A2=B5=F7=D3=C3OpenD=
isk=B4=F2=BF=AA=C8=ED=C5=CC=A1=A3=B3=C9=B9=A6=D7=AA3=A3=AC=CA=A7=B0=DC=D7=
=AA8=A1=A3<BR>3=A1=A2=B5=F7=D3=C3LockVolume=BD=AB=BE=ED=CB=F8=B6=A8=A1=A3=
=B3=C9=B9=A6=D7=AA4=A3=AC=CA=A7=B0=DC=D7=AA7=A1=A3<BR>4=A1=A2=B5=F7=D3=C3=
GetDiskGeometry=BB=F1=C8=A1=B2=CE=CA=FD=A1=A3=B3=C9=B9=A6=D7=AA5=A3=AC=CA=
=A7=B0=DC=D7=AA6=A1=A3<BR>5=A1=A2=BD=AB=B4=C5=C5=CC=B2=CE=CA=FD=D0=B4=C8=EB=
=BE=B5=CF=F1=CE=C4=BC=FE=D7=F7=CE=AA=CE=C4=BC=FE=CD=B7=A1=A3=B5=F7=D3=C3R=
eadTracks=B0=B4=D6=F9=C3=E6=B6=C1=B3=F6=CA=FD=BE=DD=A3=AC=B1=A3=B4=E6=D4=DA=
=BE=B5=CF=F1=CE=C4=BC=FE=D6=D0=A1=A3=D1=AD=BB=B7=B4=CE=CA=FD=B5=C8=D3=DA=D6=
=F9=C3=E6=CA=FD=A1=A3<BR>6=A1=A2=B5=F7=D3=C3UnlockVolume=BD=AB=BE=ED=BD=E2=
=CB=F8=A1=A3<BR>7=A1=A2=B5=F7=D3=C3CloseDisk=B9=D8=B1=D5=C8=ED=C5=CC=A1=A3=
<BR>8=A1=A2=B9=D8=B1=D5=BE=B5=CF=F1=CE=C4=BC=FE=A1=A3</P>
<P=20
=
class=3Dbhw98>=BD=AB=BE=B5=CF=F1=CE=C4=BC=FE=D4=D8=C8=EB=C8=ED=C5=CC=B5=C4=
=B2=BD=D6=E8=BC=F2=B5=A5=C3=E8=CA=F6=CE=AA=A3=BA<BR>1=A1=A2=B4=F2=BF=AA=BE=
=B5=CF=F1=CE=C4=BC=FE=A1=A3<BR>2=A1=A2=B5=F7=D3=C3OpenDisk=B4=F2=BF=AA=C8=
=ED=C5=CC=A1=A3=B3=C9=B9=A6=D7=AA3=A3=AC=CA=A7=B0=DC=D7=AA11=A1=A3<BR>3=A1=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -