Ну очень надо!

  • Автор темы -
  • Дата начала
Статус
Закрыто для дальнейших ответов.

Гость
#1
Помогите......Надо на Visual C++ написать скандиск. Как мне считать физические данные о диске. Есть такая функция DeviceIoControl... но не могу понять с MSDN как она работает.............
 
B

bl4iD

Гость
#2
Слава
Посмотри в MSDN в сторону DRIVEGEOMETRY (или что-то типо такого), там как раз DeviceIoControl используется , и вроде даже исходник есть, во всяком случае я оттуда брал. Именно геометрические параметры винта, т.е. кластеры, сектора, цилиндры... С серийным номером и моделью всё намного сложнее...
 
?

????

Гость
#3
Как мне считать физические данные о диске
Для XP:

Код:
Calling DeviceIoControl

An application can use the DeviceIoControl function to perform direct input and output operations on, or retrieve information about, a floppy disk drive, hard disk drive, tape drive, or CD-ROM drive. The following example demonstrates how to retrieve information about the first physical drive in the system. It uses the CreateFile function to retrieve the device handle to the first physical drive, and then uses DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY structure with information about the drive.

/* The code of interest is in the subroutine GetDriveGeometry. The 
 code in main shows how to interpret the results of the IOCTL call. */

#include <windows.h>
#include <winioctl.h>

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
HANDLE hDevice;        // handle to the drive to be examined 
BOOL bResult;         // results flag
DWORD junk;          // discard results

hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open
         0,        // no access to the drive
         FILE_SHARE_READ | // share mode
         FILE_SHARE_WRITE, 
         NULL,       // default security attributes
         OPEN_EXISTING,  // disposition
         0,        // file attributes
         NULL);      // do not copy file attributes

if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
 return (FALSE);
}

bResult = DeviceIoControl(hDevice, // device to be queried
  IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
              NULL, 0, // no input buffer
             pdg, sizeof(*pdg),   // output buffer
             &junk,         // # bytes returned
             (LPOVERLAPPED) NULL); // synchronous I/O

CloseHandle(hDevice);

return (bResult);
}

int main(int argc, char *argv[])
{
DISK_GEOMETRY pdg;      // disk drive geometry structure
BOOL bResult;         // generic results flag
ULONGLONG DiskSize;      // size of the drive, in bytes

bResult = GetDriveGeometry (&pdg);

if (bResult) 
{
 printf("Cylinders = %I64d\n", pdg.Cylinders);
 printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
 printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
 printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

 DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
  (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
 printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
     DiskSize / (1024 * 1024));
} 
else 
{
 printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}

return ((int)bResult);
}
This example does not work on Windows Me/98/95 for the following reasons:


The standard device input/output control codes are not available. 
An application must specify a virtual device driver in the CreateFile function—not a specific device. 
Windows Me/98/95: For an example that works on Windows Me/98/95, see Calling DeviceIoControl on Windows Me/98/95.
Для всех остальных:

Код:
Calling DeviceIoControl on Windows Me/98/95
An application running on Windows Me/98/95 can use the DeviceIoControl function to send control codes directly to a virtual device driver (VxD). Any VxD can support any number of control codes, or none at all.


The system VxD, VWIN32.VXD, supports the input and output control (IOCTL) functions originally provided by MS-DOS Interrupt 21h. The following example shows how to call Get Media ID (Interrupt 21h Function 440Dh Minor Code 66h) from an application:

#define VWIN32_DIOC_DOS_IOCTL 1 

typedef struct _DEVIOCTL_REGISTERS 
{ 
 DWORD reg_EBX; 
 DWORD reg_EDX; 
 DWORD reg_ECX; 
 DWORD reg_EAX; 
 DWORD reg_EDI; 
 DWORD reg_ESI; 
 DWORD reg_Flags; 
} DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS; 

typedef struct _MID 
{ 
 WORD midInfoLevel; 
 DWORD midSerialNum; 
 BYTE midVolLabel[11]; 
 BYTE midFileSysType[8]; 
} MID, *PMID; 

BOOL GetMediaID(PMID pmid, UINT nDrive) 
{ 
 DEVIOCTL_REGISTERS reg; 

 reg.reg_EAX = 0x440D;    // IOCTL for block devices 
 reg.reg_EBX = nDrive;    // zero-based drive ID 
 reg.reg_ECX = 0x0866;    // Get Media ID command 
 reg.reg_EDX = (DWORD) pmid; // receives media ID info 

 if (!DoIOCTL(&reg)) 
   return FALSE; 

 if (reg.reg_Flags & 0x8000) // error if carry flag set 
   return FALSE; 

 return TRUE; 
} 

BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg) 
{ 
 HANDLE hDevice; 

 BOOL fResult; 
 DWORD cb; 

 preg->reg_Flags = 0x8000; // assume error (carry flag set) 

 hDevice = CreateFile("\\\\.\\vwin32", 
   GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
   (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, 
   FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 

 if (hDevice == (HANDLE) INVALID_HANDLE_VALUE) 
   return FALSE; 
 else 
 { 
   fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL, 
     preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0); 
 } 

 CloseHandle(hDevice); 

 return fResult;
}

For an example that works on other versions of Windows, see Calling DeviceIoControl.
Что именно не понятно???
 
G

Guest_AlexiS

Гость
#4
<!--QuoteBegin-????+13:04:2004, 23:44 -->
<span class="vbquote">(???? @ 13:04:2004, 23:44 )</span><!--QuoteEBegin-->Для XP:

Код:
Calling DeviceIoControl

An application can use the DeviceIoControl function to perform direct input and output operations on, or retrieve information about, a floppy disk drive, hard disk drive, tape drive, or CD-ROM drive. The following example demonstrates how to retrieve information about the first physical drive in the system. It uses the CreateFile function to retrieve the device handle to the first physical drive, and then uses DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY structure with information about the drive.

/* The code of interest is in the subroutine GetDriveGeometry. The 
  code in main shows how to interpret the results of the IOCTL call. */

#include <windows.h>
#include <winioctl.h>

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
 HANDLE hDevice;               // handle to the drive to be examined 
 BOOL bResult;                 // results flag
 DWORD junk;                   // discard results

 hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
                   0,                // no access to the drive
                   FILE_SHARE_READ | // share mode
                   FILE_SHARE_WRITE, 
                   NULL,             // default security attributes
                   OPEN_EXISTING,    // disposition
                   0,                // file attributes
                   NULL);            // do not copy file attributes

 if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
 {
   return (FALSE);
 }

 bResult = DeviceIoControl(hDevice,  // device to be queried
     IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                            NULL, 0, // no input buffer
                           pdg, sizeof(*pdg),     // output buffer
                           &junk,                 // # bytes returned
                           (LPOVERLAPPED) NULL);  // synchronous I/O

 CloseHandle(hDevice);

 return (bResult);
}

int main(int argc, char *argv[])
{
 DISK_GEOMETRY pdg;            // disk drive geometry structure
 BOOL bResult;                 // generic results flag
 ULONGLONG DiskSize;           // size of the drive, in bytes

 bResult = GetDriveGeometry (&pdg);

 if (bResult) 
 {
   printf("Cylinders = %I64d\n", pdg.Cylinders);
   printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
   printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
   printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

   DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
     (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
   printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
          DiskSize / (1024 * 1024));
 } 
 else 
 {
   printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
 }

 return ((int)bResult);
}
This example does not work on Windows Me/98/95 for the following reasons:


The standard device input/output control codes are not available. 
An application must specify a virtual device driver in the CreateFile function—not a specific device. 
Windows Me/98/95:  For an example that works on Windows Me/98/95, see Calling DeviceIoControl on Windows Me/98/95.
Для всех остальных:

Код:
Calling DeviceIoControl on Windows Me/98/95
An application running on Windows Me/98/95 can use the DeviceIoControl function to send control codes directly to a virtual device driver (VxD). Any VxD can support any number of control codes, or none at all.


The system VxD, VWIN32.VXD, supports the input and output control (IOCTL) functions originally provided by MS-DOS Interrupt 21h. The following example shows how to call Get Media ID (Interrupt 21h Function 440Dh Minor Code 66h) from an application:

#define VWIN32_DIOC_DOS_IOCTL 1 

typedef struct _DEVIOCTL_REGISTERS 
{ 
   DWORD reg_EBX; 
   DWORD reg_EDX; 
   DWORD reg_ECX; 
   DWORD reg_EAX; 
   DWORD reg_EDI; 
   DWORD reg_ESI; 
   DWORD reg_Flags; 
} DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS; 

typedef struct _MID 
{ 
   WORD  midInfoLevel; 
   DWORD midSerialNum; 
   BYTE  midVolLabel[11]; 
   BYTE  midFileSysType[8]; 
} MID, *PMID; 

BOOL GetMediaID(PMID pmid, UINT nDrive) 
{ 
   DEVIOCTL_REGISTERS reg; 

   reg.reg_EAX = 0x440D;       // IOCTL for block devices 
   reg.reg_EBX = nDrive;       // zero-based drive ID 
   reg.reg_ECX = 0x0866;       // Get Media ID command 
   reg.reg_EDX = (DWORD) pmid; // receives media ID info 

   if (!DoIOCTL(&reg)) 
       return FALSE; 

   if (reg.reg_Flags & 0x8000) // error if carry flag set 
       return FALSE; 

   return TRUE; 
} 

BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg) 
{ 
   HANDLE hDevice; 

   BOOL fResult; 
   DWORD cb; 

   preg->reg_Flags = 0x8000; // assume error (carry flag set) 

   hDevice = CreateFile("\\\\.\\vwin32", 
       GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
       (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, 
       FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 

   if (hDevice == (HANDLE) INVALID_HANDLE_VALUE) 
       return FALSE; 
   else 
   { 
       fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL, 
           preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0); 
   } 

   CloseHandle(hDevice); 

   return fResult;
}

For an example that works on other versions of Windows, see Calling DeviceIoControl.
Что именно не понятно???[/quote]
А если мне надо получить от диска А такие параметры как: размер межсекторного промежутка, и число секторов с одинаковыми именами на одной дорожке. То как это сделать в MSND ни чего подходящего не нашёл. И ещё как использовать DeviseIOControl для форматирования диска. Пробывал как написано в MSDN выдает ошибку типа нет доступа. Если знаете помогите пожалуста
 
Статус
Закрыто для дальнейших ответов.