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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямой доступ к диску через Win32, Ищу АПИ для прямого доступа к диску 
:(
    Опции темы
Owner
  Дата 31.5.2005, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.4.2005
Где: г. Москва

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



Потерял роаздел NTFS с видео и фото. Очень жалко, хотелось бы его восстановить, но как оказалось с ПО по восстановлением информации тяжело. Присутствуют в Инете либо полностью коммерческие продукты по диким ценам, либо ублюдочные - типа DskProbe из NT Resource Kit. Как я понял, легче написать браузер самому, но не знаю, как получить доступ непосредственно к физическому диску. Прямо скажу - MSDN пока не читал. Нашел статью братьев Фроловых по восстановлению поврежденных разделов дисков, но выйти на их сайт в Глас-нете не удалось. Они пишут, что у них есть простенький браузер, но как его получить не пишут, видимо не заинтересованы в распространении.
Буду очень благодарен за полезную информацию.
PM MAIL   Вверх
bel_nikita
Дата 31.5.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



Owner
Плохо ищем smile
Покуда будешь писать свой recovery - уйдет много времени smile
R-Studio попробуй. Лечилку тож найти не проблема smile



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Alastis
Дата 1.6.2005, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: нет
Всего: 10



написать свой recovery проще чем найти готовый?smile ну нет.
Вот обрати внимание на EasyRecovery Professional, мне уже очень много раз помогала.


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 1.6.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


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

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



для НТФС написать самому оооочень сложно
ибо даже девелоперы линюха коекак написали дравер да и то только чтение )))))


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Owner
Дата 4.6.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.4.2005
Где: г. Москва

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



Спасибо большое за науку. Скачал R-Studio, демо версию. Програмка классная, нашла все smile , но восстанавливать файлы больше 64К отказалась smile , хотя маленький файлик восстановила успешно. Нашел старую (2001 года) версию для NTFS, увы - сканер уже не тот. Стуктуру видит, но не нашел boot record, и восстанавливает полную чушь. Получить версию от производителей - как всегда, без их пластиковых денег невозможно.

EasyRecovery Professional еще не пробовал.

За драйвер Linux спасибо, надо взглянуть. Интересно, однако, люди же пишут под Win32 direct access, значит это кому-то можно! Причем пишут неплохо! smile
PM MAIL   Вверх
PGsoft
Дата 4.6.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 30.5.2005
Где: Петербург

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



Прямой доступ к секторам диска в такой высокозащищённой системе, как WindowsNT/2000/XP получить не просто... а очень просто (!): с помощью обычной функции WIN32 API CreateFile(). Вместо имени файла указывается "\\.\<логический диск>" или "\\.\PHYSICALDRIVE<номер>", где <логический диск> - "A:", "B:", "C:" и т.д., <номер> - номер физического устройства начиная с 0. Windows95 не поддерживает обращение к логическим дискам. Дополнительные требования - указывать FILE_SHARE_READ/FILE_SHARE_WRITE, и читать/писать с/в кратных секторам смещениям (я читаю/пишу по 1 сектору - 512байт).

Информация о параметрах устройства и некоторые операции (в том числе, и опасные) - DeviceIoControl, куда передаётся полученый хендл.

Читая с физического устройства можно получить доступ и к MBR, и даже изменить её без каких-либо проблем и предупреждений даже в WindowsXP Professional (!!!) - достаточно лишь обладать правами администратора. Что уж говорить о доступе к NTFS и прочим вещам?!

Вот пример программы, выполняющей очень опасную smile) операцию (прошу прощения за кодировку - VC++ - но и так всё понятно):
Код

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR CmdLine,int nShowCmd)
{
    char Sector[512];
    HANDLE hDrive=CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hDrive==INVALID_HANDLE_VALUE)
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,Sector,511,NULL);
        MessageBox(NULL,Sector,"Îøèáêà äîñòóïà ê äèñêó",MB_OK);
        return 1;
    }
    //Çàòåì èñïîëüçóåì DeviceIoControl(hDrive,...) äëÿ ðàçëè÷íûõ äåéñòâèé (ïàðàìåòðû è ò.ï.)
    // ëèáî
    DWORD Reads;
    ReadFile(hDrive,Sector,512,&Reads,NULL);
    if(Reads!=512)
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,Sector,511,NULL);
        MessageBox(NULL,Sector,"Îøèáêà äîñòóïà ê äèñêó",MB_OK);
        return 1;
    }
    WriteFile(hDrive,Sector,512,&Reads,NULL);
    if(Reads!=512)
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,Sector,511,NULL);
        MessageBox(NULL,Sector,"Îøèáêà äîñòóïà ê äèñêó",MB_OK);
        return 1;
    }
    MessageBox(NULL,"×òåíèå è çàïèñü çàãðóçî÷íîãî ñåêòîðà ïðîèçâåäåíû óñïåøíî :-)","Ïîçäðàâëåíèå",MB_OK);
    return 0;
}
[font=arial][/font]


