Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Чтение секторов средствами WINAPI


Автор: antonkonikov 25.10.2011, 00:52
Доброго времени суток)
Возникла проблема( в которой нужно читать сектора, под дос получается а вот под windows нет. Возможно ли обратится к  FAT жесткому диску и прочитать инфу сектора сохранив ее в буффер. Писать буду под окна а не под консоль. Очень прошу откликнитесь и помогите. Заранее благодарен) ))

Автор: 500mhz 25.10.2011, 09:47
CreateFile(devName, GENERIC_READ,FILE_SHARE_WRITE, NULL,OPEN_EXISTING, 0, NULL);
ReadFile(hDev, lpSectBuff,512 * wSectors, &dwCB, NULL);

Автор: antonkonikov 25.10.2011, 10:26
можно ли потом сравнить элементы из буффера и вывести в окно?

Автор: 500mhz 25.10.2011, 10:44
потом уже все можно

Автор: Estranged 25.10.2011, 20:13
http://msdn.microsoft.com/en-us/library/ms898288.aspx + http://msdn.microsoft.com/en-us/library/windows/desktop/aa365169%28v=vs.85%29.aspx. Но может немного врать в количестве. Поэтому http://msdn.microsoft.com/en-US/library/aa365180.aspx, а для страховки еще http://msdn.microsoft.com/en-us/library/windows/desktop/aa365173%28v=vs.85%29.aspx

Примеры вот тут:
http://www.rsdn.ru/forum/winapi/1112101.flat.aspx

Автор: antonkonikov 25.10.2011, 21:20
Помогите вывести в окно:
Код

 case WM_COMMAND:
               switch (LOWORD(wParam)) 
               {
                        case IDC_EXIT:          /* команда меню "Exit" */
                            DestroyWindow(hwnd);
                        case IDC_FAT:
                                ReadSectors();
                            break;    
                                
               }
                break;

         case WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
               GetClientRect (hwnd, &rect) ;
               for(int i=0,i<512,i++)
               {
               TextOutA(hdc, 30,40,printf("ss %x",buf),512);
               }
               EndPaint (hwnd, &ps) ;
               return 0 ;

          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }


то что должно быть в буффере:
Код

void ReadSectors()
{

//HANDLE hDevice,DISK_GEOMETRY pdg,BOOL bResult,DWORD junk,BYTE *buf, DWORD dwBytesRead

    HANDLE hDevice;               // handle to the drive to be examined
        DISK_GEOMETRY pdg;           // геометрическая структура дискового устройства
        BOOL bResult;                 // флажок общих результатов
        DWORD junk;                   // сбрасываем результаты
 
      //  byte buf[512];                          //БУФФеР
        DWORD dwBytesRead;
 

 
        hDevice = CreateFile("\\\\.\\D:",  // открываемое устройство
                    0,                // нет доступа к устройству
                    FILE_SHARE_READ | // режим совместного использования
                    FILE_SHARE_WRITE, 
                    NULL,             // атрибуты безопасности по умолчанию
                    OPEN_EXISTING,    // расположение
                    0,                // атрибуты файла
                    NULL);            // не копировать атрибуты файла
 
        
        if (hDevice != INVALID_HANDLE_VALUE)
        {
 
 
                bResult = DeviceIoControl(hDevice,  // запрошенное устройство
                                IOCTL_DISK_GET_DRIVE_GEOMETRY,  // выполняемая операция
                                NULL, 0, // буфера ввода нет
                                &pdg, sizeof(pdg),     // буфер вывода
                                &junk,                 // # возвращено байтов
                                (LPOVERLAPPED) NULL);   // синхронизация ввода/вывода (I/O)
   
                ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); 

                CloseHandle(hDevice);
        }
        
}

Автор: xvr 26.10.2011, 13:28
Цитата(antonkonikov @  25.10.2011,  21:20 Найти цитируемый пост)
              TextOutA(hdc, 30,40,printf("ss %x",buf),512);

Это сильно, это пять  smile 
Может все же на консоль согласитесь? А то с окнами у вас явно что то не то  smile 

Автор: antonkonikov 27.10.2011, 14:52
Подскажите как вывести buf в окно или что не так делаю... очень прошу. И как узнать сосчиталось туда что нибудь?

Код

