esh |
Отправлено: 23.08.2005, 03:06 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
Нужно добавить в программу возможность работы с дисками. Диск открываю с помощью
FileOpen("\\\\.\\C:",...);
Вроде работает, но:
1) не могу определить размер диска с помощью GetFileSize.
2) не могу открыть \\.\PHYSICALDRIVE0.
Эти проблемы имхо решить можно, смотрю в сторону GetDiskFreeSpaceEx, DeviceIoControl и использования
CreateFile вместо FileCreate (т.к. FileCreate по сути является оберткой CreateFile,
проблем возникнуть не должно, имхо).
Основная проблема -- нужно сделать список, в котором будут все логические и физические устройства
(как в WINHEX):
Logical:
A: Floppy disk
C: SYSTEM
D: SOFT
H: CD-ROM Drive
Physical:
Floppy disk 1
Hard Disk 1
Hard Disk 2
CD-ROM 1
и т.д. |
|
Doga |
Отправлено: 23.08.2005, 10:36 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Используйте WinAPI:
CoInitializeEx,
SHGetDesktopFolder,
SHGetSpecialFolderLocation,
IShellFolder->GetDisplayName,
IShellFolder->GetDisplayNameOf,
IShellFolder->ParseDisplayName,
IShellFolder->BindToObject,
IShellFolder->EnumObjects,
IShellFolder->GetAttributesOf,
ConcatPIDLs,
CoUninitialize
- вот необходимый набор средтв для Вашей задачи, по крайней мере для логических устройств. Описание в MSDN.
А для начала можете заглянуть сюда:
http://www.akzhan.midi.ru/devcorner/articl...-Namespace.html
|
|
timson |
Отправлено: 23.08.2005, 10:56 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 82
|
msdn!!!
CODE | /* 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>
#include <stdio.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);
} |
|
|
esh |
Отправлено: 23.08.2005, 13:27 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
То Doga: Спасибо, сейчас буду пробовать.
То timson: Так я и говорил, что "смотрю в сторону GetDiskFreeSpaceEx, DeviceIoControl", а msdn у меня и так открыта на странице "Calling DeviceIoControl"...
|
|
|