И вообще, если есть желающие пообщаться на тему NTFS/FAT: я как раз сейчас занимаюсь NTFS, есть кое-какие интересные наработки (будет программа для восстановления файлов и пр.).


ПРИМЕЧАНИЕ. Автор не несёт никакой ответственности за последствия применения указаной здесь информации, включая запуск приведённой программы! :-)))))
PM WWW ICQ   Вверх
Owner
Дата 6.6.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.4.2005
Где: г. Москва

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



Да, все гениальное - просто. Еще и еще раз убеждаюсь в этом! smile

Желание пообщаться на тему NTFS есть, и большое. Правда времени творить - мало. Спасибо за очень ценную подсказку, PGsoft, не ожидал, что винды так просто отдают ресурсы. Надо поиграться, попробовать. Я сейчас занимаюсь восстановлением своих архивов. Как только закончу, попробую собрать для начала смотрелку разделов на предмет восстановления информации. Затем нужно применить рецепты братьев Фроловых. URL статьи:Восстановление поврежденных разделов NTFS. Видимо, там и появятся вопросы, так как я уже пытался их применить. Однако, ничего хорошего на диске не нашел, а этот паразит, R-Studio, находит!

Еще раз спасибо всем за советы - софт нашел посвежее. На горбунке продают хороший сборник по поводу восстановления: Работа с Жестким Диском называется, в синей обложке. smile

Это сообщение отредактировал(а) Owner - 6.6.2005, 18:08
PM MAIL   Вверх
SHENDEL
Дата 10.6.2005, 14:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как руки чешуться испробовать этот архи-полезный код на ближнем своем smile
  Вверх
Owner
Дата 11.6.2005, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.4.2005
Где: г. Москва

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



SHENDEL, там есть маленькая оговорочка:
Цитата(PGsoft @ 4.6.2005, 22:19)
достаточно лишь обладать правами администратора

Так что, если ближний не дурак, то испробовать этот код на нем не получится! smile

Кстати, ни один пакет, кроме R-Studio, так профессионально структуру поврежденных разелов не воспроизводит. EasyProf восстанавливает файлы без оглядки на содержимое, поэтому вылезает очень много мусора. Акронис и Paragon вообще ничего видят.

Почитал MSDN. Оказывается, там много полезной иформации! По структуре таблиц разделов, MBR, FAT, NTFS. В разделе NT Workstation Resources.smile
PM MAIL   Вверх
chaos
Дата 14.6.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



вот тоже пример, кагда-то было интересно)

Код

#include <windows.h>
#include <stdio.h>

DWORD dwSectPerClust = 0, dwBytesPerSect = 0, dwNumbFreeClust = 0, dwTotalNumbOfClust = 0;


typedef struct DIOCRegs { 
    DWORD   reg_EBX; 
    DWORD   reg_EDX; 
    DWORD   reg_ECX; 
    DWORD   reg_EAX; 
    DWORD   reg_EDI; 
    DWORD   reg_ESI; 
    DWORD   reg_Flags; 
} DIOC_REGISTERS;

void PrintError()
{
    char str[256];
    LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
    );
    
    CharToOem((LPCSTR)lpMsgBuf, str);
    printf ("%s\n", str);

}

//////////////////////////
//
void PrintInfoDrive(LPCSTR lpDriveName = "a:\\")
{
    GetDiskFreeSpace(
        lpDriveName,
        &dwSectPerClust, 
        &dwBytesPerSect, 
        &dwNumbFreeClust, 
        &dwTotalNumbOfClust
    );

    printf("Drive name: %s\n", lpDriveName);
    printf("SectorsPerClustre: %d\n",    dwSectPerClust);
    printf("BytesPerSector: %d\n",        dwBytesPerSect);
    printf("NumberFreeOfCluster: %d\n",    dwNumbFreeClust);
    printf("TotalNumberOfCluster: %d\n",dwTotalNumbOfClust);
    printf("------------------------------------\n");

    DWORD dwTotalSize = dwBytesPerSect * dwNumbFreeClust;
    printf("Free space: %d kb\n", (dwTotalSize/1024));
}

