Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FSCTL_GET_VOLUME_BITMAP 
V
    Опции темы
vinter
Дата 29.11.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



есть код
Код

void GetVolume(TCHAR * pFileName)
{
    HANDLE hFile = 0;
    STARTING_LCN_INPUT_BUFFER  InBuf;
    VOLUME_BITMAP_BUFFER  OutBuf;
    _int64 nOutSize = 0;
    LPDWORD pBytes = new DWORD[100];
    hFile = CreateFile(_T(pFileName),GENERIC_READ,
        FILE_SHARE_READ , NULL, OPEN_EXISTING, 0, 0);
    
    nOutSize = sizeof(VOLUME_BITMAP_BUFFER);
    int i;
    InBuf.StartingLcn.QuadPart = 0;
    if(hFile != INVALID_HANDLE_VALUE)
    {
         i = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf), 
            &OutBuf, nOutSize, pBytes, NULL);
         i = GetLastError();
    }
}

возвращает след. ошибку
Цитата

The parameter is incorrect. ERROR_INVALID_PARAMETER 

имя файла нормальное, и он существует..
поиогите пожалуйста разобраться в чем проблема..


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 30.11.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(vinter @  29.11.2006,  22:12 Найти цитируемый пост)
имя файла нормальное, и он существует..

FSCTL_GET_VOLUME_BITMAP применяется на volume handle (CreateFile("\\\\.\\PhysicalDrive0",... или "\\\\.\\C:")

почитай повнимательней Defragmenting Files
PM MAIL   Вверх
vinter
Дата 30.11.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



dumb спасибо, но вот че то не получается..
при
Цитата

"\\\\.\\C:"

хендл не правильный
а при
Цитата

"\\\\.\\PhysicalDrive0"

та же самая ошибка..smile
захожу под администратором...
кстати зачем \\.\  ??



--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 1.12.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



теперь другая ошибка... smile 
 ERROR_MORE_DATA
как с ней бороться??
и из-за чего она возникает smile


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 2.12.2006, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



vinter, тебя мсдн чем-то не устраивает? - почему бы не почитать немного?..
Цитата(MSDN)

A return value from GetLastError of ERROR_MORE_DATA indicates to the caller that the buffer was not large enough to accommodate a complete bitmap from the requested starting LCN to the last cluster on the volume. In this event, you can make subsequent FSCTL_GET_VOLUME_BITMAP calls to retrieve the remaining bitmap.

PM MAIL   Вверх
vinter
Дата 2.12.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Цитата

тебя мсдн чем-то не устраивает? - почему бы не почитать немного?..

 с английским не очень хорошо..
переделал код(насколько понял твой последний пост) ..
Код

while(true)
    {
        InBuf.StartingLcn.QuadPart = nLCN;
        if(hFile != INVALID_HANDLE_VALUE)
        {
            i = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf), 
                &OutBuf, nOutSize, pBytes, NULL);
            i = GetLastError();
        }
        if(i != ERROR_MORE_DATA || (nLCN > OutBuf.StartingLcn.QuadPart
            + OutBuf.BitmapSize.QuadPart ))
            break;
        nLCN = OutBuf.StartingLcn.QuadPart;
        nLCN += 8;
    }

он доходит до последнего кластера, а ошибка так и не уходит smile 
че делать то?? smile  smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 4.12.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



помогите пожалуйста, найти ошибкуsmile
или может способ другой, как это сделать, а то непонятно, вроде все правильно делаюsmile


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 4.12.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



заготовка:

Код

    HANDLE hFile = 0;
    DWORD pBytes;
    int ret;
    _int64 nOutSize = 0;
    _int64 NumberOfClusters;

    STARTING_LCN_INPUT_BUFFER  InBuf;
    VOLUME_BITMAP_BUFFER  OutBuf;
    PVOLUME_BITMAP_BUFFER  pOutBuf = &OutBuf;

    hFile = CreateFile("\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
    if ( hFile == INVALID_HANDLE_VALUE )
    {
      // не открылся
      return;
    }
    nOutSize = sizeof(VOLUME_BITMAP_BUFFER);
    InBuf.StartingLcn.QuadPart = 0;
    // отдаем маленький буфер (1 байт под данные карты)
    ret = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf),
                        pOutBuf, nOutSize, &pBytes, NULL);
    if ( !ret && GetLastError() == ERROR_MORE_DATA )
    {
      // получаем кол-во кластеров на томе (начиная с StartingLcn)
      NumberOfClusters = pOutBuf->BitmapSize.QuadPart - pOutBuf->StartingLcn.QuadPart;
      // вычисляем, сколько нужно байт под буфер (1 кластер = 1 бит)
      nOutSize = NumberOfClusters/sizeof(char) + sizeof(VOLUME_BITMAP_BUFFER);
      // выделяем-с...
      pOutBuf = (PVOLUME_BITMAP_BUFFER)new char[nOutSize];
      if (!pOutBuf) 
      {
        // не выделилось... диск большой =)
        return;
      }
      pOutBuf->StartingLcn.QuadPart = 0; // буфер новый - зададим начало
      ret = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf),
                          pOutBuf, nOutSize, &pBytes, NULL);
      if ( ret )
      {
        // работаем с картой pOutBuf->Buffer
        // ...
      }
      else
      {
        // хм. ошибка...
        ret = GetLastError();
      }
    }
    CloseHandle( hFile );

PM MAIL   Вверх
vinter
Дата 5.12.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



dumb, огромное тебе спасибо


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 6.12.2006, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



обращайтесь. smile

btw, пару ссылок на эту тему:
Inside Windows NT Disk Defragmenting
Defrag.c
defrag.zip
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.