Subversion Repositories Kolibri OS

Rev

Rev 3725 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3725 Rev 3908
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;   02.02.2010  turbanoff  - support 70.5                      ;;
5
;;   02.02.2010  turbanoff  - support 70.5                      ;;
6
;;   23.01.2010  turbanoff  - support 70.0 70.1                 ;;
6
;;   23.01.2010  turbanoff  - support 70.0 70.1                 ;;
7
;;   21.06.2013  yogev_ezra - Translate Russian comments        ;;
7
;;   21.06.2013  yogev_ezra - Translate Russian comments        ;;
8
;;                                                              ;;
8
;;                                                              ;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 10... Line 10...
10
 
10
 
Line 11... Line 11...
11
$Revision: 3725 $
11
$Revision: 3908 $
12
 
12
 
13
EXT2_BAD_INO         = 1
13
EXT2_BAD_INO         = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 175... Line 175...
175
        ei_leaf_hi      dw ?    ;RUS: старшие 16 бит 48-битного адреса (пока не используются в KOS)
175
        ei_leaf_hi      dw ?    ;RUS: старшие 16 бит 48-битного адреса (пока не используются в KOS)
176
                                ;ENG: upper 16 bits of the 48-bit address (not used in KolibriOS yet)
176
                                ;ENG: upper 16 bits of the 48-bit address (not used in KolibriOS yet)
177
        ei_unused       dw ?    ;RUS: зарезервировано   ;ENG: reserved
177
        ei_unused       dw ?    ;RUS: зарезервировано   ;ENG: reserved
178
ends
178
ends
Line -... Line 179...
-
 
179
 
-
 
180
struct EXTFS PARTITION
-
 
181
    Lock                           MUTEX
-
 
182
    log_block_size                 dd ?
-
 
183
    block_size                     dd ?
-
 
184
    count_block_in_block           dd ?
-
 
185
    blocks_per_group               dd ?
-
 
186
    global_desc_table              dd ?
-
 
187
    root_inode                     dd ?   ; pointer to root inode in memory
-
 
188
    inode_size                     dd ?
-
 
189
    count_pointer_in_block         dd ?   ;  block_size / 4
-
 
190
    count_pointer_in_block_square  dd ?   ; (block_size / 4)**2
-
 
191
    ext2_save_block                dd ?   ;RUS: блок на глобальную 1 процедуру   ;ENG: block for 1 global procedure
-
 
192
    ext2_temp_block                dd ?   ;RUS: блок для мелких процедур         ;ENG: block for small procedures
-
 
193
    ext2_save_inode                dd ?   ;RUS: inode на глобальную процедуру    ;ENG: inode for global procedure
-
 
194
    ext2_temp_inode                dd ?   ;RUS: inode для мелких процедур        ;ENG: inode for small procedures
-
 
195
    groups_count                   dd ?
-
 
196
    superblock                     rd 512/4
-
 
197
ends
-
 
198
 
-
 
199
iglobal
179
 
200
align 4
-
 
201
ext2_user_functions:
-
 
202
        dd      ext2_free
-
 
203
        dd      (ext2_user_functions_end - ext2_user_functions - 4) / 4
-
 
204
        dd      ext2_Read
-
 
205
        dd      ext2_ReadFolder
-
 
206
        dd      ext2_Rewrite
-
 
207
        dd      ext2_Write
-
 
208
        dd      ext2_SetFileEnd
180
ext2_test_superblock:
209
        dd      ext2_GetFileInfo
181
        cmp     [fs_type], 0x83
210
        dd      ext2_SetFileInfo
-
 
211
        dd      0
-
 
212
        dd      ext2_Delete
-
 
213
        dd      ext2_CreateFolder
-
 
214
ext2_user_functions_end:
-
 
215
endg
-
 
216
 
-
 
217
proc ext2_create_partition
Line 182... Line 218...
182
        jne     .no
218
        push    ebx
183
 
219
 
184
        mov     eax, [PARTITION_START]
220
        mov     eax, 2                  ;superblock start at 1024b
Line 185... Line 221...
185
        add     eax, 2                  ;superblock start at 1024b
221
        add     ebx, 512        ; get pointer to fs-specific buffer
186
        call    hd_read
222
        call    fs_read32_sys
187
 
223
 
188
        cmp     [ebx + EXT2_SB_STRUC.log_block_size], 3  ;0,1,2,3
224
        cmp     [ebx + EXT2_SB_STRUC.log_block_size], 3  ;0,1,2,3
Line 196... Line 232...
196
        
232
        
197
        mov     eax, [ebx + EXT2_SB_STRUC.feature_incompat]
233
        mov     eax, [ebx + EXT2_SB_STRUC.feature_incompat]
198
        test    eax, EXT2_FEATURE_INCOMPAT_FILETYPE
234
        test    eax, EXT2_FEATURE_INCOMPAT_FILETYPE
199
        jz      .no
235
        jz      .no
200
        test    eax, not EXT4_FEATURE_INCOMPAT_SUPP
236
        test    eax, not EXT4_FEATURE_INCOMPAT_SUPP
Line 201... Line -...
201
        jnz     .no
-
 
202
 
-
 
203
    ; OK, this is correct EXT2 superblock
-
 
204
        clc
237
        jz      ext2_setup
205
        ret
238
 
206
   .no:
239
   .no:
-
 
240
    ; No, this superblock isn't EXT2
207
    ; No, this superblock isn't EXT2
241
        pop     ebx
Line -... Line 242...
-
 
242
        xor     eax, eax
208
        stc
243
        ret
-
 
244
 
-
 
245
    ; OK, this is correct EXT2 superblock
-
 
246
ext2_setup:
-
 
247
        movi    eax, sizeof.EXTFS
-
 
248
        call    malloc
-
 
249
        test    eax, eax
-
 
250
        jz      ext2_create_partition.no
-
 
251
 
-
 
252
        mov     ecx, dword [ebp+PARTITION.FirstSector]
-
 
253
        mov     dword [eax+EXTFS.FirstSector], ecx
-
 
254
        mov     ecx, dword [ebp+PARTITION.FirstSector+4]
-
 
255
        mov     dword [eax+EXTFS.FirstSector+4], ecx
-
 
256
        mov     ecx, dword [ebp+PARTITION.Length]
-
 
257
        mov     dword [eax+EXTFS.Length], ecx
-
 
258
        mov     ecx, dword [ebp+PARTITION.Length+4]
-
 
259
        mov     dword [eax+EXTFS.Length+4], ecx
-
 
260
        mov     ecx, [ebp+PARTITION.Disk]
209
        ret
261
        mov     [eax+EXTFS.Disk], ecx
-
 
262
        mov     [eax+EXTFS.FSUserFunctions], ext2_user_functions
-
 
263
        push    ebp esi edi
Line 210... Line -...
210
 
-
 
211
ext2_setup:
-
 
212
        mov     [fs_type], 2
264
        mov     ebp, eax
213
 
265
        lea     ecx, [eax+EXTFS.Lock]
214
        push    512
266
        call    mutex_init
215
        call    kernel_alloc                            ; mem for superblock
267
 
216
        mov     esi, ebx
-
 
217
        mov     edi, eax
-
 
Line 218... Line 268...
218
        mov     ecx, 512/4
268
        mov     esi, ebx
219
        rep movsd                                       ; copy sb to reserved mem
269
        lea     edi, [ebp+EXTFS.superblock]
220
        mov     ebx, eax
270
        mov     ecx, 512/4
221
        mov     [ext2_data.sb], eax
271
        rep movsd                                       ; copy sb to reserved mem
222
 
272
 
223
        mov     eax, [ebx + EXT2_SB_STRUC.blocks_count]
273
        mov     eax, [ebx + EXT2_SB_STRUC.blocks_count]
224
        sub     eax, [ebx + EXT2_SB_STRUC.first_data_block]
274
        sub     eax, [ebx + EXT2_SB_STRUC.first_data_block]
Line 225... Line 275...
225
        dec     eax
275
        dec     eax
226
        xor     edx, edx
276
        xor     edx, edx
227
        div     [ebx + EXT2_SB_STRUC.blocks_per_group]
277
        div     [ebx + EXT2_SB_STRUC.blocks_per_group]
Line 228... Line 278...
228
        inc     eax
278
        inc     eax
229
        mov     [ext2_data.groups_count], eax
279
        mov     [ebp+EXTFS.groups_count], eax
230
 
280
 
Line 231... Line 281...
231
        mov     ecx, [ebx + EXT2_SB_STRUC.log_block_size]
281
        mov     ecx, [ebx + EXT2_SB_STRUC.log_block_size]
232
        inc     ecx
282
        inc     ecx
233
        mov     [ext2_data.log_block_size], ecx    ; 1, 2, 3, 4   equ 1kb, 2kb, 4kb, 8kb
283
        mov     [ebp+EXTFS.log_block_size], ecx    ; 1, 2, 3, 4   equ 1kb, 2kb, 4kb, 8kb
Line 234... Line 284...
234
 
284
 
235
        mov     eax, 1
285
        mov     eax, 1
Line 236... Line 286...
236
        shl     eax, cl
286
        shl     eax, cl
Line 237... Line 287...
237
        mov     [ext2_data.count_block_in_block], eax
287
        mov     [ebp+EXTFS.count_block_in_block], eax
238
 
288
 
239
        shl     eax, 7
289
        shl     eax, 7
Line 240... Line 290...
240
        mov     [ext2_data.count_pointer_in_block], eax
290
        mov     [ebp+EXTFS.count_pointer_in_block], eax
241
        mov     edx, eax   ;RUS: потом еще квадрат найдем   ;ENG: we'll find a square later
291
        mov     edx, eax   ;RUS: потом еще квадрат найдем   ;ENG: we'll find a square later
242
 
292
 
243
        shl     eax, 2
293
        shl     eax, 2
Line 244... Line 294...
244
        mov     [ext2_data.block_size], eax
294
        mov     [ebp+EXTFS.block_size], eax
245
 
295
 
Line 246... Line 296...
246
        push    eax eax                                 ; 2 kernel_alloc
296
        push    eax eax                                 ; 2 kernel_alloc
247
 
297
 
Line 248... Line 298...
248
        mov     eax, edx
298
        mov     eax, edx
249
        mul     edx
299
        mul     edx
250
        mov     [ext2_data.count_pointer_in_block_square], eax
300
        mov     [ebp+EXTFS.count_pointer_in_block_square], eax
251
 
301
 
252
        call    kernel_alloc
302
        call    kernel_alloc
253
        mov     [ext2_data.ext2_save_block], eax        ; and for temp block
303
        mov     [ebp+EXTFS.ext2_save_block], eax        ; and for temp block
254
        call    kernel_alloc
304
        call    kernel_alloc
Line 255... Line 305...
255
        mov     [ext2_data.ext2_temp_block], eax        ; and for get_inode proc
305
        mov     [ebp+EXTFS.ext2_temp_block], eax        ; and for get_inode proc
256
 
306
 
257
        movzx   ebp, word [ebx + EXT2_SB_STRUC.inode_size]
307
        movzx   eax, word [ebx + EXT2_SB_STRUC.inode_size]
Line -... Line 308...
-
 
308
        mov     ecx, [ebx + EXT2_SB_STRUC.blocks_per_group]
-
 
309
 
-
 
310
        mov     [ebp+EXTFS.inode_size], eax
-
 
311
        mov     [ebp+EXTFS.blocks_per_group], ecx
-
 
312
 
-
 
313
        push    eax eax eax                             ;3 kernel_alloc
-
 
314
        call    kernel_alloc
-
 
315
        mov     [ebp+EXTFS.ext2_save_inode], eax
-
 
316
        call    kernel_alloc
-
 
317
        mov     [ebp+EXTFS.ext2_temp_inode], eax
-
 
318
        call    kernel_alloc
-
 
319
        mov     [ebp+EXTFS.root_inode], eax
-
 
320
 
-
 
321
        mov     ebx, eax
-
 
322
        mov     eax, EXT2_ROOT_INO
-
 
323
        call    ext2_get_inode                          ; read root inode
-
 
324
 
-
 
325
        mov     eax, ebp        ; return pointer to EXTFS
-
 
326
        pop     edi esi ebp ebx
-
 
327
        ret
-
 
328
endp
258
        mov     ecx, [ebx + EXT2_SB_STRUC.blocks_per_group]
329
 
-
 
330
proc ext2_free
-
 
331
        push    ebp
-
 
332
        xchg    ebp, eax
-
 
333
        stdcall kernel_free, [ebp+EXTFS.ext2_save_block]
-
 
334
        stdcall kernel_free, [ebp+EXTFS.ext2_temp_block]
-
 
335
        stdcall kernel_free, [ebp+EXTFS.ext2_save_inode]
Line 259... Line 336...
259
 
336
        stdcall kernel_free, [ebp+EXTFS.ext2_temp_inode]
260
        mov     [ext2_data.inode_size], ebp
337
        stdcall kernel_free, [ebp+EXTFS.root_inode]
261
        mov     [ext2_data.blocks_per_group], ecx
338
        xchg    ebp, eax
262
 
339
        call    free
-
 
340
        pop     ebp
263
        push    ebp ebp ebp                             ;3 kernel_alloc
341
        ret
264
        call    kernel_alloc
342
endp
265
        mov     [ext2_data.ext2_save_inode], eax
343
 
266
        call    kernel_alloc
344
proc ext2_lock
267
        mov     [ext2_data.ext2_temp_inode], eax
345
        lea     ecx, [ebp+EXTFS.Lock]
268
        call    kernel_alloc
346
        jmp     mutex_lock
269
        mov     [ext2_data.root_inode], eax
347
endp
270
 
348
 
-
 
349
proc ext2_unlock
271
        mov     ebx, eax
350
        lea     ecx, [ebp+EXTFS.Lock]
272
        mov     eax, EXT2_ROOT_INO
351
        jmp     mutex_unlock
273
        call    ext2_get_inode                          ; read root inode
352
endp
274
 
353
 
275
        jmp     return_from_part_set
354
;==================================================================
-
 
355
;read ext2 block form FS to memory
276
 
356
;in:  eax = i_block (address of block in ext2 terms)
-
 
357
;     ebx = pointer to return memory
277
;==================================================================
358
;     ebp = pointer to EXTFS
278
;read ext2 block form FS to memory
359
;out: eax - error code (0 = no_error)
279
;in:  eax = i_block (address of block in ext2 terms)
360
ext2_get_block:
280
;     ebx = pointer to return memory
361
        push    ebx ecx
281
;out: eax - error code (0 = no_error)
362
        mov     ecx, [ebp+EXTFS.log_block_size]
Line 302... Line 383...
302
        
383
        
303
 
384
 
304
;===================================================================
385
;===================================================================
305
;RUS: получает номер блока из extent inode                    ;ENG: receives block number from extent inode
386
;RUS: получает номер блока из extent inode                    ;ENG: receives block number from extent inode
-
 
387
;RUS: in:  ecx = номер блока по порядку                       ;ENG: in:  ecx = consecutive block number
306
;RUS: in:  ecx = номер блока по порядку                       ;ENG: in:  ecx = consecutive block number
388
;RUS:      esi = адрес extent header`а                        ;ENG:      esi = address of extent header
307
;RUS:      ebp = адрес extent header`а                        ;ENG:      ebp = address of extent header
389
;RUS:      ebp = указатель на структуру EXTFS                 ;ENG:      ebp = pointer to EXTFS
308
;RUS: out: ecx - адрес очередного блока в случае успеха       ;ENG: out: ecx - address of next block, if successful
390
;RUS: out: ecx - адрес очередного блока в случае успеха       ;ENG: out: ecx - address of next block, if successful
309
;RUS:      eax - номер ошибки (если равно 0, то ошибки нет)   ;ENG:      eax - error number (0 - no error)
391
;RUS:      eax - номер ошибки (если равно 0, то ошибки нет)   ;ENG:      eax - error number (0 - no error)
310
ext4_block_recursive_search:
392
ext4_block_recursive_search:
Line 311... Line 393...
311
        cmp     word [ebp + EXT4_EXTENT_HEADER.eh_magic], 0xF30A ;EXT4_EXT_MAGIC
393
        cmp     word [esi + EXT4_EXTENT_HEADER.eh_magic], 0xF30A ;EXT4_EXT_MAGIC
312
        jne     .fail
394
        jne     .fail
313
        
395
        
314
        movzx   ebx, [ebp + EXT4_EXTENT_HEADER.eh_entries]
396
        movzx   ebx, [esi + EXT4_EXTENT_HEADER.eh_entries]
Line 315... Line 397...
315
        add     ebp, sizeof.EXT4_EXTENT_HEADER
397
        add     esi, sizeof.EXT4_EXTENT_HEADER
316
        cmp     word [ebp - sizeof.EXT4_EXTENT_HEADER + EXT4_EXTENT_HEADER.eh_depth], 0
398
        cmp     word [esi - sizeof.EXT4_EXTENT_HEADER + EXT4_EXTENT_HEADER.eh_depth], 0
317
        je      .leaf_block     ;листовой ли это блок?
399
        je      .leaf_block     ;листовой ли это блок?
Line 323... Line 405...
323
        ;цикл по индексам экстентов
405
        ;цикл по индексам экстентов
324
    @@:
406
    @@:
325
        cmp     ebx, 1              ;у индексов не хранится длина, 
407
        cmp     ebx, 1              ;у индексов не хранится длина, 
326
        je      .end_search_index   ;поэтому, если остался последний - то это нужный
408
        je      .end_search_index   ;поэтому, если остался последний - то это нужный
Line 327... Line 409...
327
        
409
        
328
        cmp     ecx, [ebp + EXT4_EXTENT_IDX.ei_block]
410
        cmp     ecx, [esi + EXT4_EXTENT_IDX.ei_block]
Line 329... Line 411...
329
        jb      .fail
411
        jb      .fail
330
        
412
        
Line 331... Line 413...
331
        cmp     ecx, [ebp + sizeof.EXT4_EXTENT_IDX + EXT4_EXTENT_IDX.ei_block] ;блок слeдующего индекса
413
        cmp     ecx, [esi + sizeof.EXT4_EXTENT_IDX + EXT4_EXTENT_IDX.ei_block] ;блок слeдующего индекса
332
        jb      .end_search_index ;следующий дальше - значит текущий, то что нам нужен
414
        jb      .end_search_index ;следующий дальше - значит текущий, то что нам нужен
333
        
415
        
Line 334... Line 416...
334
        add     ebp, sizeof.EXT4_EXTENT_IDX
416
        add     esi, sizeof.EXT4_EXTENT_IDX
335
        dec     ebx
417
        dec     ebx
336
        jmp     @B
418
        jmp     @B
337
        
419
        
338
    .end_search_index:
420
    .end_search_index:
339
        ;ebp указывает на нужный extent_idx, считываем следующий блок
421
        ;ebp указывает на нужный extent_idx, считываем следующий блок
340
        mov     ebx, [ext2_data.ext2_temp_block]
422
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
341
        mov     eax, [ebp + EXT4_EXTENT_IDX.ei_leaf_lo]
423
        mov     eax, [esi + EXT4_EXTENT_IDX.ei_leaf_lo]
342
        call    ext2_get_block
424
        call    ext2_get_block
Line 343... Line 425...
343
        test    eax, eax
425
        test    eax, eax
344
        jnz     .fail
426
        jnz     .fail
345
        mov     ebp, ebx
427
        mov     esi, ebx
346
        jmp     ext4_block_recursive_search ;рекурсивно прыгаем в начало
428
        jmp     ext4_block_recursive_search ;рекурсивно прыгаем в начало
347
        
429
        
Line 348... Line 430...
348
    .leaf_block:    ;листовой блок ebp - ext4_extent
430
    .leaf_block:    ;листовой блок esi - ext4_extent
349
        ;цикл по экстентам
431
        ;цикл по экстентам
350
    @@: 
432
    @@: 
Line 351... Line 433...
351
        test    ebx, ebx
433
        test    ebx, ebx
352
        jz      .fail       ;ни один узел не подошел - ошибка
434
        jz      .fail       ;ни один узел не подошел - ошибка
353
 
435
 
354
        mov     edx, [ebp + EXT4_EXTENT.ee_block]
436
        mov     edx, [esi + EXT4_EXTENT.ee_block]
Line 355... Line 437...
355
        cmp     ecx, edx
437
        cmp     ecx, edx
356
        jb      .fail       ;если меньше, значит он был в предыдущих блоках -> ошибка
438
        jb      .fail       ;если меньше, значит он был в предыдущих блоках -> ошибка
357
 
439
 
Line 358... Line 440...
358
        movzx   edi, [ebp + EXT4_EXTENT.ee_len]
440
        movzx   edi, [esi + EXT4_EXTENT.ee_len]
359
        add     edx, edi
441
        add     edx, edi
360
        cmp     ecx, edx
442
        cmp     ecx, edx
361
        jb      .end_search_extent     ;нашли нужный блок
443
        jb      .end_search_extent     ;нашли нужный блок
362
        
444
        
363
        add     ebp, sizeof.EXT4_EXTENT
445
        add     esi, sizeof.EXT4_EXTENT
Line 364... Line 446...
364
        dec     ebx
446
        dec     ebx
Line 376... Line 458...
376
        ret
458
        ret
Line 377... Line 459...
377
 
459
 
378
;===================================================================
460
;===================================================================
379
;получает адрес ext2 блока из inode с определнным номером
461
;получает адрес ext2 блока из inode с определнным номером
380
;RUS: in:  ecx = номер блока в inode (0..)   ;ENG: in:  ecx = number of block in inode (0..)
462
;RUS: in:  ecx = номер блока в inode (0..)   ;ENG: in:  ecx = number of block in inode (0..)
-
 
463
;RUS:      esi = адрес inode                 ;ENG:      esi = inode address
381
;RUS:      ebp = адрес inode                 ;ENG:      ebp = inode address
464
;RUS:      ebp = указатель на структуру EXTFS;ENG:      ebp = pointer to EXTFS
382
;RUS: out: ecx = адрес очередного блока      ;ENG: out: ecx = next block address
465
;RUS: out: ecx = адрес очередного блока      ;ENG: out: ecx = next block address
383
;RUS:      eax - error code                  ;ENG:      eax - error code
466
;RUS:      eax - error code                  ;ENG:      eax - error code
384
ext2_get_inode_block:
467
ext2_get_inode_block:
385
        test    [ebp + EXT2_INODE_STRUC.i_flags], EXT2_EXTENTS_FL
468
        test    [esi + EXT2_INODE_STRUC.i_flags], EXT2_EXTENTS_FL
Line 386... Line 469...
386
        jz      @F
469
        jz      @F
387
 
470
 
388
        pushad
471
        pushad
389
        add     ebp, EXT2_INODE_STRUC.i_block             ;ebp - extent_header
472
        add     esi, EXT2_INODE_STRUC.i_block             ;esi - extent_header
390
        call    ext4_block_recursive_search
473
        call    ext4_block_recursive_search
391
        mov     PUSHAD_ECX, ecx
474
        mov     PUSHAD_ECX, ecx
392
        mov     PUSHAD_EAX, eax
475
        mov     PUSHAD_EAX, eax
Line 396... Line 479...
396
    @@:
479
    @@:
397
        cmp     ecx, 12                                         ; 0..11 - direct block address
480
        cmp     ecx, 12                                         ; 0..11 - direct block address
398
        jb      .get_direct_block
481
        jb      .get_direct_block
Line 399... Line 482...
399
 
482
 
400
        sub     ecx, 12
483
        sub     ecx, 12
401
        cmp     ecx, [ext2_data.count_pointer_in_block]         ; 12.. - indirect blocks
484
        cmp     ecx, [ebp+EXTFS.count_pointer_in_block]         ; 12.. - indirect blocks
Line 402... Line 485...
402
        jb      .get_indirect_block
485
        jb      .get_indirect_block
403
 
486
 
404
        sub     ecx, [ext2_data.count_pointer_in_block]
487
        sub     ecx, [ebp+EXTFS.count_pointer_in_block]
Line 405... Line 488...
405
        cmp     ecx, [ext2_data.count_pointer_in_block_square]
488
        cmp     ecx, [ebp+EXTFS.count_pointer_in_block_square]
406
        jb      .get_double_indirect_block
489
        jb      .get_double_indirect_block
407
 
490
 
Line 408... Line 491...
408
        sub     ecx, [ext2_data.count_pointer_in_block_square]
491
        sub     ecx, [ebp+EXTFS.count_pointer_in_block_square]
409
    ;triple indirect block
492
    ;triple indirect block
410
        push    edx ebx
493
        push    edx ebx
411
 
494
 
412
        mov     eax, [ebx + EXT2_INODE_STRUC.i_block + 14*4]
495
        mov     eax, [esi + EXT2_INODE_STRUC.i_block + 14*4]
Line 413... Line 496...
413
        mov     ebx, [ext2_data.ext2_temp_block]
496
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
414
        call    ext2_get_block
497
        call    ext2_get_block
415
        test    eax, eax
498
        test    eax, eax
Line 416... Line 499...
416
        jnz     .fail
499
        jnz     .fail
417
 
500
 
418
        xor     edx, edx
501
        xor     edx, edx
419
        mov     eax, ecx
502
        mov     eax, ecx
Line 430... Line 513...
430
        jmp     @F
513
        jmp     @F
Line 431... Line 514...
431
 
514
 
432
    .get_double_indirect_block:
515
    .get_double_indirect_block:
Line 433... Line 516...
433
        push    edx ebx
516
        push    edx ebx
434
 
517
 
435
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 13*4]
518
        mov     eax, [esi + EXT2_INODE_STRUC.i_block + 13*4]
436
        mov     ebx, [ext2_data.ext2_temp_block]
519
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
437
        call    ext2_get_block
520
        call    ext2_get_block
Line 438... Line 521...
438
        test    eax, eax
521
        test    eax, eax
439
        jnz     .fail
522
        jnz     .fail
440
 
523
 
441
        mov     eax, ecx
524
        mov     eax, ecx
Line 442... Line 525...
442
    @@:
525
    @@:
443
        xor     edx, edx
526
        xor     edx, edx
444
        div     [ext2_data.count_pointer_in_block]
527
        div     [ebp+EXTFS.count_pointer_in_block]
445
 
528
 
Line 453... Line 536...
453
        pop     ebx edx
536
        pop     ebx edx
454
        ret
537
        ret
Line 455... Line 538...
455
 
538
 
456
    .get_indirect_block:
539
    .get_indirect_block:
457
        push    ebx
540
        push    ebx
458
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4]
541
        mov     eax, [esi + EXT2_INODE_STRUC.i_block + 12*4]
459
        mov     ebx, [ext2_data.ext2_temp_block]
542
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
460
        call    ext2_get_block
543
        call    ext2_get_block
461
        test    eax, eax
544
        test    eax, eax
Line 462... Line 545...
462
        jnz     @F          ;RUS: если не было ошибки   ;ENG: if there was no error
545
        jnz     @F          ;RUS: если не было ошибки   ;ENG: if there was no error
463
 
546
 
464
        mov     ecx, [ebx + ecx*4]   ;RUS: заносим результат   ;ENG: ???
547
        mov     ecx, [ebx + ecx*4]   ;RUS: заносим результат   ;ENG: ???
465
    @@:
548
    @@:
Line 466... Line 549...
466
        pop     ebx
549
        pop     ebx
467
        ret
550
        ret