////////////////////////////////////////////////
//
int ReadSector(UINT sector, LPCSTR lpDriveName = "\\\\.\\A:")
{
OSVERSIONINFO verInfo = {0};
    verInfo.dwOSVersionInfoSize = sizeof (verInfo);
    GetVersionEx(&verInfo);


    HANDLE hDrive;
    char *buf;
    DWORD dw, n;

    switch (verInfo.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_NT:
        hDrive = CreateFile(
            lpDriveName, 
            GENERIC_READ, 
            FILE_SHARE_READ, 
            NULL, 
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, 
            NULL
        );
        
        if (hDrive == INVALID_HANDLE_VALUE)
        {
            PrintError();
            return 1;
        }
        
        buf = new char[dwBytesPerSect];
        SetFilePointer(hDrive, (sector-1) * dwBytesPerSect, NULL, FILE_BEGIN); //c 1
        ReadFile(hDrive, (LPVOID)buf, dwBytesPerSect, &dw, NULL); 
        CloseHandle(hDrive); 

        for (n = 0; n < dw; n++)
            printf("%c", buf[n]);

        delete[] buf;

        break;

    case VER_PLATFORM_WIN32_WINDOWS:
        break;

    default:
        printf ("Error!!!\n");
        return 1;
    }
    
    
    
/*    HANDLE hDrive = CreateFile(
        lpDriveName, 
        GENERIC_READ, 
        FILE_SHARE_READ, 
        NULL, 
        OPEN_EXISTING,
        FILE_FLAG_DELETE_ON_CLOSE, 
        NULL
    );

    if (hDrive != INVALID_HANDLE_VALUE)
    {


        char *buf = new char[dwBytesPerSect];
        if (buf == NULL) return 1;

        DIOC_REGISTERS reg;
        reg.reg_EAX = 0;//A
        reg.reg_ECX = 1;
        reg.reg_EDX = 0;
        reg.reg_EBX = (DWORD)buf;

        #define VWIN32_DIOC_DOS_INT25 2
    
        DWORD dw;

        BOOL bResult = DeviceIoControl(
            hDrive, 
            VWIN32_DIOC_DOS_INT25, 
            &reg,
            sizeof(reg),
            &reg,
            sizeof(reg),
            &dw,
            0
        );

        if (bResult==0)
            PrintError();
        else
        {
            printf("%s", buf);
        }
    
        delete[] buf;
        CloseHandle(hDrive);
    }
    else
        PrintError();
*/
    return 0;
}

///////////////////////////////
//
int main()
{
    PrintInfoDrive();
    printf("------------------------------------\n");
    ReadSector(20);

    return 0;
}


PM WWW   Вверх
Owner
Дата 3.7.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.4.2005
Где: г. Москва

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



PGsoft, я готов пообщаться по поводу NTFS и FAT, но прежде хотел бы разобраться с Boot Record и таблицами разделов. В MSDN описан формат записей таблицы, однако описание довольно старое, по крайней мере нет расшифровки кодов SystemID выше 0х0F, а такие есть, и много их.
Второй вопрос касается современных дисков, где количество цилиндров давно превысило число 1023.
В выдаче програмки Partinfo.exe из пакета PartMagic присутствует термин Large Drive Place holders. Что это и где его искать? Перевод мне понятен smile
Не понятно, где эти холдеры описаны и где находятся. Может есть ссылки на более свеженькую информацию?

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Кто может подсказать, как можно вести ОЧЕНЬ низкоуровневую запись на Flesh Stick.
Что - то типа того, что написал PGsoft олько для Flash.
Кто сможет сказать что внятное:
ICQ: 237242967
mail: [email protected]
PM   Вверх
oleg1973
Дата 13.7.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


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

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



что значит очень низкоуровневое?
по идее флешка рассматривается как ремовабиле девайс
тоесть типа флопи ) соответственно у нее есть файловая система
вывод работать с ней можно также как и с простым диском


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Guest
Дата 17.7.2005, 21:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Owner, естественно, надо первым делом MSDN смотреть :-) Вернее, нет - первым делом help по SDK, потом MSDN, и уж "если ничего не помогает" - DDK.

Насчёт ёмкости жёстких дисков - 1024 цилиндрами нас ограничивает BIOS, стандарт ATA позволяет обратиться к 65536 цилиндрам. Так что делай выводы smile - видимо, ты пытаешься работать через BIOS; и вообще, почему не используешь LBA? От себя могу добавить сведения о максимальной ёмкости дисков в соответствии со спецификациями интерфейсов (сектор всегда 512 байт):
ATA CHS - 16 бит цилиндры, 4 бита головки, 8 бит сектор - всего 28 бит, до 127.5 Гб;
ATA LBA - 28 бит адрес сектора - до 128 Гб;
SCSI - 32 бит адрес сектора - до 2 Тб.

Опять же, делай выводы :-)) Увеличить количество бит адресации для ATA - большая проблема; увеличение уже происходило нераз, и больше ресурсов (штырьков в разъёме smile ) нет. Раньше увеличивали за счёт управляющих и резервных бит: они закончились.

В любом случае, сейчас вводится стандарт SATA (причём на многих чипсетах - "коряво", на мой взгляд: ведь по регистрам он вроде как соответствует ATA, а многие ли ОС "видят" при установке жёсткий диск SATA?! Есть у кого-нибудь сведения по этому поводу?)

И ещё один момент. Где же встречаются коды разделов более 0Fh? Ответ прост: там, где установлена другая ОС, не Microsoft. Опять же - делай выводы: в MSDN никогда и не будет кодов более 0Fh :-))))

Кстати, народ, есть идейка - кто-нибудь занимался написанием драйвера файловой системы? Пишите, будем сотрудничать :-)
  Вверх
PGsoft
Дата 17.7.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 30.5.2005
Где: Петербург

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



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

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


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

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


 




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


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

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