0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 45
1

Главная загрузочная запись

28.06.2017, 09:11. Показов 2093. Ответов 2
Метки нет (Все метки)

Нужно написать программу, которая вызывает окно, в котором должна выводиться информация о главной загрузочной записи. Вот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <windows.h> // заголовочный файл, содержащий WINAPI
#include <stdio.h>
#include <CommCtrl.h> 
#include <conio.h>
#include <tchar.h> 
#include <iostream>
#include <string>
#include <sstream>
#pragma comment(lib,"ComCtl32.Lib")
using namespace std;
#define ID_STATUS 200
 
HINSTANCE hInstA;
HWND hStatus;
UINT wID = 300;
 
#pragma pack(push, 1)
// Cтруктура элемента раздела:
typedef struct PART{
    BYTE  ActFlag; // признак активного раздела
    BYTE  Begin_Hd; // # головки
    WORD  Begin_SecTrk; // # сектора и дорожки
    BYTE  SysCode; // код системы
    BYTE  End_Hd; // # головки
    WORD  End_SecTrk; // # сектора и дорожки
    DWORD RelSec; // # сектора початку
    DWORD Size; // количество секторов
};
 
typedef struct MBR{ // стpуктуpа главной загрузочной записи
    BYTE LoadCode[0x1BE]; // пpогpамма загрузки
    struct PART rt[4]; // 4 эл-та pазделов
    WORD EndFlag; // подпись MBR
};
#pragma pack(pop)
// Прототип функции обработки сообщений:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Управляющая функция:
int WINAPI WinMain(HINSTANCE hInstance, // дескриптор экземпляра приложения
                   HINSTANCE hPrevInstance, 
                   LPSTR IpCmdLine, 
                   int nCmdShow) // режим отображения окна
{
    HWND hMainWnd; // создание дескриптора будущего окна
    char szClassName[] = "MyClass"; // строка с именем класса
    MSG msg; // создание экземпляра структуры MSG для обработки сообщений
    WNDCLASSEX wc; // создание экземпляра для обращения к членам класса WNDCLASSEX
    // Заполняем структуру класса окна 
    wc.cbSize = sizeof(wc); // размер структуры (в байтах)
    wc.style = CS_HREDRAW|CS_VREDRAW; // стиль класса окна
    wc.lpfnWndProc = WndProc; // указатель на функцию WndProc
    wc.cbClsExtra = 0; // число освобождаемых байтов при создании экземпляра приложения
    wc.cbWndExtra = 0; // число освобождаемых байтов в конце структуры
    wc.hInstance = hInstance; // указатель на строку, содержащую имя меню, применяемого для класса
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // декриптор пиктограммы
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
    wc.lpszMenuName = NULL; // указатель на имя меню
    wc.lpszClassName = TEXT("Myclass"); // указатель на имя класса 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // дескриптор маленькой пиктограммы (в трэе)
    // Регистрируем класс окна 
    if (!RegisterClassEx(&wc)) { 
        MessageBox(NULL, TEXT("Cannot register class"), TEXT("Error"), 0); 
        return 0; 
    }
    // Создаем основное окно приложения 
    hMainWnd = CreateWindow(wc.lpszClassName, 
                            TEXT("MBR"), 
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT, 
                            0, 
                            1200, 
                            700, 
                            (HWND)NULL, 
                            (HMENU)NULL, 
                            (HINSTANCE)hInstance, 
                            NULL ); 
    if (!hMainWnd) { 
        MessageBox(NULL, TEXT("Cannot create main window"), TEXT("Error"), 0); 
        return 0; 
    }   
 
    InitCommonControls();
    hStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP | CCS_BOTTOM, L"Символов в каждом разделепосиститсаяпяпыкнвкнрпр:", hMainWnd, ID_STATUS);
    int pParts[2];
    pParts[0] = 165;
    pParts[1] = 150+150;
    SendMessage(hStatus, SB_SETPARTS, 2, (LPARAM)&pParts);
 
    // Показываем наше окно 
    ShowWindow(hMainWnd, nCmdShow); 
    // Выполняем цикл обработки сообщений до закрытия приложения 
    while (GetMessage(&msg, NULL, 0, 0)) { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
    return msg.wParam; 
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    HDC hDC; 
    PAINTSTRUCT ps;
    int result;
    char MbrData[1024]={0};
    struct MBR mbr;
    wchar_t symbol[4];
    HANDLE hDrive = CreateFile(TEXT("\\\\.\\H:"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
                               0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    switch (uMsg){      
        case WM_PAINT:{
            if (INVALID_HANDLE_VALUE == hDrive)
                fprintf(stderr, "CreateFile failed 0x%08X\n", GetLastError());
            else{               
                DWORD NumberOfBytesRead = 0;
                RtlZeroMemory(&mbr, sizeof(mbr));
                if (0 == ReadFile(hDrive, &mbr, sizeof(mbr), &NumberOfBytesRead, 0))
                    fprintf(stderr, "ReadFile failed 0x%08X\n", GetLastError());
                else if (sizeof(mbr) != NumberOfBytesRead)
                    fprintf(stderr, "sizeof(mbr) = 0x%08X, ReadFile read 0x%08X\n",sizeof(mbr), NumberOfBytesRead);
                else{                   
                    hDC = BeginPaint(hWnd, &ps);
                    int j;
                    for (j = 0; j < 4; j++) {
                      result=sprintf(MbrData, (char *)"Partition %d\n"
                            " ActFlag = 0x%02X\n"
                            " Begin_Hd = 0x%02X\n"
                            " Begin_SecTrk = 0x%04X\n"
                            " SysCode = 0x%02X\n"
                            " End_Hd = 0x%02X\n"
                            " End_SecTrk = 0x%04X\n"
                            " RelSec = 0x%08X\n"
                            " Size = 0x%08X\n\n",
                            j,
                            mbr.rt[j].ActFlag,
                            mbr.rt[j].Begin_Hd,
                            mbr.rt[j].Begin_SecTrk,
                            mbr.rt[j].SysCode,
                            mbr.rt[j].End_Hd,
                            mbr.rt[j].End_SecTrk,
                            mbr.rt[j].RelSec,
                            mbr.rt[j].Size);
                          TextOutA(hDC, 15,120+j*15, MbrData, result);  
                          _itow(result, symbol, 10);
                        //  SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)symbol);
                          TextOutA((HDC)hStatus, 15,120+j*15, MbrData, (LPARAM)symbol); 
                          
                    }
                    EndPaint(hWnd, &ps);                    
                }
                CloseHandle(hDrive); 
            }
            return 0;
        }
                      break;
 
    case WM_CLOSE: 
        DestroyWindow(hWnd); 
        break; 
    case WM_DESTROY: 
        PostQuitMessage(0); 
        break; 
 
    default: 
        return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    }
    return 0;
}
Выводится только окно. Как вывести ещё и главную загрузочную запись? Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2017, 09:11
Ответы с готовыми решениями:

Сбилась загрузочная запись
Похоже, что сбилась загрузочная запись - при включении слышен звук запускающегося винчестера, потом...

Нерабочая загрузочная запись
Доброго дня, стояла и нечем не мешала Windows 7 32 бит, решил найти от лучшего лучшее и на второй...

Загрузочная SD
Есть ноутбук HP Pavilion g6-2209sr. На нем полетел жесткий диск, и в ближайшее время нет...

Загрузочная флешка
Если я запущу систему с загрузочной флешки что будет происходить с жёстким диском? Если что я хочу...

2
44 / 44 / 13
Регистрация: 06.09.2010
Сообщений: 99
28.06.2017, 12:56 2
Для доступа к MBR это должно выглядеть как-то так:
C++
1
2
3
4
    char buff[512];
    DWORD rb;
    HANDLE hf=CreateFile(TEXT("\\\\.\\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_READ , 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    ReadFile(hf,buff,512,&rb,0);
Указывая логический диск доступ к MBR не получишь.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
28.06.2017, 20:56 3
Цитата Сообщение от tiktonic Посмотреть сообщение
C++
1
2
3
4
HANDLE hDrive = CreateFile(TEXT("\\\\.\\H:"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 switch (uMsg){ 
 case WM_PAINT:{
mms_ua, hDrive не нужен при каждом вызове процедуры. Используем GetLastError, чтобы узнать код ошибки. 5 это "Access is denied". Можно попробовать запустить с правами администратора.

Кроме того, BeginPaint, EndPaint вынесем за пределы if-else.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    switch (uMsg){      
        case WM_PAINT:{
            hDC = BeginPaint(hWnd, &ps);
 
            HANDLE hDrive = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
                0, OPEN_EXISTING, 0, 0);
            if (INVALID_HANDLE_VALUE == hDrive){
                //
                // определим код ошибки 
                //
                DWORD err = ::GetLastError();
                {
                    char str[1000] = {};
                    sprintf( str, "\n CreateFile(),  error code  %ld \n", (long)err  );
                    MessageBoxA( hWnd, str, "Information", MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST );  
                }
 
            }
            ////if (INVALID_HANDLE_VALUE == hDrive)
            ////    fprintf(stderr, "CreateFile failed 0x%08X\n", GetLastError());
            else{               
                // ... 
                // ... 
                // ... 
                //////EndPaint(hWnd, &ps);                    
 
                CloseHandle(hDrive); 
            }
            EndPaint( hWnd, &ps );
        }
        break;
Миниатюры
Главная загрузочная запись  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2017, 20:56
Помогаю со студенческими работами здесь

Загрузочная флешка.
Здравствуйте, в общем такая у меня проблема возникла. Имеется ноутбук с ОС - WIN 7, привод на нём...

Загрузочная флешка
У меня есть 2 образа вин7, х86 и х64, как можно сделать такую флешку чтобы при установки был выбор...

загрузочная флешка
хочу сделать загрузочную флешку с виндосами и программами. подскажите что лучше и как сделать

Загрузочная флешка
Добрый день! Кто нибудь делал загрузочную флешку и устанавливал ОС windows xp? Пробовал сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru