Как получить информацию о дисководе
Чтобы получить информацию о типах дискет,
поддерживаемых дисководом, необходимо сперва
вызвать CreateFile() (для получения дескриптора
устройства), а затем DeviceIoControl() (для получения
информации. Однако, если в дисководе не будет
дискеты, то при вызове CreateFile() для диска A (\\.\a:)
может появиться следующее сообщение:
There is no disk in the drive. Please insert a disk into drive A:
При вызове CreateFile(), необходимо установить
уровень доступа 0 и FILE_SHARE_READ, чтобы система не
просила пользователя вставить дискету:
CreateFile(
szFileName,
0,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
0,
NULL
);
Другой способ избежать этого приглашения, это
вызвать
SetErrorMode( SEM_FAILCRITICALERRORS );
перед вызовом CreateFile().
Следующий код основан на примере FLOPPY из SDK, но он
показыват только типы дискет, поддерживаемые
дисководом A. А так же этот пример позволяет
избавиться от приглашения системы вставить
дискету в дисковод.
Пример кода
#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
DISK_GEOMETRY SupportedGeometry[20];
DWORD SupportedGeometryCount;
VOID
GetSupportedGeometrys( HANDLE hDisk )
{
DWORD ReturnedByteCount;
if( DeviceIoControl(
hDisk,
IOCTL_DISK_GET_MEDIA_TYPES,
NULL,
0,
SupportedGeometry,
sizeof(SupportedGeometry),
&ReturnedByteCount,
NULL
))
SupportedGeometryCount = ReturnedByteCount /
sizeof(DISK_GEOMETRY);
else SupportedGeometryCount = 0;
}
VOID
PrintGeometry( PDISK_GEOMETRY lpGeometry )
{
LPSTR MediaType;
switch ( lpGeometry->MediaType ) {
case F5_1Pt2_512:
MediaType = "5.25, 1.2MB, 512 bytes/sector";
break;
case F3_1Pt44_512:
MediaType = "3.5, 1.44MB, 512 bytes/sector";
break;
case F3_2Pt88_512:
MediaType = "3.5, 2.88MB, 512 bytes/sector";
break;
case F3_20Pt8_512:
MediaType = "3.5, 20.8MB, 512 bytes/sector";
break;
case F3_720_512:
MediaType = "3.5, 720KB, 512 bytes/sector";
break;
case F5_360_512:
MediaType = "5.25, 360KB, 512 bytes/sector";
break;
case F5_320_512:
MediaType = "5.25, 320KB, 512 bytes/sector";
break;
case F5_320_1024:
MediaType = "5.25, 320KB, 1024 bytes/sector";
break;
case F5_180_512:
MediaType = "5.25, 180KB, 512 bytes/sector";
break;
case F5_160_512:
MediaType = "5.25, 160KB, 512 bytes/sector";
break;
case RemovableMedia:
MediaType = "Removable media other than floppy";
break;
case FixedMedia:
MediaType = "Fixed hard disk media";
break;
default:
MediaType = "Unknown";
break;
}
printf(" Media Type %s\n", MediaType );
printf(" Cylinders %d, Tracks/Cylinder %d, Sectors/Track %d\n",
lpGeometry->Cylinders.LowPart, lpGeometry->TracksPerCylinder,
lpGeometry->SectorsPerTrack
);
}
void main( int argc, char *argv[], char *envp[] )
{
HANDLE hDrive;
UINT i;
hDrive = CreateFile(
"\\\\.\\a:",
0,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
0,
NULL
);
if ( hDrive == INVALID_HANDLE_VALUE )
{
printf( "Open failed: %d\n", GetLastError() );
ExitProcess(1);
}
GetSupportedGeometrys( hDrive );
printf( "\nDrive A supports the following disk geometries\n" );
for( i=0; i<SupportedGeometryCount; i++ )
{
printf("\n");
PrintGeometry( &SupportedGeometry[i] );
}
printf("\n");
}
|