csdn技术中心 实战deviceiocontrol 之二:获取软盘-硬盘-光盘的参数.mht
来自「DeviceIOControl实战演示及源代码」· MHT 代码 · 共 1,381 行 · 第 1/5 页
MHT
1,381 行
}
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
=
=D4=DAMSDN=B5=C4=C4=C7=B8=F6demo=D6=D0=A3=AC=BD=AB=C9=E8=B1=B8=C3=FB=BB=BB=
=B3=C9=A1=B0A:=A1=B1=C8=A1A=C5=CC=B2=CE=CA=FD=A3=AC=CF=C8=D3=C3=D7=CA=D4=B4=
=B9=DC=C0=ED=C6=F7=B6=C1=D2=BB=CF=C2=C5=CC=A3=AC=D4=D9=D4=CB=D0=D0=D5=E2=B8=
=F6=B3=CC=D0=F2=BF=C9=D2=D4=B3=C9=B9=A6=A3=AC=B5=AB=BB=BB=D2=BB=D5=C5=C5=CC=
=BA=F3=BE=CD=CA=A7=B0=DC=A3=BB=BB=BB=B3=C9=A1=B0CDROM0=A1=B1=C8=A1CDROM=B2=
=CE=CA=FD=A3=AC=CE=DE=C2=DB=C8=E7=BA=CE=B6=BC=B2=BB=D0=D0=A1=A3=D5=E2=B8=F6=
=CE=CA=CC=E2=C8=E7=BA=CE=BD=E2=BE=F6=C4=D8=A3=BF=20
<P class=3Dbhw98><STRONG class=3Dbhw98>A</STRONG>=20
=
=C8=A1=C8=ED=C5=CC=B2=CE=CA=FD=CA=C7=B4=D3=C8=ED=C5=CC=C9=CF=B6=C1=C8=A1=B8=
=F1=CA=BD=BB=AF=BA=F3=B5=C4=D0=C5=CF=A2=A3=AC=D2=B2=BE=CD=CA=C7=B1=D8=D0=EB=
=D6=B4=D0=D0=B6=C1=B2=D9=D7=F7=A3=AC=D5=E2=D2=BB=B5=E3=D3=EB=D3=B2=C5=CC=B2=
=BB=CD=AC=A1=A3=BD=ABCreateFile=D6=D0=B5=C4=B7=C3=CE=CA=B7=BD=CA=BD=B8=C4=
=CE=AAGENERIC_READ=BE=CD=D0=D0=C1=CB=A1=A3=20
<P=20
=
class=3Dbhw98>IOCTL_DISK_GET_DRIVE_GEOMETRY=D5=E2=B8=F6I/O=BF=D8=D6=C6=C2=
=EB=A3=AC=B6=D4=C8=ED=C5=CC=BA=CD=D3=B2=C5=CC=D3=D0=D0=A7=A3=AC=B5=AB=B6=D4=
=D2=BB=D0=A9=BF=C9=D2=C6=B6=AF=C3=BD=BD=E9=C8=E7CD/DVD-ROM=A1=A2TAPE=B5=C8=
=BE=CD=B2=BB=B9=DC=D3=C3=C1=CB=A1=A3=D2=AA=C8=A1CDROM=B2=CE=CA=FD=A3=AC=BB=
=B9=B5=C3=C1=ED=B1=D9=F5=E8=BE=B6=A1=A3IOCTL_STORAGE_GET_MEDIA_TYPES_EX=C4=
=DC=B9=BB=B0=EF=CE=D2=C3=C7=BD=E2=BE=F6=CE=CA=CC=E2=A1=A3=20
<P class=3Dbhw98><STRONG class=3Dbhw98>Q</STRONG>=20
=
=CA=B9=D3=C3=D5=E2=D0=A9I/O=BF=D8=D6=C6=C2=EB=A3=AC=D0=E8=D2=AA=CA=B2=C3=B4=
=D1=F9=B5=C4=CA=E4=C8=EB=CA=E4=B3=F6=CA=FD=BE=DD=B8=F1=CA=BD=C4=D8=A3=BF =
<P class=3Dbhw98><STRONG class=3Dbhw98>A</STRONG>=20
=
DeviceIoControl=CA=B9=D3=C3=D5=E2=C1=BD=B8=F6=BF=D8=D6=C6=C2=EB=CA=B1=A3=AC=
=B6=BC=B2=BB=D0=E8=D2=AA=CA=E4=C8=EB=CA=FD=BE=DD=A1=A3=20
<P =
class=3Dbhw98>IOCTL_DISK_GET_DRIVE_GEOMETRY=D6=B1=BD=D3=CA=E4=B3=F6=D2=BB=
=B8=F6DISK_GEOMETRY=BD=E1=B9=B9=A3=BA <PRE class=3Dbhw98><CODE =
class=3Dbhw98><SPAN class=3Dkey>typedef struct</SPAN> _DISK_GEOMETRY {
LARGE_INTEGER Cylinders; <SPAN class=3Drem>// =
=D6=F9=C3=E6=CA=FD</SPAN>
MEDIA_TYPE MediaType; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C0=E0=D0=CD</SPAN>
DWORD TracksPerCylinder; <SPAN class=3Drem>// =
=C3=BF=D6=F9=C3=E6=B5=C4=B4=C5=B5=C0=CA=FD</SPAN>
DWORD SectorsPerTrack; <SPAN class=3Drem>// =
=C3=BF=B4=C5=B5=C0=B5=C4=C9=C8=C7=F8=CA=FD</SPAN>
DWORD BytesPerSector; <SPAN class=3Drem>// =
=C3=BF=C9=C8=C7=F8=B5=C4=D7=D6=BD=DA=CA=FD</SPAN>
} DISK_GEOMETRY;
</CODE></PRE>
<P=20
=
class=3Dbhw98>IOCTL_STORAGE_GET_MEDIA_TYPES_EX=CA=E4=B3=F6=D2=BB=B8=F6GET=
_MEDIA_TYPES=BD=E1=B9=B9=A3=BA <PRE class=3Dbhw98><CODE =
class=3Dbhw98><SPAN class=3Dkey>typedef struct</SPAN> _GET_MEDIA_TYPES {
DWORD DeviceType; <SPAN class=3Drem>// =
=C9=E8=B1=B8=C0=E0=D0=CD</SPAN>
DWORD MediaInfoCount; <SPAN class=3Drem>// =
=BD=E9=D6=CA=D0=C5=CF=A2=CC=F5=CA=FD</SPAN>
DEVICE_MEDIA_INFO MediaInfo[<SPAN class=3Dnum>1</SPAN>]; <SPAN =
class=3Drem>// =BD=E9=D6=CA=D0=C5=CF=A2</SPAN>
} GET_MEDIA_TYPES;
</CODE></PRE>
<P =
class=3Dbhw98>=C8=C3=CE=D2=C3=C7=C0=B4=BF=B4=D2=BB=CF=C2DEVICE_MEDIA_INFO=
=BD=E1=B9=B9=B5=C4=B6=A8=D2=E5=A3=BA <PRE class=3Dbhw98><CODE =
class=3Dbhw98><SPAN class=3Dkey>typedef struct</SPAN> _DEVICE_MEDIA_INFO =
{
<SPAN class=3Dkey>union</SPAN> {
<SPAN class=3Dkey>struct</SPAN> {
LARGE_INTEGER Cylinders; <SPAN class=3Drem>// =
=D6=F9=C3=E6=CA=FD</SPAN>
STORAGE_MEDIA_TYPE MediaType; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C0=E0=D0=CD</SPAN>
DWORD TracksPerCylinder; <SPAN class=3Drem>// =
=C3=BF=D6=F9=C3=E6=B5=C4=B4=C5=B5=C0=CA=FD</SPAN>
DWORD SectorsPerTrack; <SPAN class=3Drem>// =
=C3=BF=B4=C5=B5=C0=B5=C4=C9=C8=C7=F8=CA=FD</SPAN>
DWORD BytesPerSector; <SPAN class=3Drem>// =
=C3=BF=C9=C8=C7=F8=B5=C4=D7=D6=BD=DA=CA=FD</SPAN>
DWORD NumberMediaSides; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C3=E6=CA=FD</SPAN>
DWORD MediaCharacteristics; <SPAN class=3Drem>// =
=BD=E9=D6=CA=CC=D8=D0=D4</SPAN>
} DiskInfo; <SPAN class=3Drem>// =
=D3=B2=C5=CC=D0=C5=CF=A2</SPAN>
<SPAN class=3Dkey>struct</SPAN> {
LARGE_INTEGER Cylinders; <SPAN class=3Drem>// =
=D6=F9=C3=E6=CA=FD</SPAN>
STORAGE_MEDIA_TYPE MediaType; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C0=E0=D0=CD</SPAN>
DWORD TracksPerCylinder; <SPAN class=3Drem>// =
=C3=BF=D6=F9=C3=E6=B5=C4=B4=C5=B5=C0=CA=FD</SPAN>
DWORD SectorsPerTrack; <SPAN class=3Drem>// =
=C3=BF=B4=C5=B5=C0=B5=C4=C9=C8=C7=F8=CA=FD</SPAN>
DWORD BytesPerSector; <SPAN class=3Drem>// =
=C3=BF=C9=C8=C7=F8=B5=C4=D7=D6=BD=DA=CA=FD</SPAN>
DWORD NumberMediaSides; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C3=E6=CA=FD</SPAN>
DWORD MediaCharacteristics; <SPAN class=3Drem>// =
=BD=E9=D6=CA=CC=D8=D0=D4</SPAN>
} RemovableDiskInfo; <SPAN class=3Drem>// =
=A1=B0=BF=C9=D2=C6=B6=AF=C5=CC=A1=B1=D0=C5=CF=A2</SPAN>
<SPAN class=3Dkey>struct</SPAN> {
STORAGE_MEDIA_TYPE MediaType; <SPAN class=3Drem>// =
=BD=E9=D6=CA=C0=E0=D0=CD</SPAN>
DWORD MediaCharacteristics; <SPAN class=3Drem>// =
=BD=E9=D6=CA=CC=D8=D0=D4</SPAN>
DWORD CurrentBlockSize; <SPAN class=3Drem>// =
=BF=E9=B5=C4=B4=F3=D0=A1</SPAN>
} TapeInfo; <SPAN class=3Drem>// =
=B4=C5=B4=F8=D0=C5=CF=A2</SPAN>
} DeviceSpecific;
} DEVICE_MEDIA_INFO;
</CODE></PRE>
<P=20
=
class=3Dbhw98>=C6=E4=D6=D0CD-ROM=CA=F4=D3=DA=A1=B0=BF=C9=D2=C6=B6=AF=C5=CC=
=A1=B1=B5=C4=B7=B6=CE=A7=A1=A3=C7=EB=D7=A2=D2=E2=A3=ACGET_MEDIA_TYPES=BD=E1=
=B9=B9=B1=BE=C9=ED=D6=BB=B6=A8=D2=E5=C1=CB=D2=BB=CC=F5DEVICE_MEDIA_INFO=A3=
=AC=B6=EE=CD=E2=B5=C4DEVICE_MEDIA_INFO=D0=E8=D2=AA=BD=F4=BD=D3=B4=CB=BD=E1=
=B9=B9=B5=C4=C1=ED=CD=E2=B5=C4=BF=D5=BC=E4=A1=A3=20
<P class=3Dbhw98><STRONG class=3Dbhw98>Q</STRONG>=20
=
=B5=F7=D3=C3=B7=BD=B7=A8=CE=D2=C1=CB=BD=E2=C1=CB=A3=AC=C7=EB=D3=C3VC=BE=D9=
=B8=F6=C0=FD=D7=D3=C0=B4=CA=B5=CF=D6=CE=D2=CB=F9=C6=DA=B4=FD=D2=D1=BE=C3=B5=
=C4=B9=A6=C4=DC=B0=C9=A3=BF=20
<P class=3Dbhw98><STRONG class=3Dbhw98>A</STRONG>=20
=
=BA=C3=A3=AC=CF=D6=D4=DA=BE=CD=D1=DD=CA=BE=D2=BB=CF=C2=C8=E7=BA=CE=C8=A1=C8=
=ED=C5=CC/=D3=B2=C5=CC/=B9=E2=C5=CC=B5=C4=B2=CE=CA=FD=A1=A3=B2=E2=CA=D4=CA=
=B1=A3=AC=BC=C7=B5=C3=D2=AA=D3=D0=C8=ED=C5=CC/=B9=E2=C5=CC=B2=E5=D4=DA=C7=
=FD=B6=AF=C6=F7=C0=EF=E0=B8=A3=A1=20
<P class=3Dbhw98>=CA=D7=CF=C8=A3=AC=D3=C3MFC=20
=
AppWizard=C9=FA=B3=C9=D2=BB=B8=F6=B5=A5=CE=C4=B5=B5=B5=C4=D3=A6=D3=C3=B3=CC=
=D0=F2=A3=AC=C8=A1=C3=FB=CE=AADiskGeometry=A3=AC=C8=C3=CB=FC=B5=C4View=BB=
=F9=D3=DACEditView=A1=A3=20
<P =
class=3Dbhw98>=C8=BB=BA=F3=A3=AC=CC=ED=BC=D3=D2=D4=CF=C2=B5=C4.h=BA=CD.cp=
p=CE=C4=BC=FE=A1=A3 <PRE class=3Dbhw98><CODE class=3Dbhw98><SPAN =
class=3Drem>/////////////////////////////////////////////////////////////=
/////////////////
// GetDiskGeometry.h
/////////////////////////////////////////////////////////////////////////=
/////</SPAN>
=20
<SPAN class=3Dkey>#if</SPAN> !<SPAN =
class=3Dkey>defined</SPAN>(GET_DISK_GEOMETRY_H__)
<SPAN class=3Dkey>#define</SPAN> GET_DISK_GEOMETRY_H__
=20
<SPAN class=3Dkey>#if</SPAN> _MSC_VER > <SPAN class=3Dnum>1000</SPAN>
<SPAN class=3Dkey>#pragma once</SPAN>
<SPAN class=3Dkey>#endif</SPAN> <SPAN class=3Drem>// _MSC_VER > =
1000</SPAN>
=20
<SPAN class=3Dkey>#include</SPAN> <SPAN =
class=3Dstr><winioctl.h></SPAN>
=20
BOOL GetDriveGeometry(<SPAN class=3Dkey>const char</SPAN>* filename, =
DISK_GEOMETRY *pdg);
=20
<SPAN class=3Dkey>#endif</SPAN> <SPAN class=3Drem>// =
!defined(GET_DISK_GEOMETRY_H__)</SPAN>
=20
<SPAN =
class=3Drem>/////////////////////////////////////////////////////////////=
/////////////////
// GetDiskGeometry.cpp
/////////////////////////////////////////////////////////////////////////=
/////</SPAN>
=20
<SPAN class=3Dkey>#include</SPAN> <SPAN class=3Dstr>"stdafx.h"</SPAN>
<SPAN class=3Dkey>#include</SPAN> <SPAN =
class=3Dstr>"GetDiskGeometry.h"</SPAN>
=20
<SPAN class=3Drem>// =
IOCTL_STORAGE_GET_MEDIA_TYPES_EX=BF=C9=C4=DC=B7=B5=BB=D8=B2=BB=D6=B9=D2=BB=
=CC=F5DEVICE_MEDIA_INFO=A3=AC=B9=CA=B6=A8=D2=E5=D7=E3=B9=BB=B5=C4=BF=D5=BC=
=E4</SPAN>
<SPAN class=3Dkey>#define</SPAN> MEDIA_INFO_SIZE <SPAN =
class=3Dkey>sizeof</SPAN>(GET_MEDIA_TYPES)+<SPAN =
class=3Dnum>15</SPAN>*<SPAN class=3Dkey>sizeof</SPAN>(DEVICE_MEDIA_INFO)
=20
<SPAN class=3Drem>// filename -- =
=D3=C3=D3=DA=C9=E8=B1=B8=B5=C4=CE=C4=BC=FE=C3=FB
// pdg -- =B2=CE=CA=FD=BB=BA=B3=E5=C7=F8=D6=B8=D5=EB</SPAN>
BOOL GetDriveGeometry(<SPAN class=3Dkey>const char</SPAN>* filename, =
DISK_GEOMETRY *pdg)
{
HANDLE hDevice; <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
BOOL bResult; <SPAN class=3Drem>// =
DeviceIoControl=B5=C4=B7=B5=BB=D8=BD=E1=B9=FB</SPAN>
GET_MEDIA_TYPES *pmt; <SPAN class=3Drem>// =
=C4=DA=B2=BF=D3=C3=B5=C4=CA=E4=B3=F6=BB=BA=B3=E5=C7=F8</SPAN>
DWORD dwOutBytes; <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
=20
<SPAN class=3Drem>// =B4=F2=BF=AA=C9=E8=B1=B8</SPAN>
hDevice =3D ::CreateFile(filename, <SPAN class=3Drem>// =
=CE=C4=BC=FE=C3=FB</SPAN>
GENERIC_READ, <SPAN class=3Drem>// =
=C8=ED=C7=FD=D0=E8=D2=AA=B6=C1=C5=CC</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>if</SPAN> (hDevice =3D=3D INVALID_HANDLE_VALUE)
{
<SPAN class=3Drem>// =
=C9=E8=B1=B8=CE=DE=B7=A8=B4=F2=BF=AA...</SPAN>
<SPAN class=3Dkey>return</SPAN> FALSE;
}
=20
<SPAN class=3Drem>// =
=D3=C3IOCTL_DISK_GET_DRIVE_GEOMETRY=C8=A1=B4=C5=C5=CC=B2=CE=CA=FD</SPAN>
bResult =3D ::DeviceIoControl(hDevice, <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>
pdg, sizeof(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=3Drem>// =
=C8=E7=B9=FB=CA=A7=B0=DC=A3=AC=D4=D9=D3=C3IOCTL_STORAGE_GET_MEDIA_TYPES_E=
X=C8=A1=BD=E9=D6=CA=C0=E0=D0=CD=B2=CE=CA=FD</SPAN>
<SPAN class=3Dkey>if</SPAN> (!bResult)
{
pmt =3D (GET_MEDIA_TYPES *)<SPAN class=3Dkey>new</SPAN> =
BYTE[MEDIA_INFO_SIZE];
=20
bResult =3D ::DeviceIoControl(hDevice, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
IOCTL_STORAGE_GET_MEDIA_TYPES_EX, <SPAN class=3Drem>// =
=C8=A1=BD=E9=D6=CA=C0=E0=D0=CD=B2=CE=CA=FD</SPAN>
NULL, <SPAN class=3Dnum>0</SPAN>, =
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?