case WM_COMMAND:
               switch (LOWORD(wParam)) 
               {
                        case IDC_EXIT:          /* команда меню "Exit" */
                            DestroyWindow(hwnd);
                        case IDC_FAT:
                            {   
                                 hDevice = CreateFile("\\\\.\\D:",  // открываемое устройство
                                 0,                     // нет доступа к устройству
                                 FILE_SHARE_READ |      // режим совместного использования
                                 FILE_SHARE_WRITE, 
                                 NULL,                  // атрибуты безопасности по умолчанию
                                 OPEN_EXISTING,         // расположение
                                 0,                     // атрибуты файла
                                 NULL);                 // не копировать атрибуты файла
 

                                

                                if (hDevice != INVALID_HANDLE_VALUE)
                                     {
                                         bResult = DeviceIoControl(hDevice,              // запрошенное устройство
                                         IOCTL_DISK_GET_DRIVE_GEOMETRY,  // выполняемая операция
                                         NULL, 0,                        // буфера ввода нет
                                         &pdg, sizeof(pdg),              // буфер вывода
                                         &junk,                          // # возвращено байтов
                                         (LPOVERLAPPED) NULL);           // синхронизация ввода/вывода (I/O)
                                        // for(i=0; i<10; i++)
                                         //{
                                            ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); 
                                            CloseHandle(hDevice);
                                         //}
                                         //SetFilePointer (hDevice, (i*512), NULL, FILE_CURRENT);
                                    }
                            }
                            break;    
                                
               }
                break;

        case WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
               GetClientRect (hwnd, &rect) ;
               
                
                   TextOut(hdc,0,0,(LPCSTR)&buf,512);
               
               EndPaint (hwnd, &ps) ;
               return 0 ;

Автор: 500mhz 27.10.2011, 15:20
в файлик сохрани да блокнотиком открой

Автор: antonkonikov 27.10.2011, 15:54
Код

case IDC_FAT:
                            
                                 hDevice = CreateFile("\\\\.\\D:",  // открываемое устройство
                                 0,                     // нет доступа к устройству
                                 FILE_SHARE_READ |      // режим совместного использования
                                 FILE_SHARE_WRITE, 
                                 NULL,                  // атрибуты безопасности по умолчанию
                                 OPEN_EXISTING,         // расположение
                                 0,                     // атрибуты файла
                                 NULL);                 // не копировать атрибуты файла
 
                                if (hDevice != INVALID_HANDLE_VALUE)
                                     {
                                         bResult = DeviceIoControl(hDevice,              // запрошенное устройство
                                         IOCTL_DISK_GET_DRIVE_GEOMETRY,  // выполняемая операция
                                         NULL, 0,                        // буфера ввода нет
                                         &pdg, sizeof(pdg),              // буфер вывода
                                         &junk,                          // # возвращено байтов
                                         (LPOVERLAPPED) NULL);           // синхронизация ввода/вывода (I/O)
                                         ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); 
                                         CloseHandle(hDevice);
//записываем данные из буфера в файл myfile.txt
                                            hFile = CreateFile("myfile.txt",GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
                                            SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
                                            WriteFile(hFile,buf,512,0,NULL);
                                            CloseHandle(hFile);
            
                            }
                            break;    


