Subversion Repositories Kolibri OS

Rev

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

Rev 2455 Rev 2643
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2011-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2011-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 2455 $
8
$Revision: 2643 $
9
 
9
 
10
; =============================================================================
10
; =============================================================================
11
; ================================= Constants =================================
11
; ================================= Constants =================================
Line 348... Line 348...
348
        xor     eax, eax        ; the argument of malloc() is in eax
348
        xor     eax, eax        ; the argument of malloc() is in eax
349
@@:
349
@@:
350
        inc     eax
350
        inc     eax
351
        cmp     byte [ebx+eax-1], 0
351
        cmp     byte [ebx+eax-1], 0
352
        jnz     @b
352
        jnz     @b
353
; 2b. Call the heap manager.
353
; 2b. Call the heap manager. Note that it can change ebx.
-
 
354
        push    ebx
354
        call    malloc
355
        call    malloc
-
 
356
        pop     ebx
355
; 2c. Check the result. If allocation failed, go to 7.
357
; 2c. Check the result. If allocation failed, go to 7.
356
        pop     esi             ; restore allocated pointer to DISK
358
        pop     esi             ; restore allocated pointer to DISK
357
        test    eax, eax
359
        test    eax, eax
358
        jz      .free
360
        jz      .free
359
; 2d. Store the allocated pointer to the DISK structure.
361
; 2d. Store the allocated pointer to the DISK structure.
Line 416... Line 418...
416
; Return value: none.
418
; Return value: none.
417
disk_del:
419
disk_del:
418
        push    esi         ; save used registers to be stdcall
420
        push    esi         ; save used registers to be stdcall
419
; 1. Force media to be removed. If the media is already removed, the
421
; 1. Force media to be removed. If the media is already removed, the
420
; call does nothing.
422
; call does nothing.
421
        mov     esi, [esp+4+8]  ; esi = handle of the disk
423
        mov     esi, [esp+4+4]  ; esi = handle of the disk
422
        stdcall disk_media_changed, esi, 0
424
        stdcall disk_media_changed, esi, 0
423
; 2. Delete the structure from the global list.
425
; 2. Delete the structure from the global list.
424
; 2a. Acquire the mutex.
426
; 2a. Acquire the mutex.
425
        mov     ecx, disk_list_mutex
427
        mov     ecx, disk_list_mutex
426
        call    mutex_lock
428
        call    mutex_lock
Line 973... Line 975...
973
; and [ebp+4]=return address.
975
; and [ebp+4]=return address.
974
virtual at ebp+8
976
virtual at ebp+8
975
.start  dq      ?
977
.start  dq      ?
976
.length dq      ?
978
.length dq      ?
977
end virtual
979
end virtual
-
 
980
; When disk_add_partition is called, ebx contains a pointer to
-
 
981
; a two-sectors-sized buffer. This function saves ebx in the stack
-
 
982
; immediately before ebp.
-
 
983
virtual at ebp-4
-
 
984
.buffer dd      ?
-
 
985
end virtual
-
 
986
; 1. Read the bootsector to the buffer.
-
 
987
        mov     al, DISKFUNC.read
-
 
988
        mov     ebx, [.buffer]
-
 
989
        add     ebx, 512
-
 
990
        push    1
-
 
991
        stdcall disk_call_driver, ebx, dword [.start], dword [.start+4], esp
-
 
992
; 2. Run tests for all supported filesystems. If at least one test succeeded,
-
 
993
; go to 4.
-
 
994
; For tests: qword [ebp+8] = partition start, qword [ebp+10h] = partition
-
 
995
; length, [esp] = 0 if reading bootsector failed or 1 if succeeded,
-
 
996
; ebx points to the buffer for bootsector.
-
 
997
        call    fat_create_partition
-
 
998
        test    eax, eax
-
 
999
        jnz     .success
978
; Currently no file systems are supported, so just allocate the PARTITION
1000
; 3. No file system has recognized the volume, so just allocate the PARTITION
979
; structure without extra fields.
1001
; structure without extra fields.
980
; 1. Allocate and check result.
-
 
981
        push    sizeof.PARTITION
1002
        push    sizeof.PARTITION
982
        pop     eax
1003
        pop     eax
983
        call    malloc
1004
        call    malloc
984
        test    eax, eax
1005
        test    eax, eax
985
        jz      .nothing
1006
        jz      .nothing
986
; 2. Fill the common fields: copy .start and .length.
-
 
987
        mov     edx, dword [.start]
1007
        mov     edx, dword [.start]
988
        mov     dword [eax+PARTITION.FirstSector], edx
1008
        mov     dword [eax+PARTITION.FirstSector], edx
989
        mov     edx, dword [.start+4]
1009
        mov     edx, dword [.start+4]
990
        mov     dword [eax+PARTITION.FirstSector+4], edx
1010
        mov     dword [eax+PARTITION.FirstSector+4], edx
991
        mov     edx, dword [.length]
1011
        mov     edx, dword [.length]
992
        mov     dword [eax+PARTITION.Length], edx
1012
        mov     dword [eax+PARTITION.Length], edx
993
        mov     edx, dword [.length+4]
1013
        mov     edx, dword [.length+4]
994
        mov     dword [eax+PARTITION.Length+4], edx
1014
        mov     dword [eax+PARTITION.Length+4], edx
-
 
