Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: exp   (03.12.2008 в 15:05)
Похоже разобрался немного, \\.\ всегда ставится перед именем устройства
Наверное нужно вызвать это DeviceIoControl с другим параметром вместо
IOCTL_DISK_GET_DRIVE_GEOMETRY
, похоже на то что с FSCTL_GET_VOLUME_BITMAP.
Но могу ошибаться ,) тут куча одних только подразделов перечисляющих контрольные коды

попробовал получить другкю структуру , используя контрольный код FSCTL_GET_NTFS_VOLUME_DATA
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
BOOL GetDriveX(NTFS_VOLUME_DATA_BUFFER *pdg)
{
  HANDLE hDevice;               // handle to the drive to be examined 
  BOOL bResult;                 // results flag
  DWORD junk;                   // discard results

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

bResult = DeviceIoControl(
  hDevice,  // handle to device
  FSCTL_GET_NTFS_VOLUME_DATA, // dwIoControlCode
  NULL, // lpInBuffer
  0, // size of input buffer
  &pdg, // output buffer
  sizeof(*pdg), // size of output buffer
  &junk, // number of bytes returned
 (LPOVERLAPPED) NULL// OVERLAPPED structure
); 
  CloseHandle(hDevice);
  return (bResult);
}

int main(int argc, char *argv[]) {
  NTFS_VOLUME_DATA_BUFFER pdg;  // structure
  BOOL bResult;                 //flag

bResult = GetDriveX(&pdg);
  if (bResult)
    printf("VolumeSerialNumber = %I64d\n", pdg.VolumeSerialNumber);
  else 
    printf ("GetDriveX failed. Error %ld.\n", GetLastError ());

  system("PAUSE");
  return ((int)bResult);
}

возвращает GetLastError() == 1
в чём может быть ошибка ?
вроде должен был получить простую структуру

typedef struct { LARGE_INTEGER VolumeSerialNumber;
LARGE_INTEGER NumberSectors;
LARGE_INTEGER TotalClusters;
LARGE_INTEGER FreeClusters;
LARGE_INTEGER TotalReserved;
DWORD BytesPerSector; DWORD BytesPerCluster;
DWORD BytesPerFileRecordSegment;
DWORD ClustersPerFileRecordSegment;
LARGE_INTEGER MftValidDataLength;
LARGE_INTEGER MftStartLcn;
LARGE_INTEGER Mft2StartLcn;
LARGE_INTEGER MftZoneStart;
LARGE_INTEGER MftZoneEnd;
} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: