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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
| ;=============================================================================
.386 ;Использование команд процессора 80x386
.MODEL flat, stdcall ;Плоская модель памяти, стандартный вызов процедур
OPTION casemap: none ;Различать все имена
include windows.inc ;Стандартный модуль для работы в ОС Windows
include user32.inc ;Модуль для поддержки пользовательского интерфейса
include gdi32.inc ;Модуль для поддержки графического интерфейса
include kernel32.inc ;Модуль для работы с ядром ОС
include comctl32.inc
includelib user32.lib ;Библиотека для поддержки пользовательского интерфейса
includelib gdi32.lib ;Библиотека для поддержки графического интерфейса
includelib kernel32.lib ;Библиотека для работы с ядром ОС
includelib comctl32.lib
;-----------------------------------------------------------------------------
;Блок параметров BIOS, расположенный в загрузочном секторе (512 байт) для DOS4
BLOCK_PARAMETER_BIOS struc
JmpTo BYTE 3 dup(?) ;Переход на код загрузки (0x0000)
ID CHAR 8 dup(?) ;Идентификатор системы (OEM имя) (0x0003)
wBytesPerSector WORD ? ;Число байтов в секторе (0x000B)
bySectorsPerCluster BYTE ? ;Число секторов в кластере (0x000D)
wSectorsPerReserv WORD ? ;Число секторов в зарезервированной области (0x000E)
byNumOfCopyesFAT BYTE ? ;Число копий таблицы FAT (0x0010)
wRecordsOnRootDir WORD ? ;Число записей в корневом каталоге (0x0011)
wTotalNumberOfSectors WORD ? ;Общее число секторов (0x0013)
bySpecOfDOSDriveSystem BYTE ? ;Описатель накопителя системы DOS (0x0015)
wNumOfSectorsFAT WORD ? ;Число секторов в таблице FAT (0x0016)
wNumOfSectorsOnTrack WORD ? ;Число секторов на дорожке (0x0018)
wNumOfSide WORD ? ;Число головок (сторон) (0x001A)
dwNumOfHideSectors DWORD ? ;Число скрытых секторов (0x001C)
dwTotalNumOfSectors DWORD ? ;Общее число секторов #2 (0x0020)
byNumOfPhysicalDisk BYTE ? ;Номер физического дисковода (0x0024)
byReserved BYTE ? ;Зарезервировано (0x0025)
byLabelByte BYTE ? ;Байт сигнатуры (29H) (0x0026)
dwSerialNumOfVolume DWORD ? ;Серийный номер тома (0x0027)
cLabelVolume CHAR 11 dup(?) ;Метка тома (0x002B)
cFileSystem CHAR 8 dup(?) ;Файловая система (0x0036)
Reserved BYTE 450 dup(?) ;Зарезервировано (0x003E)
BLOCK_PARAMETER_BIOS ends
;-----------------------------------------------------------------------------
;Структура корневого каталога
FILE_RECORD struc
cFileName BYTE 8 dup(?) ;Имя файла (0x0000)
cExtension BYTE 3 dup(?) ;Расширение файла (0x0008)
byAttribute BYTE ? ;Атрибут файла (0x000B)
Reserved BYTE 10 dup(?) ;Зарезервировано (0x000C)
wTime WORD ? ;Время модификации файла (0x0016)
wData WORD ? ;Дата модификации файла (0x0018)
wInitNumOfCluster WORD ? ;Начальный номер кластера (0x001A)
dwFileSize DWORD ? ;Размер файла в байтах (0x001C)
FILE_RECORD ends
.CONST
align 4
;Секция констант программы
;-----------------------------------------------------------------------------
IDI_MAINICON EQU 1 ;Идентификатор пиктограммы окна
IDT_TIMER EQU 10 ;Идентификатор таймера слежения за анализом
dwWidth EQU 640 ;Ширина окна в пикселах
dwHeight EQU 480 ;Высота окна в пикселах
szClassName CHAR "FSFWINDOW", 0 ;Класс окна
szCaption CHAR "курсовик", 0 ;Заголовок окна
szErrorAnalysis CHAR "Анализ гибкого диска прерван!", 0 ;Сообщение ошибки
szMes1 CHAR "Пожалуйста вставьте диск в устройство A:", 9, 0
.DATA?
align 4
;Секция неинициализированных данных программы
;-----------------------------------------------------------------------------
hInstance HINSTANCE ? ;Дескриптор экземпляра приложения
wc WNDCLASSEX <> ;Структура класса окна
msg MSG <> ;Структура сообщения окна
OL OVERLAPPED <> ;Структура для асинхронного чтения файлов
hHandle HWND ? ;Дескриптор окна
hEdit1Handle HWND ? ;Дескриптор редактора текста для загруз. сектора
hEdit2Handle HWND ? ;Дескриптор редактора текста для FAT
hEdit3Handle HWND ? ;Дескриптор редактора текста для кор. каталога
hEdit4Handle HWND ? ;Дескриптор редактора текста для области файлов
hResultTreeHandle HWND ? ;Дескриптор древосписка для отображения рез-ов
hFloppy HANDLE ? ;Дескриптор гибкого диска A:
uMemSize UINT ? ;Общий размер гибкого диска в байтах
uReadBytes UINT ? ;Количество прочитанных байт из текущего ус-ва
uTime UINT ? ;Пройденное время операции
uOperation UINT ? ;Идентификатор операции
;Параметры для загрузочного сектора
hMemory1 HGLOBAL ? ;Дескриптор глобальной памяти
lpMemory1 LPVOID ? ;Адрес глабольной памяти
uReadByte1 UINT ? ;Размер глобальной памяти
;Параметры для FAT
hMemory2 HGLOBAL ? ;Дескриптор глобальной памяти
lpMemory2 LPVOID ? ;Адрес глабольной памяти
uReadByte2 UINT ? ;Размер глобальной памяти
;Параметры для корневого каталога
hMemory3 HGLOBAL ? ;Дескриптор глобальной памяти
lpMemory3 LPVOID ? ;Адрес глабольной памяти
uReadByte3 UINT ? ;Размер глобальной памяти
;Параметры для области файлов
hMemory4 HGLOBAL ? ;Дескриптор глобальной памяти
lpMemory4 LPVOID ? ;Адрес глабольной памяти
uReadByte4 UINT ? ;Размер глобальной памяти
g_nFolder UINT ? ;Индекс картинки подкаталога в ImageList
g_nFile UINT ? ;Индекс картинки файла в ImageList
g_nCluster UINT ? ;Индекс картинки кластера в ImageList
g_nInfo UINT ? ;Индекс картинки результатов в ImageList
g_nClusterS UINT ? ;Индекс картинки склеенного кластера в ImageList
g_nFloppy UINT ? ;Индекс картинки гибкого диска в ImageList
szBufer CHAR 1024 dup(?) ;Буфер-строка
.CODE
;Секция кода программы
;-----------------------------------------------------------------------------
; Функция:
; HexToHexTable
;
; Описание:
; Преобразование строки в последовательность шестнадцатеричных символов
;
; Обращение:
; invoke HexToHexTable, lpResult, lpSource, uSizeOfSource, uSepar, uSepLen
;
; Параметры:
; lpResult - адрес конечной строки
; lpSource - адрес исходной строки
; uSizeOfSource - размер исходной строки в байтах
; uSepar - число байт, между которыми необходимо ставить разделитель.
; Этот параметр может быть равен нулю, тогда разделитель не
; ставиться.
; uSepLen - число байт, находящиеся в одной строке.
; Этот параметр может быть равен нулю, тогда все символы будут
; находиться в одной строке.
;
; Результат:
; Эта функция не имеет результата.
;
; Подключаемые модули:
; Windows.inc
;-----------------------------------------------------------------------------
align 4
HexToHexTable proc lpResult: LPSTR, lpSource: LPSTR, uSizeOfSource: UINT,
uSepar: UINT, uSepLen: UINT
LOCAL uSepars: UINT
pushad
mov ecx, uSizeOfSource
mov edi, lpSource
mov esi, lpResult
xor ebx, ebx
mov uSepars, 0
_LOOP:
push ecx
mov ecx, 2
mov dl, byte ptr [edi]
_LOOPL:
mov al, dl
shr al, 4
cmp al, 10
jb _BELOW
add al, 7
_BELOW:
add al, 48
mov [esi], al
add esi, 1
shl dl, 4
loop _LOOPL
add uSepars, 1
add ebx, 1
.IF ebx == uSepLen
mov byte ptr [esi], 13
mov byte ptr [esi + 1], 10
add esi, 2
xor ebx, ebx
mov uSepars, 0
.ELSE
mov eax, uSepars
.IF eax == uSepar
mov byte ptr [esi], 9
add esi, 1
mov uSepars, 0
.ENDIF
.ENDIF
add edi, 1
pop ecx
loop _LOOP
mov byte ptr [esi], 0
popad
ret
HexToHexTable endp
;-----------------------------------------------------------------------------
include Stucks.inc ;Модуль поиска склеенных файлов
include Timer4.inc ;Модуль для чтения области файлов (операция №4)
include Timer3.inc ;Модуль для чтения корневого каталога (операция №3)
include Timer2.inc ;Модуль для чтения FAT (операция №2)
include Timer1.inc ;Модуль для чтения загрузочного сектора (операция №1)
include Laba9.inc ;Модуль главной функции окна
;-----------------------------------------------------------------------------
align 4
Start:
;Инициализация приложения
invoke GetModuleHandle, NULL
mov hInstance, eax
;Регистрация класса окна
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WindowProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE + 1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon, hInstance, IDI_MAINICON
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
;Создание используемых шрифтов
invoke CreateFontIndirect, addr Font1
mov hFont1, eax
invoke CreateFontIndirect, addr Font2
mov hFont2, eax
;Создание окна
invoke GetSystemMetrics, SM_CXSCREEN
sub eax, dwWidth
shr eax, 1
mov ebx, eax
invoke GetSystemMetrics, SM_CYSCREEN
sub eax, dwHeight
shr eax, 1
invoke CreateWindowEx, NULL, addr szClassName, NULL,
WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or \
WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_THICKFRAME,
ebx, eax, dwWidth, dwHeight, NULL, NULL,
hInstance, NULL
mov hHandle, eax
invoke SendMessage, hHandle, WM_SETFONT, hFont1, 1
;Вывод окна на экран
invoke ShowWindow, hHandle, SW_MAXIMIZE
invoke UpdateWindow, hHandle
;Цикл сообщений
.WHILE TRUE
invoke GetMessage, addr msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.ENDW
;Выход из приложения
invoke ExitProcess, msg.wParam
;-----------------------------------------------------------------------------
END Start |