1015
        mov     [eax+PARTITION.Disk], esi
-
 
1016
        and     [eax+PARTITION.FSUserFunctions], 0
-
 
1017
.success:
995
.nothing:
1018
.nothing:
996
; 3. Return with eax = pointer to PARTITION or NULL.
1019
; 4. Return with eax = pointer to PARTITION or NULL.
-
 
1020
        pop     ecx
997
        ret
1021
        ret
Line 998... Line 1022...
998
 
1022
 
999
; This function is called from file_system_lfn.
1023
; This function is called from file_system_lfn.
1000
; This handler gets the control each time when fn 70 is called
1024
; This handler gets the control each time when fn 70 is called
Line 1059... Line 1083...
1059
; 5. Reference the disk.
1083
; 5. Reference the disk.
1060
        lock inc [ebx+DISK.RefCount]
1084
        lock inc [ebx+DISK.RefCount]
1061
; 6. Now we are sure that the DISK structure is not going to die at least
1085
; 6. Now we are sure that the DISK structure is not going to die at least
1062
; while we are working with it, so release the global mutex.
1086
; while we are working with it, so release the global mutex.
1063
        call    mutex_unlock
1087
        call    mutex_unlock
-
 
1088
        pop     ecx             ; pop from the stack saved value of esi
1064
; 7. Acquire the mutex for media object.
1089
; 7. Acquire the mutex for media object.
1065
        pop     edi             ; restore edi
1090
        pop     edi             ; restore edi
1066
        lea     ecx, [ebx+DISK.MediaLock]
1091
        lea     ecx, [ebx+DISK.MediaLock]
1067
        call    mutex_lock
1092
        call    mutex_lock
1068
; 8. Get the media object. If it is not NULL, reference it.
1093
; 8. Get the media object. If it is not NULL, reference it.
Line 1173... Line 1198...
1173
        test    eax, eax
1198
        test    eax, eax
1174
        jz      .nomedia
1199
        jz      .nomedia
1175
.main:
1200
.main:
1176
        cmp     ecx, [edx+DISK.NumPartitions]
1201
        cmp     ecx, [edx+DISK.NumPartitions]
1177
        jae     .notfound
1202
        jae     .notfound
-
 
1203
        mov     eax, [edx+DISK.Partitions]
-
 
1204
        mov     eax, [eax+ecx*4]
-
 
1205
        mov     edi, [eax+PARTITION.FSUserFunctions]
-
 
1206
        test    edi, edi
-
 
1207
        jz      .nofs
-
 
1208
        mov     ecx, [ebx]
-
 
1209
        cmp     [edi], ecx
-
 
1210
        jbe     .unsupported
-
 
1211
        push    edx
-
 
1212
        push    ebp
-
 
1213
        mov     ebp, eax
-
 
1214
        call    dword [edi+4+ecx*4]
-
 
1215
        pop     ebp
-
 
1216
        pop     edx
1178
        mov     dword [esp+32], ERROR_UNKNOWN_FS
1217
        mov     dword [esp+32], eax
-
 
1218
        mov     dword [esp+20], ebx
1179
.cleanup:
1219
.cleanup:
1180
        mov     esi, edx
1220
        mov     esi, edx
1181
        call    disk_media_dereference
1221
        call    disk_media_dereference
1182
        call    disk_dereference
1222
        call    disk_dereference
1183
        ret
1223
        ret
-
 
1224
.nofs:
-
 
1225
        mov     dword [esp+32], ERROR_UNKNOWN_FS
-
 
1226
        jmp     .cleanup
1184
.notfound:
1227
.notfound:
1185
        mov     dword [esp+32], ERROR_FILE_NOT_FOUND
1228
        mov     dword [esp+32], ERROR_FILE_NOT_FOUND
1186
        jmp     .cleanup
1229
        jmp     .cleanup
-
 
1230
.unsupported:
-
 
1231
        mov     dword [esp+32], ERROR_UNSUPPORTED_FS
-
 
1232
        jmp     .cleanup
1187
.nomedia:
1233
.nomedia:
1188
        test    ecx, ecx
1234
        test    ecx, ecx
1189
        jnz     .notfound
1235
        jnz     .notfound
1190
        test    byte [edx+DISK.DriverFlags], DISK_NO_INSERT_NOTIFICATION
1236
        test    byte [edx+DISK.DriverFlags], DISK_NO_INSERT_NOTIFICATION
1191
        jz      .deverror
1237
        jz      .deverror
1192
; if the driver does not support insert notifications and we are the only fs
1238
; if the driver does not support insert notifications and we are the only fs
1193
; operation with this disk, issue the fake insert notification; if media is
1239
; operation with this disk, issue the fake insert notification; if media is
1194
; still not inserted, 'disk_media_changed' will detect this and do nothing
1240
; still not inserted, 'disk_media_changed' will detect this and do nothing
1195
;;;        push    ebx
-
 
1196
        lea     ecx, [edx+DISK.MediaLock]
1241
        lea     ecx, [edx+DISK.MediaLock]
1197
        call    mutex_lock
1242
        call    mutex_lock
1198
        cmp     [edx+DISK.MediaRefCount], 1
1243
        cmp     [edx+DISK.MediaRefCount], 1
1199
        jnz     .noluck
1244
        jnz     .noluck
1200
        call    mutex_unlock
1245
        call    mutex_unlock