CreateFile & dwDesiredAccess=0

Тема в разделе "WASM.WIN32", создана пользователем weiv, 7 сен 2004.

  1. weiv

    weiv New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2003
    Сообщения:
    25
    Адрес:
    Новосибирск
    В MSDN написано, что если в качестве второго параметра

    функции CreateFile указать 0 (а не GENERIC_READ, GENERIC_WRITE), то можно получить какие-то атрибуты устройства (НГМД), еще защищена ли дискета от записи, а еще можно без открытия файла узнать существует ли он.



    И больше не слова. Где должны возращаться эти атрибуты,

    чему должны быть равны другие параметры функции.



    CreateFile возвращает обычный описатель.
     
  2. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Вот что пишет МСДН:


    Код (Text):
    1. /* The code of interest is in the subroutine GetDriveGeometry. The
    2.    code in main shows how to interpret the results of the IOCTL call. */
    3.  
    4. #include <windows.h>
    5. #include <winioctl.h>
    6.  
    7. BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
    8. {
    9.   HANDLE hDevice;               // handle to the drive to be examined
    10.   BOOL bResult;                 // results flag
    11.   DWORD junk;                   // discard results
    12.  
    13.   hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
    14.                     0,                // no access to the drive
    15.                     FILE_SHARE_READ | // share mode
    16.                     FILE_SHARE_WRITE,
    17.                     NULL,             // default security attributes
    18.                     OPEN_EXISTING,    // disposition
    19.                     0,                // file attributes
    20.                     NULL);            // do not copy file attributes
    21.  
    22.   if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    23.   {
    24.     return (FALSE);
    25.   }
    26.  
    27.   bResult = DeviceIoControl(hDevice,  // device to be queried
    28.       IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
    29.                              NULL, 0, // no input buffer
    30.                             pdg, sizeof(*pdg),     // output buffer
    31.                             &junk,                 // # bytes returned
    32.                             (LPOVERLAPPED) NULL);  // synchronous I/O
    33.  
    34.   CloseHandle(hDevice);
    35.  
    36.   return (bResult);
    37. }
    38.  
    39. int main(int argc, char *argv[])
    40. {
    41.   DISK_GEOMETRY pdg;            // disk drive geometry structure
    42.   BOOL bResult;                 // generic results flag
    43.   ULONGLONG DiskSize;           // size of the drive, in bytes
    44.  
    45.   bResult = GetDriveGeometry (&pdg);
    46.  
    47.   if (bResult)
    48.   {
    49.     printf("Cylinders = %I64d\n", pdg.Cylinders);
    50.     printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
    51.     printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
    52.     printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);
    53.  
    54.     DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
    55.       (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
    56.     printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
    57.            DiskSize / (1024 * 1024));
    58.   }
    59.   else
    60.   {
    61.     printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
    62.   }
    63.  
    64.   return ((int)bResult);
    65. }
    66.  




    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.



    P.S. На асме я этого не писал. Надеюсь, этот пост с использованием С соответствует правилам форума.