Как в Win9X определять геометрию дисков ? Нужны данные аналогичные DISK_GEOMETRY в WinNT. Нужно это для создания имиджей дисков.
21.03.03 10:12: Перенесено модератором из 'WIN API' в Исходники — ХД
Здравствуйте, Roman_M, Вы писали:
RM>Как в Win9X определять геометрию дисков ? Нужны данные аналогичные DISK_GEOMETRY в WinNT. Нужно это для создания имиджей дисков.
Могу мылом выслать — слишком большой кусок кода
... << RSDN@Home 1.0 beta 6a >>
Здравствуйте, Roman_M, Вы писали:
RM>Как в Win9X определять геометрию дисков ? Нужны данные аналогичные DISK_GEOMETRY в WinNT. Нужно это для создания имиджей дисков.
Ищи в этом напралении:
HANDLE hSMARTIOCTL;
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);
hSMARTIOCTL=INVALID_HANDLE_VALUE;
if (osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
hSMARTIOCTL = CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
//hSMARTIOCTL = CreateFile("\\\\.\\Scsi2:",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
ReportError ();
}
if (osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
hSMARTIOCTL = CreateFile("c:\\asedtr.tmp", 0,0,0,CREATE_NEW, 0, 0);//\\\\.\\SMARTVSD
}
if (hSMARTIOCTL!=INVALID_HANDLE_VALUE)
{
AfxMessageBox("Handle valid");
DWORD Returned;
GETVERSIONOUTPARAMS VersionParams;
memset((void*)&VersionParams, 0, sizeof(VersionParams));
DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION,NULL,0,&VersionParams, sizeof(VersionParams),&Returned, NULL);
byte Cmd=(VersionParams.fCapabilities&1 == 1)?IDE_ID_FUNCTION:IDE_ATAPI_ID ;
SENDCMDINPARAMS scip;
memset(&scip, 0, sizeof(scip));
memset(IdOutCmd, 0, sizeof(IdOutCmd));
DoIDENTIFY(hSMARTIOCTL,&scip,(PSENDCMDOUTPARAMS)&IdOutCmd,Cmd,0,&Returned);
PIDSECTOR S=(PIDSECTOR)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
CString Tmp; char Buf[1024];
ChangeByteOrder(S->sModelNumber,sizeof S->sModelNumber);
memset (Buf,0,1024);
strncpy(Buf, S->sModelNumber, sizeof(S->sModelNumber));
Tmp.Format("Model %s",Buf);
m_Hdd0.AddString(Tmp);
ChangeByteOrder(S->sFirmwareRev,sizeof S->sFirmwareRev);
memset (Buf,0,1024);
strncpy(Buf, S->sFirmwareRev, sizeof(S->sFirmwareRev));
Tmp.Format("Firmware %s",Buf);
m_Hdd0.AddString(Tmp);
ChangeByteOrder(S->sSerialNumber,sizeof S->sSerialNumber);
memset (Buf,0,1024);
strncpy(Buf, S->sSerialNumber, sizeof(S->sSerialNumber));
Tmp.Format("Serial ╣ %s",Buf);
m_Hdd0.AddString(Tmp);
UpdateData (FALSE);
CloseHandle(hSMARTIOCTL);
if (osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
DeleteFile("c:\\asedtr.tmp");
}
}
char Drives[1024];
GetLogicalDriveStrings( 1024,Drives);
char CurDrive[4];
int CurIdx=0,TmpIdx;
while (true)
{
TmpIdx=0;
while ((Drives[CurIdx]!=0))
{
CurDrive[TmpIdx]=Drives[CurIdx];
TmpIdx++; CurIdx++;
}
CurDrive[TmpIdx]=Drives[CurIdx];
if (::GetDriveType(CurDrive)==DRIVE_FIXED)
{
char VolumeName[256],FS[128];
DWORD Serial,MaxLength,Flags;
::GetVolumeInformation(CurDrive,VolumeName,256,&Serial,NULL,NULL,FS,128);
CString Hdd;
Hdd.Format("%s [%s] S\\N %d %s",CurDrive,VolumeName,Serial,FS);
m_HddList.AddString(Hdd);
}
if ((Drives[CurIdx-1]==0)&&(Drives[CurIdx]==0)) return true;
CurIdx++;
}
return true;
}
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте, Saddam, Вы писали:
S>Здравствуйте, Roman_M, Вы писали:
RM>>Как в Win9X определять геометрию дисков ? Нужны данные аналогичные DISK_GEOMETRY в WinNT. Нужно это для создания имиджей дисков.
S>Ищи в этом напралении:
S>S> if (osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
S> {
S> hSMARTIOCTL = CreateFile("c:\\asedtr.tmp", 0,0,0,CREATE_NEW, 0, 0);//\\\\.\\SMARTVSD
S> }
S>
S>
а если smartdrv отсутствует, то в \\\\.\\Ide
... << RSDN@Home 1.0 beta 6a >>