файл не создается(((

Автор: xvr 27.10.2011, 16:47
Цитата(antonkonikov @  27.10.2011,  15:54 Найти цитируемый пост)
файл не создается((( 

OPEN_EXISTING в CreateFile("myfile.txt" замените на что нибудь более подходящее

Автор: antonkonikov 27.10.2011, 17:09
поменял на open_always
 теперь начало выходить из программы.
в файл записывает 512 символов "Н".
Почему не считывается сектор? может это из-за касперского, не может он блокировать доступ?

Автор: 500mhz 27.10.2011, 18:42
CreateFile("\\\\.\\D:"  что возвращает?

Автор: antonkonikov 27.10.2011, 19:08
Ну не знаю. должна открывать доступ к жесткому диску. да?

Автор: 500mhz 27.10.2011, 21:09
ну так проверь, если 0xffffffff то ошибочка, нада сделать GetlastError

пс
надеюсь все это с не с юсерскими правами запускаеться?

Автор: antonkonikov 27.10.2011, 21:41
всмысле не с юсерскими? 

вот что пишет :
"SPO_window.exe": Загружено "C:\Windows\System32\cryptbase.dll"
"SPO_window.exe": Загружено "C:\Windows\System32\clbcatq.dll"
"SPO_window.exe": Загружено "C:\Windows\System32\oleaut32.dll"
Первый этап обработки исключения в "0x757f75ea" в "SPO_window.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000".
Необработанное исключение в "0x757f75ea" в "SPO_window.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000".

и значения:
buf    0x01b418e8 "HHHHHHHHHHHHHHHHHHH"
hFile  0x00000134

Автор: Estranged 27.10.2011, 22:24
Цитата(antonkonikov @  27.10.2011,  21:41 Найти цитируемый пост)
всмысле не с юсерскими? 

Потому что ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); НЕ выполняется успешно. Нельзя читать, нет доступа.

Автор: antonkonikov 28.10.2011, 00:39
А как это устранить?)

компилю под семеркой, или лучше пользоватся ХП?

Автор: GremlinProg 28.10.2011, 07:15
ну, вообще-то 0xC0000005 - это Access Violation, т.е. в коде по адресу 0x757f75ea произошла запись данных по адресу 0x00000000

antonkonikov, лучше будет научиться пользоваться отладчиком,
да и программировать с таких задач не начинают

Добавлено через 4 минуты и 59 секунд
0x757f75ea - это практически 100% библиотека, т.е. в какую-то API был передан нераспределенный буфер, что и вызвало ошибку

Автор: 500mhz 28.10.2011, 09:44
сорри С компилера под рукой нема )

вот накидал, проверил, работает (ХР с админом)

Код

format PE
include "win32ax.inc"

section ".code" writeable readable executable

start:
    invoke CreateFile,fname,GENERIC_READ + GENERIC_WRITE,FILE_SHARE_READ + FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
    push eax
    invoke ReadFile,eax,buff,512,esp,0
    pop eax
    invoke CloseHandle,eax
    invoke CreateFile,oname,GENERIC_READ + GENERIC_WRITE,FILE_SHARE_READ + FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0
    push eax
    invoke WriteFile,eax,buff,512,esp,0
    pop eax
    invoke CloseHandle,eax
    invoke ExitProcess,0
fname:
    db "\\.\C:",0
oname:
    db "mbr.sec",0    
buff:
    times 512 db 0
        
.end start    

Автор: antonkonikov 28.10.2011, 12:39
500 mhz какой это asm?

конечно не начинают программировать с таких задач, но в си под дос не могу написать интерфейс с выпадающими окнами, поэтому я даже не знаю как лучше подойти к этой задаче(((

Автор: 500mhz 28.10.2011, 13:41
это FASM

пс
си под дос и виндос отличаються как пуля и г*вно извините

Автор: antonkonikov 28.10.2011, 15:45
та ну понятно что отличаются) с графикой под дос не дружу, а в visual c проще интерфейс создать и понятно как он реагирует. хотя со всеми остальными вещами как прочитать сектор, сложнее( 

Автор: antonkonikov 30.10.2011, 20:41
500mhz, что-то у меня не работает и асмовская программа. нули в файле(((

Автор: antonkonikov 30.10.2011, 22:50
Через дебагер смотрю и в строке 004013AB ошибка( 
Код

0040139E  push        0    
004013A0  push        0    
004013A2  push        edx  
004013A3  push        ebx  
004013A4  push        esi  
004013A5  call        dword ptr [__imp__WriteFile@20 (402028h)] 
                                            CloseHandle(hFile);
004013AB  push        esi  ; тут нарущение прав доступа на запись ((((
004013AC  mov         esi,dword ptr [__imp__CloseHandle@4 (402014h)] 
004013B2  call        esi  
                                            CloseHandle(hDevice);
004013B4  push        edi  
004013B5  call        esi  
            
                            }
                            break;    
004013B7  mov         esi,dword ptr [esp+14h] 
004013BB  mov         edi,dword ptr [ebp+0Ch] 
004013BE  jmp         WndProc+297h (4013C7h) 
               {
                        case IDC_EXIT:          /* команда меню "Exit" */
                            DestroyWindow(hwnd);
004013C0  push        esi  
004013C1  call        dword ptr [__imp__DestroyWindow@4 (40211Ch)] 
          }

     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
004013C7  mov         eax,dword ptr [ebp+14h] 
004013CA  mov         ecx,dword ptr [ebp+10h] 
004013CD  push        eax  
004013CE  push        ecx  
004013CF  push        edi  
004013D0  push        esi  
004013D1  call        dword ptr [__imp__DefWindowProcA@16 (4020FCh)] 
     }
004013D7  mov         ecx,dword ptr [esp+94h] 
004013DE  pop         edi  
004013DF  pop         esi  
004013E0  pop         ebx  
004013E1  xor         ecx,esp 
004013E3  call        __security_check_cookie (4013EEh) 
004013E8  mov         esp,ebp 
004013EA  pop         ebp  
004013EB  ret         10h  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)