Автор: 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;