468
 
551
 
469
    .get_direct_block:
552
    .get_direct_block:
Line 470... Line 553...
470
        mov     ecx, [ebp + EXT2_INODE_STRUC.i_block + ecx*4]
553
        mov     ecx, [esi + EXT2_INODE_STRUC.i_block + ecx*4]
471
        xor     eax, eax
554
        xor     eax, eax
472
        ret
555
        ret
473
 
556
 
-
 
557
;===================================================================
474
;===================================================================
558
;get content inode by num
475
;get content inode by num
559
;in:  eax = inode_num
476
;in:  eax = inode_num
560
;     ebx = address of inode content
477
;     ebx = address of inode content
561
;     ebp = pointer to EXTFS
478
;out: eax - error code
562
;out: eax - error code
479
ext2_get_inode:
563
ext2_get_inode:
Line 480... Line -...
480
        pushad
-
 
481
        mov     edi, ebx   ;сохраним адрес inode
564
        pushad
Line 482... Line 565...
482
        dec     eax
565
        mov     edi, ebx   ;сохраним адрес inode
Line 483... Line 566...
483
        xor     edx, edx
566
        dec     eax
484
        
567
        xor     edx, edx
Line 485... Line 568...
485
        mov     ecx, [ext2_data.sb]
568
        
486
        div     [ecx + EXT2_SB_STRUC.inodes_per_group]
569
        div     [ebp + EXT2_SB_STRUC.inodes_per_group + EXTFS.superblock]
487
 
570
 
488
        push    edx                             ;locale num in group
571
        push    edx                             ;locale num in group
489
 
572
 
490
        mov     edx, 32
573
        mov     edx, 32
491
        mul     edx                             ; address block_group in global_desc_table
574
        mul     edx                             ; address block_group in global_desc_table
492
 
575
 
493
        ;RUS: в eax - смещение группы с inode-ом относительно начала глобальной дескрипторной таблицы
576
        ;RUS: в eax - смещение группы с inode-ом относительно начала глобальной дескрипторной таблицы
494
        ;RUS: найдем блок в котором он находится
577
        ;RUS: найдем блок в котором он находится
495
        ;ENG: in eax - inode group offset relative to global descriptor table start
578
        ;ENG: in eax - inode group offset relative to global descriptor table start
Line 496... Line 579...
496
        ;ENG: let's find the block this inode is in
579
        ;ENG: let's find the block this inode is in
497
        div     [ext2_data.block_size]
580
        div     [ebp+EXTFS.block_size]
498
        add     eax, [ecx + EXT2_SB_STRUC.first_data_block]
581
        add     eax, [ebp + EXT2_SB_STRUC.first_data_block + EXTFS.superblock]
499
        inc     eax
582
        inc     eax
500
        mov     ebx, [ext2_data.ext2_temp_block]
583
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
501
        call    ext2_get_block
-
 
502
        test    eax, eax
-
 
503
        jnz     .fail     
584
        call    ext2_get_block
504
 
585
        test    eax, eax
Line 505... Line 586...
505
        add     ebx, edx   ;RUS: локальный номер в блоке   ;ENG: local number inside block
586
        jnz     .fail
506
        mov     eax, [ebx + EXT2_BLOCK_GROUP_DESC.inode_table]   ;RUS: номер блока - в терминах ext2
587
 
507
                                                                 ;ENG: block number - in ext2 terms
588
        add     ebx, edx   ;RUS: локальный номер в блоке   ;ENG: local number inside block
508
        mov     ecx, [ext2_data.log_block_size]
589
        mov     eax, [ebx + EXT2_BLOCK_GROUP_DESC.inode_table]   ;RUS: номер блока - в терминах ext2
-
 
590
                                                                 ;ENG: block number - in ext2 terms
509
        shl     eax, cl
591
        mov     ecx, [ebp+EXTFS.log_block_size]
510
        add     eax, [PARTITION_START]          ;RUS: а старт раздела - в терминах hdd (512)
592
        shl     eax, cl
-
 
593
        ;RUS: eax - указывает на таблицу inode-ов на hdd   ;ENG: eax - points to inode table on HDD
Line 511... Line 594...
511
                                                ;ENG: partition start - in HDD terms (512)
594
        mov     esi, eax   ;RUS: сохраним его пока в esi   ;ENG: let's save it in esi for now
512
        ;RUS: eax - указывает на таблицу inode-ов на hdd   ;ENG: eax - points to inode table on HDD
595
 
513
        mov     esi, eax   ;RUS: сохраним его пока в esi   ;ENG: let's save it in esi for now
596
        ;RUS: прибавим локальный адрес inode-а   ;ENG: add local address of inode
514
 
597
        pop     eax                             ; index
515
        ;RUS: прибавим локальный адрес inode-а   ;ENG: add local address of inode
598
        mov     ecx, [ebp+EXTFS.inode_size]
Line 516... Line 599...
516
        pop     eax                             ; index
599
        mul     ecx                             ; (index * inode_size)
-
 
600
                ;RUS: поделим на размер блока        ;ENG: divide by block size
517
        mov     ecx, [ext2_data.inode_size]
601
        mov     ecx, eax
518
        mul     ecx                             ; (index * inode_size)
602
        and     ecx, 512 - 1
519
        mov     ebp, 512
603
        shrd    eax, edx, 9
520
        div     ebp        ;RUS: поделим на размер блока        ;ENG: divide by block size
604
 
521
 
605
        add     eax, esi   ;RUS: нашли адрес блока для чтения   ;ENG: found block address to read
522
        add     eax, esi   ;RUS: нашли адрес блока для чтения   ;ENG: found block address to read
606
        mov     ebx, [ebp+EXTFS.ext2_temp_block]
523
        mov     ebx, [ext2_data.ext2_temp_block]
607
        call    fs_read32_sys
Line 524... Line 608...
524
        call    hd_read
608
        test    eax, eax
525
        cmp     [hd_error], 0
-
 
526
        jnz     .fail
609
        jnz     .fail
527
 
-
 
528
        mov     esi, edx         ;RUS: добавим "остаток"   ;ENG: add the "remainder"
610
 
529
        add     esi, ebx         ;RUS: к адресу            ;ENG: to the address
-
 
530
        rep movsb                ;RUS: копируем inode      ;ENG: copy inode
-
 
531
        xor     eax, eax
-
 
532
    .fail:
-
 
533
        mov     PUSHAD_EAX, eax
611
        mov     esi, ecx         ;RUS: добавим "остаток"   ;ENG: add the "remainder"
534
        popad
-
 
535
        ret
612
        mov     ecx, [ebp+EXTFS.inode_size]
536
 
613
        add     esi, ebx         ;RUS: к адресу            ;ENG: to the address
537
;----------------------------------------------------------------
-
 
538
;
614
        rep movsb                ;RUS: копируем inode      ;ENG: copy inode
539
;  ext2_HdReadFolder - read disk folder
615
        xor     eax, eax
-
 
616
    .fail:
540
;
617
        mov     PUSHAD_EAX, eax
541
;  esi  points to filename
618
        popad
Line 542... Line 619...
542
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
619
        ret
543
;                          & flags (bitfields)
620
 
544
; flags: bit 0: 0=ANSI names, 1=UNICODE names
621
;----------------------------------------------------------------
545
;  ecx  number of blocks to read, 0+
622
; ext2_ReadFolder - EXT2FS implementation of reading a folder
546
;  edx  mem location to return data
623
; in:  ebp = pointer to EXTFS structure
547
;
624
; in:  esi+[esp+4] = name
548
;  ret ebx = blocks read or 0xffffffff folder not found
625
; in:  ebx = pointer to parameters from sysfunc 70
549
;      eax = 0 ok read or other = errormsg
626
; out: eax, ebx = return values for sysfunc 70
Line 550... Line 627...
550
;
627
;----------------------------------------------------------------
551
;--------------------------------------------------------------
628
ext2_ReadFolder:
552
ext2_HdReadFolder:
629
        call    ext2_lock
553
        cmp     byte [esi], 0
630
        cmp     byte [esi], 0
554
        jz      .root_folder
631
        jz      .root_folder
555
 
-
 
556
        push    ebx ecx edx
-
 
557
        call    ext2_find_lfn               ;вернет в ebp адрес inode
632
 
558
        pop     edx ecx ebx
633
        push    ebx
559
        test    eax, eax
634
        stdcall ext2_find_lfn, [esp+4+4]    ;вернет в esi адрес inode
560
        jnz     .error_ret
635
        pop     ebx
561
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
636
        test    eax, eax
562
        jz      .error_not_found
637
        jnz     .error_ret
563
        jmp     @F
638
        test    [esi + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
564
 
639
        jz      .error_not_found
565
    .root_folder:
640
        jmp     @F
Line -... Line 641...
-
 
641
 
566
        mov     ebp, [ext2_data.root_inode]
642
    .root_folder:
567
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
643
        mov     esi, [ebp+EXTFS.root_inode]
568
        jz      .error_root
644
        test    [esi + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
569
        ;придется копировать inode
645
        jz      .error_root
570
        push    ecx
646
        ;придется копировать inode
571
        mov     esi, ebp
647
        mov     edi, [ebp+EXTFS.ext2_save_inode]
572
        mov     edi, [ext2_data.ext2_save_inode]
648
        mov     ecx, [ebp+EXTFS.inode_size]
573
        mov     ecx, [ext2_data.inode_size]
649
        shr     ecx, 2
Line 574... Line 650...
574
        shr     ecx, 2
650
        push    edi
Line 599... Line 675...
599
        call    ext2_get_inode_block
675
        call    ext2_get_inode_block
600
        test    eax, eax
676
        test    eax, eax
601
        jnz     .error_get_block
677
        jnz     .error_get_block
Line 602... Line 678...
602
 
678
 
603
        mov     eax, ecx
679
        mov     eax, ecx
604
        mov     ebx, [ext2_data.ext2_save_block]
680
        mov     ebx, [ebp+EXTFS.ext2_save_block]
605
        call    ext2_get_block                  ; и считываем блок с hdd
681
        call    ext2_get_block                  ; и считываем блок с hdd
606
        test    eax, eax
682
        test    eax, eax
Line 607... Line 683...
607
        jnz     .error_get_block
683
        jnz     .error_get_block
608
 
684
 
609
        mov     esi, ebx                         ; esi = current dir record
685
        mov     eax, ebx                         ; ebx = current dir record
Line 610... Line 686...
610
        add     ebx, [ext2_data.block_size]
686
        add     eax, [ebp+EXTFS.block_size]
Line 611... Line 687...
611
        mov     [edi + 24], ebx               ; запомним конец очередного блока
687
        mov     [edi + 24], eax               ; запомним конец очередного блока
612
 
688
 
613
        mov     ecx, [edi + 16]                        ; ecx = first wanted (flags ommited)
689
        mov     ecx, [edi + 16]                        ; ecx = first wanted (flags ommited)
614
 
690
 
615
    .find_wanted_start:
691
    .find_wanted_start:
616
        jecxz   .find_wanted_end
692
        jecxz   .find_wanted_end
617
    .find_wanted_cycle:
693
    .find_wanted_cycle:
618
        cmp     [esi + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
694
        cmp     [ebx + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
619
        jz      @F
695
        jz      @F
Line 620... Line 696...
620
        inc     dword [edi + 4]                        ; EXT2_files_in_folder
696
        inc     dword [edi + 4]                        ; EXT2_files_in_folder
621
        dec     ecx
697
        dec     ecx
622
    @@:
698
    @@:
623
        movzx   ebx, [esi + EXT2_DIR_STRUC.rec_len]
699
        movzx   eax, [ebx + EXT2_DIR_STRUC.rec_len]
Line 624... Line 700...
624
 
700
 
625
        cmp     ebx, 12                                 ; минимальная длина записи
701
        cmp     eax, 12                                 ; минимальная длина записи
626
        jb      .error_bad_len
702
        jb      .error_bad_len
627
        test    ebx, 0x3                                ; длина записи должна делиться на 4
703
        test    eax, 0x3                                ; длина записи должна делиться на 4
Line 628... Line 704...
628
        jnz     .error_bad_len
704
        jnz     .error_bad_len
629
 
705
 
630
        sub     [ebp + EXT2_INODE_STRUC.i_size], ebx    ;вычитаем напрямую из структуры inode
706
        sub     [esi + EXT2_INODE_STRUC.i_size], eax    ;вычитаем напрямую из структуры inode
631
        add     esi, ebx                                ; к следующей записи
707
        add     ebx, eax                                ; к следующей записи
Line 632... Line 708...
632
        cmp     esi, [edi + 24]                        ; сравниваем с концом блока
708
        cmp     ebx, [edi + 24]                        ; сравниваем с концом блока
633
        jb      .find_wanted_start
709
        jb      .find_wanted_start
634
 
710
 
635
        push    .find_wanted_start
711
        push    .find_wanted_start
636
   .end_block:                                              ;вылетели из цикла
712
   .end_block:                                              ;вылетели из цикла
637
        cmp     [ebp + EXT2_INODE_STRUC.i_size], 0
713
        cmp     [esi + EXT2_INODE_STRUC.i_size], 0
Line 638... Line 714...
638
        jle     .end_dir
714
        jle     .end_dir
639
 
715
 
640
        inc     dword [edi]                                 ;получаем новый блок
716
        inc     dword [edi]                                 ;получаем новый блок
641
        push    ecx
717
        push    ecx
642
        mov     ecx, [edi]
718
        mov     ecx, [edi]
Line 643... Line 719...
643
        call    ext2_get_inode_block
719
        call    ext2_get_inode_block
644
        test    eax, eax
720
        test    eax, eax
645
        jnz     .error_get_block
721
        jnz     .error_get_block
646
 
722
 
647
        mov     eax, ecx
723
        mov     eax, ecx
Line 648... Line 724...
648
        mov     ebx, [ext2_data.ext2_save_block]
724
        mov     ebx, [ebp+EXTFS.ext2_save_block]
649
        call    ext2_get_block
725
        call    ext2_get_block
Line 650... Line 726...
650
        test    eax, eax
726
        test    eax, eax
651
        jnz     .error_get_block
727
        jnz     .error_get_block
652
 
728
 
653
        pop     ecx
729
        pop     ecx
654
        mov     esi, ebx
730
        mov     eax, ebx
655
        add     ebx, [ext2_data.block_size]
731
        add     eax, [ebp+EXTFS.block_size]
656
        mov     [edi + 24], ebx                            ;запомним конец блока
732
        mov     [edi + 24], eax                            ;запомним конец блока
657
        ret                                                 ; опять в цикл
733
        ret                                                 ; опять в цикл
658
 
734
 
Line 659... Line 735...
659
    .wanted_end:
735
    .wanted_end:
Line 674... Line 750...
674
        xor     eax, eax
750
        xor     eax, eax
675
        mov     ecx, 40 / 4
751
        mov     ecx, 40 / 4
676
        rep stosd
752
        rep stosd
677
        pop     ecx edi
753
        pop     ecx edi
Line 678... Line 754...
678
 
754
 
679
        push    esi edi edx
755
        push    ebx edi edx
680
        mov     eax, [esi + EXT2_DIR_STRUC.inode]             ;получим дочерний inode
756
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]             ;получим дочерний inode
681
        mov     ebx, [ext2_data.ext2_temp_inode]
757
        mov     ebx, [ebp+EXTFS.ext2_temp_inode]
682
        call    ext2_get_inode
758
        call    ext2_get_inode
683
        test    eax, eax
759
        test    eax, eax
Line 684... Line 760...
684
        jnz     .error_read_subinode
760
        jnz     .error_read_subinode
Line 714... Line 790...
714
        xor     dword [edx], FS_FT_DIR                              ;помечаем, что это файл(2 раза xor)
790
        xor     dword [edx], FS_FT_DIR                              ;помечаем, что это файл(2 раза xor)
715
    @@:
791
    @@:
716
        xor     dword [edx], FS_FT_DIR                              ;помечаем, что это файл
792
        xor     dword [edx], FS_FT_DIR                              ;помечаем, что это файл
Line 717... Line 793...
717
 
793
 
718
        ;теперь скопируем имя, сконвертировав из UTF-8 в CP866
794
        ;теперь скопируем имя, сконвертировав из UTF-8 в CP866
-
 
795
        push    ecx esi ;edi уже сохранен в стеке
719
        push    ecx  ;edi и esi уже сохранены в стеке
796
        mov     esi, [esp+12]
720
        movzx   ecx, [esi + EXT2_DIR_STRUC.name_len]
797
        movzx   ecx, [esi + EXT2_DIR_STRUC.name_len]
721
        lea     edi, [edx + 40]
798
        lea     edi, [edx + 40]
722
        lea     esi, [esi + EXT2_DIR_STRUC.name]
799
        lea     esi, [esi + EXT2_DIR_STRUC.name]
723
        call    utf8_to_cp866
800
        call    utf8_to_cp866
724
        and     byte [edi], 0
801
        and     byte [edi], 0
Line 725... Line 802...
725
        pop     ecx edi esi
802
        pop     esi ecx edi ebx
726
 
803
 
727
        cmp     byte [edx + 40], '.'                    ; в linux файл, начинающийся с точки - скрытый
804
        cmp     byte [edx + 40], '.'                    ; в linux файл, начинающийся с точки - скрытый
728
        jne     @F
805
        jne     @F
Line 729... Line 806...
729
        or      dword [edx], FS_FT_HIDDEN
806
        or      dword [edx], FS_FT_HIDDEN
730
    @@:
807
    @@:
731
 
808
 
732
        add     edx, 40 + 264                           ; go to next record
809
        add     edx, 40 + 264                           ; go to next record
733
        dec     ecx                                     ; если запись пустая ecx не надо уменьшать
810
        dec     ecx                                     ; если запись пустая ecx не надо уменьшать
734
    .empty_rec:
811
    .empty_rec:
735
        movzx   ebx, [esi + EXT2_DIR_STRUC.rec_len]
812
        movzx   eax, [ebx + EXT2_DIR_STRUC.rec_len]
736
        cmp     ebx, 12                                 ; минимальная длина записи
813
        cmp     eax, 12                                 ; минимальная длина записи
Line 737... Line 814...
737
        jb      .error_bad_len
814
        jb      .error_bad_len
738
        test    ebx, 0x3                                ; длина записи должна делиться на 4
815
        test    eax, 0x3                                ; длина записи должна делиться на 4
739
        jnz     .error_bad_len
816
        jnz     .error_bad_len
740
 
817
 
Line 741... Line 818...
741
        sub     [ebp + EXT2_INODE_STRUC.i_size], ebx    ;вычитаем напрямую из структуры inode
818
        sub     [esi + EXT2_INODE_STRUC.i_size], eax    ;вычитаем напрямую из структуры inode
742
        add     esi, ebx
819
        add     ebx, eax
Line 743... Line 820...
743
        cmp     esi, [edi + 24]                         ;дошли ли до конца блока?
820
        cmp     ebx, [edi + 24]                         ;дошли ли до конца блока?
-
 
821
        jb      .wanted_start
744
        jb      .wanted_start
822
 
745
 
823
        push    .wanted_start                           ; дошли 
746
        push    .wanted_start                           ; дошли 
824
        jmp     .end_block
747
        jmp     .end_block
825
 
748
 
826
    .end_dir:   ;конец папки, когда еще не дошли до нужного файла
Line 768... Line 846...
768
    .error_read_subinode:
846
    .error_read_subinode:
769
    .error_get_block:
847
    .error_get_block:
770
        lea     esp, [edi + 32]
848
        lea     esp, [edi + 32]
771
    .error_ret:
849
    .error_ret:
772
        or      ebx, -1
850
        or      ebx, -1
-
 
851
        push    eax
-
 
852
        call    ext2_unlock
-
 
853
        pop     eax
773
        ret
854
        ret
Line 774... Line 855...
774
        
855
        
775
    .error_empty_dir:   ;RUS: inode папки без блоков   ;ENG: inode of folder without blocks
856
    .error_empty_dir:   ;RUS: inode папки без блоков   ;ENG: inode of folder without blocks
776
    .error_root:        ;RUS: root - не папка          ;ENG: root is not a folder
857
    .error_root:        ;RUS: root - не папка          ;ENG: root is not a folder
Line 832... Line 913...
832
        jnz     .start
913
        jnz     .start
833
    .ret:
914
    .ret:
834
        ret
915
        ret
Line 835... Line 916...
835
 
916
 
836
;----------------------------------------------------------------
-
 
837
;
917
;----------------------------------------------------------------
838
;  ext2_HdRead - read hard disk
-
 
839
;
918
; ext2_Read - EXT2FS implementation of reading a file
840
;  esi  points to filename
-
 
841
;  ebx  pointer to 64-bit number = first wanted byte, 0+
-
 
842
;       may be ebx=0 - start from first byte
-
 
843
;  ecx  number of bytes to read, 0+
919
; in:  ebp = pointer to FAT structure
844
;  edx  mem location to return data
-
 
845
;
920
; in:  esi+[esp+4] = name
846
;  ret ebx = bytes read or 0xffffffff file not found
921
; in:  ebx = pointer to parameters from sysfunc 70
847
;      eax = 0 ok read or other = errormsg
-
 
848
 
922
; out: eax, ebx = return values for sysfunc 70
849
;--------------------------------------------------------------
923
;----------------------------------------------------------------
-
 
924
ext2_Read:
850
ext2_HdRead:
925
        call    ext2_lock
851
        cmp     byte [esi], 0
926
        cmp     byte [esi], 0
Line 852... Line 927...
852
        jnz     @F
927
        jnz     @F
-
 
928
 
853
 
929
    .this_is_nofile:
854
    .this_is_nofile:
930
        call    ext2_unlock
855
        or      ebx, -1
931
        or      ebx, -1
Line 856... Line 932...
856
        mov     eax, ERROR_ACCESS_DENIED
932
        mov     eax, ERROR_ACCESS_DENIED
857
        ret
933
        ret
858
 
934
 
859
    @@:
935
    @@:
860
        push    ecx ebx edx
936
        push    ebx
861
        call    ext2_find_lfn
937
        stdcall ext2_find_lfn, [esp+4+4]
Line -... Line 938...
-
 
938
        pop     ebx
862
        pop     edx ebx ecx
939
        test    eax, eax
863
        test    eax, eax
940
        jz      @F
864
        jz      @F
941
 
Line 865... Line 942...
865
 
942
        call    ext2_unlock
866
        or      ebx, -1
943
        or      ebx, -1
867
        mov     eax, ERROR_FILE_NOT_FOUND
944
        mov     eax, ERROR_FILE_NOT_FOUND
868
        ret
945
        ret
869
 
946
 
Line 870... Line 947...
870
    @@:
947
    @@:
-
 
948
        mov     ax, [esi + EXT2_INODE_STRUC.i_mode]
Line 871... Line -...
871
        mov     ax, [ebp + EXT2_INODE_STRUC.i_mode]
-
 
872
        and     ax, EXT2_S_IFMT     ;оставляем только тип inode в ax
-
 
873
        cmp     ax, EXT2_S_IFREG
-
 
874
        jne     .this_is_nofile
949
        and     ax, EXT2_S_IFMT     ;оставляем только тип inode в ax
875
 
950
        cmp     ax, EXT2_S_IFREG
Line 876... Line 951...
876
        mov     edi, edx            ; edi = pointer to return mem
951
        jne     .this_is_nofile
877
 
952
 
878
        test    ebx, ebx
953
        mov     edi, [ebx+16]       ; edi = pointer to return mem
879
        jz      @F
954
        mov     ecx, [ebx+12]
Line 880... Line 955...
880
        mov     esi, ebx            ; esi = pointer to first_wanted
955
 
881
        mov     ebx, [esi+4]
956
        mov     eax, [ebx+4]
Line 882... Line 957...
882
        mov     eax, [esi]    ;RUS: ebx : eax - стартовый номер байта   ;ENG: ebx : eax - start byte number
957
        mov     edx, [ebx+8] ;RUS: edx : eax - стартовый номер байта   ;ENG: edx : eax - start byte number
-
 
958
 
883
 
959
        ;RUS: ///// сравним хватит ли нам файла или нет    ;ENG: ///// check if file is big enough for us
884
        ;RUS: ///// сравним хватит ли нам файла или нет    ;ENG: ///// check if file is big enough for us
960
        cmp     [esi + EXT2_INODE_STRUC.i_dir_acl], edx
885
        cmp     [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
961
        ja      .size_great
Line 886... Line -...
886
        ja      .size_great
-
 
887
        jb      .size_less
-
 
888
 
-
 
889
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
962
        jb      .size_less
890
        ja      .size_great
963
 
891
 
964
        cmp     [esi + EXT2_INODE_STRUC.i_size], eax
892
    .size_less:
965
        ja      .size_great
Line 893... Line 966...
893
        xor     ebx, ebx
966
 
894
        mov     eax, ERROR_END_OF_FILE
967
    .size_less:
895
        ret
968
        call    ext2_unlock
896
        
969
        xor     ebx, ebx
897
    @@:
970
        mov     eax, ERROR_END_OF_FILE
Line 898... Line 971...
898
        xor     ebx, ebx
971
        ret
899
        xor     eax, eax
972
        
900
    .size_great:
973
    .size_great:
901
        add     eax, ecx    ;RUS: add to first_wanted кол-во байт для чтения
974
        add     eax, ecx    ;RUS: add to first_wanted кол-во байт для чтения
902
                            ;ENG: add to first_wanted number of bytes to read
975
                            ;ENG: add to first_wanted number of bytes to read
Line 903... Line 976...
903
        adc     ebx, 0
976
        adc     edx, 0
904
 
977
 
Line 921... Line 994...
921
        ;здесь мы точно знаем сколько байт читать - ecx
994
        ;здесь мы точно знаем сколько байт читать - ecx
922
        ;edi - return memory
995
        ;edi - return memory
923
        ;esi -> first wanted
996
        ;esi -> first wanted
Line 924... Line 997...
924
 
997
 
925
        push    ecx                             ;количество считанных байт
-
 
926
        test    esi, esi
-
 
Line 927... Line 998...
927
        jz      .zero_start
998
        push    ecx                             ;количество считанных байт
928
 
999
 
929
        ;получим кусок из первого блока
1000
        ;получим кусок из первого блока
930
        mov     edx, [esi+4]
1001
        mov     edx, [ebx+8]
Line 931... Line 1002...
931
        mov     eax, [esi]
1002
        mov     eax, [ebx+4]
Line 932... Line 1003...
932
        div     [ext2_data.block_size]
1003
        div     [ebp+EXTFS.block_size]
933
 
1004
 
934
        push    eax       ;счетчик блоков ложим в стек
1005
        push    eax       ;счетчик блоков ложим в стек
935
        
1006
        
936
        push    ecx
1007
        push    ecx
937
        mov     ecx, eax
1008
        mov     ecx, eax
938
        call    ext2_get_inode_block
1009
        call    ext2_get_inode_block
939
        test    eax, eax
1010
        test    eax, eax
940
        jnz     .error_at_first_block
1011
        jnz     .error_at_first_block
941
        mov     ebx, [ext2_data.ext2_save_block]
1012
        mov     ebx, [ebp+EXTFS.ext2_save_block]
942
        mov     eax, ecx
1013
        mov     eax, ecx
943
        call    ext2_get_block
1014
        call    ext2_get_block
Line 944... Line 1015...
944
        test    eax, eax
1015
        test    eax, eax
945
        jnz     .error_at_first_block
1016
        jnz     .error_at_first_block
946
        pop     ecx
1017
        pop     ecx
947
        add     ebx, edx
1018
        add     ebx, edx
948
 
1019
 
Line 949... Line 1020...
949
        neg     edx
1020
        neg     edx
950
        add     edx, [ext2_data.block_size]     ;RUS: block_size - стартовый байт = сколько байт 1-го блока
1021
        add     edx, [ebp+EXTFS.block_size]     ;RUS: block_size - стартовый байт = сколько байт 1-го блока
951
                                                ;ENG: block_size - start byte = number of bytes in 1st block
1022
                                                ;ENG: block_size - start byte = number of bytes in 1st block
Line -... Line 1023...
-
 
1023
        cmp     ecx, edx
952
        cmp     ecx, edx
1024
        jbe     .only_one_block
953
        jbe     .only_one_block
1025
 
954
 
1026
        mov     eax, ecx
Line 955... Line -...
955
        mov     eax, ecx
-
 
956
        sub     eax, edx
-
 
957
        mov     ecx, edx
-
 
958
 
1027
        sub     eax, edx
959
        mov     esi, ebx
1028
        mov     ecx, edx
960
        rep movsb                               ;RUS: кусок 1-го блока   ;ENG: part of 1st block
1029
 
961
        jmp     .calc_blocks_count
1030
        push    esi
962
 
1031
        mov     esi, ebx
963
    .zero_start:
1032
        rep movsb                               ;RUS: кусок 1-го блока   ;ENG: part of 1st block
964
        mov     eax, ecx
1033
        pop     esi
965
        push    0                               ;счетчик блоков ложим в стек
1034
 
966
        ;теперь в eax кол-во оставшихся байт для чтения
1035
        ;теперь в eax кол-во оставшихся байт для чтения
967
    .calc_blocks_count:
1036
    .calc_blocks_count:
Line 980... Line 1049...
980
 
1049
 
981
        mov     eax, ecx                        ;а ebx уже забит нужным значением
1050
        mov     eax, ecx                        ;а ebx уже забит нужным значением
982
        call    ext2_get_block
1051
        call    ext2_get_block
983
        test    eax, eax
1052
        test    eax, eax
984
        jnz     .error_at_read_cycle
1053
        jnz     .error_at_read_cycle
Line 985... Line 1054...
985
        add     ebx, [ext2_data.block_size]
1054
        add     ebx, [ebp+EXTFS.block_size]
986
 
1055
 
Line 987... Line 1056...
987
        dec     edi
1056
        dec     edi
Line 997... Line 1066...
997
        test    eax, eax
1066
        test    eax, eax
998
        jnz     .error_at_finish_block
1067
        jnz     .error_at_finish_block
Line 999... Line 1068...
999
 
1068
 
1000
        mov     edi, ebx
1069
        mov     edi, ebx
1001
        mov     eax, ecx
1070
        mov     eax, ecx
1002
        mov     ebx, [ext2_data.ext2_save_block]
1071
        mov     ebx, [ebp+EXTFS.ext2_save_block]
1003
        call    ext2_get_block
1072
        call    ext2_get_block
1004
        test    eax, eax
1073
        test    eax, eax
Line 1005... Line 1074...
1005
        jnz     .error_at_finish_block
1074
        jnz     .error_at_finish_block
Line 1011... Line 1080...
1011
 
1080
 
1012
    .end_read:
1081
    .end_read:
1013
        pop     ecx                             ;счетчик блоков, который хранился в стеке
1082
        pop     ecx                             ;счетчик блоков, который хранился в стеке
1014
    @@:
1083
    @@:
-
 
1084
        pop     ebx                             ;количество считанных байт
1015
        pop     ebx                             ;количество считанных байт
1085
        call    ext2_unlock
1016
        pop     eax                             ; 1 или 0 - достигли ли конца файла
1086
        pop     eax                             ; 1 или 0 - достигли ли конца файла
1017
        test    eax, eax
1087
        test    eax, eax
Line 1018... Line 1088...
1018
        jz      @F
1088
        jz      @F
Line 1033... Line 1103...
1033
   .error_at_read_cycle:
1103
   .error_at_read_cycle:
1034
        pop     ebx 
1104
        pop     ebx
1035
   .error_at_finish_block:
1105
   .error_at_finish_block:
1036
        pop     ecx edx
1106
        pop     ecx edx
1037
        or      ebx, -1
1107
        or      ebx, -1
-
 
1108
        push    eax
-
 
1109
        call    ext2_unlock
-
 
1110
        pop     eax
1038
        ret
1111
        ret
Line 1039... Line 1112...
1039
 
1112
 
1040
;----------------------------------------------------------------
1113
;----------------------------------------------------------------
1041
; in:  esi = file path
1114
; in:  esi = file path
-
 
1115
;      ebx = pointer to dir block
1042
;      ebx = pointer to dir block
1116
;      ebp = pointer to EXTFS structure
1043
; out: esi - name without parent or not_changed
1117
; out: esi - name without parent or not_changed
1044
;      ebx - dir_rec of inode children
1118
;      ebx - dir_rec of inode children
1045
ext2_test_block_by_name:
1119
ext2_test_block_by_name:
1046
        sub     esp, 256        ;EXT2_filename
1120
        sub     esp, 256        ;EXT2_filename
1047
        mov     edx, ebx
1121
        mov     edx, ebx
Line 1048... Line 1122...
1048
        add     edx, [ext2_data.block_size]   ;RUS: запомним конец блока   ;ENG: save block end
1122
        add     edx, [ebp+EXTFS.block_size]   ;RUS: запомним конец блока   ;ENG: save block end
1049
 
1123
 
1050
    .start_rec:
1124
    .start_rec:
Line 1095... Line 1169...
1095
        add     esp, 256 + 4
1169
        add     esp, 256 + 4
1096
        ret
1170
        ret
Line 1097... Line 1171...
1097
 
1171
 
1098
;========================
1172
;========================
1099
;Ищет inode по строке пути
1173
;Ищет inode по строке пути
-
 
1174
;in:  esi+[esp+4] = name
1100
;in:  esi = name
1175
;     ebp = pointer to EXTFS
1101
;out: eax - error code
1176
;out: eax - error code
1102
;     ebp = inode
1177
;     esi = inode
1103
;      dl - первый байт из имени файла/папки
1178
;      dl - первый байт из имени файла/папки
1104
ext2_find_lfn:
1179
ext2_find_lfn:
1105
        mov     ebp, [ext2_data.root_inode]
1180
        mov     edx, [ebp+EXTFS.root_inode]
1106
        cmp     [ebp + EXT2_INODE_STRUC.i_blocks], 0
1181
        cmp     [edx + EXT2_INODE_STRUC.i_blocks], 0
Line 1107... Line 1182...
1107
        je      .error_empty_root
1182
        je      .error_empty_root
1108
        
1183
        
1109
    .next_path_part:
1184
    .next_path_part:
1110
        push    [ebp + EXT2_INODE_STRUC.i_blocks]
1185
        push    [edx + EXT2_INODE_STRUC.i_blocks]
1111
        xor     ecx, ecx
1186
        xor     ecx, ecx
-
 
1187
    .folder_block_cycle:
1112
    .folder_block_cycle:
1188
        push    ecx
-
 
1189
        xchg    esi, edx
1113
        push    ecx
1190
        call    ext2_get_inode_block
1114
        call    ext2_get_inode_block
1191
        xchg    esi, edx
Line 1115... Line 1192...
1115
        test    eax, eax
1192
        test    eax, eax
1116
        jnz     .error_get_inode_block
1193
        jnz     .error_get_inode_block
1117
        
1194
        
1118
        mov     eax, ecx
1195
        mov     eax, ecx
1119
        mov     ebx, [ext2_data.ext2_save_block]        ;ebx = cur dir record
1196
        mov     ebx, [ebp+EXTFS.ext2_save_block]        ;ebx = cur dir record
Line 1120... Line 1197...
1120
        call    ext2_get_block
1197
        call    ext2_get_block
-
 
1198
        test    eax, eax
1121
        test    eax, eax
1199
        jnz     .error_get_block
-
 
1200
        
1122
        jnz     .error_get_block
1201
        push    esi
Line 1123... Line 1202...
1123
        
1202
        push    edx
1124
        push    esi
1203
        call    ext2_test_block_by_name
Line 1125... Line 1204...
1125
        call    ext2_test_block_by_name
1204
        pop     edx
1126
        pop     edi ecx
1205
        pop     edi ecx
-
 
1206
 
-
 
1207
        cmp     edi, esi             ;RUS: нашли имя?   ;ENG: did we find a name?
1127
 
1208
        je      .next_folder_block   ;RUS: не нашли -> к след. блоку   ;ENG: we didn't -> moving to next block
-
 
1209
        
-
 
1210
        cmp     byte [esi], 0   ;RUS: дошли до "конца" пути -> возваращаемся
-
 
1211
                                ;ENG: reached the "end" of path -> returning
Line 1128... Line 1212...
1128
        cmp     edi, esi             ;RUS: нашли имя?   ;ENG: did we find a name?
1212
        jnz     @f
1129
        je      .next_folder_block   ;RUS: не нашли -> к след. блоку   ;ENG: we didn't -> moving to next block
1213
        cmp     dword [esp+8], 0
Line 1130... Line 1214...
1130
        
1214
        jz      .get_inode_ret
1131
        cmp     byte [esi], 0   ;RUS: дошли до "конца" пути -> возваращаемся
1215
        mov     esi, [esp+8]
1132
                                ;ENG: reached the "end" of path -> returning
1216
        mov     dword [esp+8], 0
1133
        jz      .get_inode_ret
1217
    @@:
1134
 
1218
 
1135
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR   ;RUS: нашли, но это не папка
1219
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR   ;RUS: нашли, но это не папка
1136
        jne     .not_found                                      ;ENG: found, but it's not a folder
1220
        jne     .not_found                                      ;ENG: found, but it's not a folder
1137
 
1221
 
Line 1138... Line 1222...
1138
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
1222
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
1139
        mov     ebx, [ext2_data.ext2_save_inode]   ;RUS: все же папка.   ;ENG: it's a folder afterall
1223
        mov     ebx, [ebp+EXTFS.ext2_save_inode]   ;RUS: все же папка.   ;ENG: it's a folder afterall
1140
        call    ext2_get_inode
1224
        call    ext2_get_inode
1141
        test    eax, eax
1225
        test    eax, eax
1142
        jnz     .error_get_inode
1226
        jnz     .error_get_inode
Line 1143... Line 1227...
1143
        pop     ecx   ;RUS: в стеке лежит кол-во блоков   ;ENG: stack top contains number of blocks
1227
        pop     ecx   ;RUS: в стеке лежит кол-во блоков   ;ENG: stack top contains number of blocks
1144
        mov     ebp, ebx
1228
        mov     edx, ebx
1145
        jmp     .next_path_part
1229
        jmp     .next_path_part
Line 1146... Line 1230...
1146
        
1230
        
1147
    .next_folder_block:
1231
    .next_folder_block:
1148
        ;к следующему блоку в текущей папке
1232
        ;к следующему блоку в текущей папке
Line 1149... Line 1233...
1149
        pop     eax                ;RUS: счетчик блоков   ;ENG: blocks counter
1233
        pop     eax                ;RUS: счетчик блоков   ;ENG: blocks counter
1150
        sub     eax, [ext2_data.count_block_in_block]
1234
        sub     eax, [ebp+EXTFS.count_block_in_block]
1151
        jle     .not_found
1235
        jle     .not_found
1152
        
1236
        
1153
        push    eax
1237
        push    eax
1154
        inc     ecx
1238
        inc     ecx
1155
        jmp     .folder_block_cycle
1239
        jmp     .folder_block_cycle
1156
 
1240
 
1157
    .not_found:
1241
    .not_found:
Line 1158... Line 1242...
1158
        mov     eax, ERROR_FILE_NOT_FOUND
1242
        mov     eax, ERROR_FILE_NOT_FOUND
1159
        ret
1243
        ret     4
1160
 
1244
 
1161
    .get_inode_ret:
1245
    .get_inode_ret:
1162
        pop     ecx   ;RUS: в стеке лежит кол-во блоков   ;ENG: stack top contains number of blocks
1246
        pop     ecx   ;RUS: в стеке лежит кол-во блоков   ;ENG: stack top contains number of blocks
1163
        mov     dl, [ebx + EXT2_DIR_STRUC.name]   ;RUS: в dl - первый символ ()   ;ENG: ???
1247
        mov     dl, [ebx + EXT2_DIR_STRUC.name]   ;RUS: в dl - первый символ ()   ;ENG: ???
1164
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
1248
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
1165
        mov     ebx, [ext2_data.ext2_save_inode]
1249
        mov     ebx, [ebp+EXTFS.ext2_save_inode]
Line 1166... Line 1250...
1166
        call    ext2_get_inode
1250
        call    ext2_get_inode
1167
        mov     ebp, ebx
1251
        mov     esi, ebx
1168
        xor     eax, eax
-
 
-
 
1252
        xor     eax, eax
1169
        ret
1253
        ret     4
1170
 
1254
 
-
 
1255
    .error_get_inode_block:
1171
    .error_get_inode_block:
1256
    .error_get_block:
1172
    .error_get_block:
1257
        pop     ecx
-
 
1258
    .error_get_inode:
1173
        pop     ecx
1259
        pop     ebx
1174
    .error_get_inode:
1260
    .error_empty_root:
1175
        pop     ebx
1261
        mov     eax, ERROR_FS_FAIL
Line 1176... Line 1262...
1176
    .error_empty_root:
1262
        ret     4
1177
        mov     eax, ERROR_FS_FAIL
1263
 
1178
        ret
1264
;----------------------------------------------------------------
1179
 
1265
; ext2_GetFileInfo - EXT2 implementation of getting file info
1180
;----------------------------------------------------------------
1266
; in:  ebp = pointer to EXTFS structure
1181
;ext2_HdGetFileInfo - read file info from block device
1267
; in:  esi+[esp+4] = name
-
 
1268
; in:  ebx = pointer to parameters from sysfunc 70
-
 
1269
; out: eax, ebx = return values for sysfunc 70
-
 
1270
;----------------------------------------------------------------
1182
;
1271
ext2_GetFileInfo:
Line 1183... Line 1272...
1183
;in: esi  points to filename
1272
        call    ext2_lock
1184
;    edx  mem location to return data
1273
        mov     edx, [ebx+16]
1185
;--------------------------------------------------------------
1274
        cmp     byte [esi], 0
1186
ext2_HdGetFileInfo:
1275
        jz      .is_root
1187
        xchg    bx, bx
1276
 
1188
        cmp     byte [esi], 0
1277
        push    edx
1189
        jz      .is_root
1278
        stdcall ext2_find_lfn, [esp+4+4]
1190
 
1279
        mov     ebx, edx
Line 1208... Line 1297...
1208
        cmp     bl, '.'
1297
        cmp     bl, '.'
1209
        jne     @F
1298
        jne     @F
1210
        or      dword [edx], FS_FT_HIDDEN
1299
        or      dword [edx], FS_FT_HIDDEN
1211
    @@:
1300
    @@:
Line 1212... Line 1301...
1212
 
1301
 
1213
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
1302
        test    [esi + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
1214
        jnz     @F
1303
        jnz     @F
1215
        mov     eax, [ebp + EXT2_INODE_STRUC.i_size]            ;low size
1304
        mov     eax, [esi + EXT2_INODE_STRUC.i_size]            ;low size
1216
        mov     ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl]         ;high size
1305
        mov     ebx, [esi + EXT2_INODE_STRUC.i_dir_acl]         ;high size
1217
        mov     dword [edx+32], eax
1306
        mov     dword [edx+32], eax
1218
        mov     dword [edx+36], ebx
1307
        mov     dword [edx+36], ebx
1219
        xor     dword [edx], FS_FT_DIR
1308
        xor     dword [edx], FS_FT_DIR
1220
    @@:
1309
    @@:
Line 1221... Line 1310...
1221
        xor     dword [edx], FS_FT_DIR
1310
        xor     dword [edx], FS_FT_DIR
1222
 
1311
 
1223
        lea     edi, [edx + 8]
1312
        lea     edi, [edx + 8]
1224
        mov     eax, [ebp + EXT2_INODE_STRUC.i_ctime]
1313
        mov     eax, [esi + EXT2_INODE_STRUC.i_ctime]
1225
        xor     edx, edx
1314
        xor     edx, edx
1226
        add     eax, 3054539008
1315
        add     eax, 3054539008
Line 1227... Line 1316...
1227
        adc     edx, 2
1316
        adc     edx, 2
1228
        call    ntfs_datetime_to_bdfe.sec
1317
        call    ntfs_datetime_to_bdfe.sec
1229
 
1318
 
1230
        mov     eax, [ebp + EXT2_INODE_STRUC.i_atime]
1319
        mov     eax, [esi + EXT2_INODE_STRUC.i_atime]
1231
        xor     edx, edx
1320
        xor     edx, edx
Line 1232... Line 1321...
1232
        add     eax, 3054539008
1321
        add     eax, 3054539008
1233
        adc     edx, 2
1322
        adc     edx, 2
1234
        call    ntfs_datetime_to_bdfe.sec
1323
        call    ntfs_datetime_to_bdfe.sec
1235
 
1324
 
1236
        mov     eax, [ebp + EXT2_INODE_STRUC.i_mtime]
1325
        mov     eax, [esi + EXT2_INODE_STRUC.i_mtime]
Line -... Line 1326...
-
 
1326
        xor     edx, edx
1237
        xor     edx, edx
1327
        add     eax, 3054539008
1238
        add     eax, 3054539008
1328
        adc     edx, 2
Line 1239... Line 1329...
1239
        adc     edx, 2
1329
        call    ntfs_datetime_to_bdfe.sec
1240
        call    ntfs_datetime_to_bdfe.sec
1330
 
1241
 
1331
        call    ext2_unlock
1242
        xor     eax, eax
1332
        xor     eax, eax
1243
        ret
1333
        ret
1244
 
1334
 
1245
ext2_HdRewrite:
1335
ext2_Rewrite:
1246
ext2_HdWrite:
1336
ext2_Write:
1247
ext2_HdSetFileEnd:
1337
ext2_SetFileEnd: