Возьмем WinHex. Он может открыть логический раздел как файл. И он корректно считает размер раздела. Запустил в отладочнике, поймал его на вызове DeviceIoControl с кодом IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS Посмотрел что это за структура: Код (Text): typedef struct _VOLUME_DISK_EXTENTS { DWORD NumberOfDiskExtents; DISK_EXTENT Extents[ANYSIZE_ARRAY]; }VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS; и Код (Text): typedef struct _DISK_EXTENT { DWORD DiskNumber; LARGE_INTEGER StartingOffset; LARGE_INTEGER ExtentLength; }DISK_EXTENT, *PDISK_EXTENT; Ну тут стало ясно почти все, кроме двух моментов: 1. После запроса получается буфер: Код (Text): 0012F1C0 01 00 00 00 00 00 00 00 ....... 0012F1C8 05 00 00 00 DA 02 00 00 ...Ъ.. 0012F1D0 00 00 00 00 00 00 00 00 ........ 0012F1D8 00 00 00 F2 00 00 00 00 ...т.... (размер возвращенных данных = 20h); Вопрос: почему он выровнял все по границе 8 байт? То NumberOfDiskExtents = 1, номер DiskNumber = 5 (This is the same number that is used to construct the name of the disk, for example, the X in PhysicalDriveX or HarddiskX.) Сходится, ну и по 8 байт четверенное слово... Почему он так выравнивает данные? 2. Получает что размер раздела равен Код (Text): 00 00 00 00 F2 00 00 00 , т.е. 4060086272, это почти правда. Но вот винхекс показывает 4060082176, т.е. Код (Text): F1FFF000 , что на 1000H меньше. Вот это и непонятно. Что за арифметика такая? Но винхекс показывает корректные данные, т.к. если загнать цикл Код (Text): While Readfile(.. returned, nil) and (returned>0) То он в сумме прочтет именно то количество байт, которое показывает винхекс. Кто-нибудь знает, что за арифметика такая? Причем 2 Гб флешка показывает всезде одинаковый размер, а какая-то (не уверен на 100%) с разницей 512.. Магия?
Pavia, дак это я и постил )) Вопрос так и не решен.. что-то запутался со скази-командами тогда... А тут нашел кое какой запрос, и думал что через него юзается..