From b27bd68162747cac73a501157bafbb00b4c603b7 Mon Sep 17 00:00:00 2001 From: pathoswithin Date: Mon, 6 Mar 2017 13:45:37 +0000 Subject: [PATCH] sysfunction 70.5: get device size git-svn-id: svn://kolibrios.org@6875 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/blkdev/disk.inc | 10 ++------ kernel/trunk/docs/sysfuncr.txt | 2 +- kernel/trunk/docs/sysfuncs.txt | 4 +-- kernel/trunk/fs/fs_lfn.inc | 47 ++++++++++++++++++++++++++-------- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/kernel/trunk/blkdev/disk.inc b/kernel/trunk/blkdev/disk.inc index 0101544ecb..57b8da399d 100644 --- a/kernel/trunk/blkdev/disk.inc +++ b/kernel/trunk/blkdev/disk.inc @@ -1379,18 +1379,12 @@ dyndisk_handler: cmp byte [esi], 0 jnz .haspartition ; 11. The fs operation wants to enumerate partitions. -; 11a. Only "list directory" operation is applicable to / path. Check -; the operation code. If wrong, go to 13. - cmp dword [ebx], 1 - jnz .access_denied -; 11b. If the media is inserted, use 'fs_dyndisk_next' as an enumeration -; procedure. Otherwise, use 'fs_dyndisk_next_nomedia'. +; Check whether the media is inserted. mov esi, fs_dyndisk_next_nomedia test edx, edx jz @f mov esi, fs_dyndisk_next -@@: -; 11c. Let the procedure from fs_lfn.inc do the job. +@@: ; Let the procedure from fs_lfn.inc do the job. jmp file_system_lfn.maindir_noesi .root: diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index c2b4af4da2..430128ce33 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -4231,7 +4231,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); но без имени файла, за исключением корневого каталога. Замечания: * Для корневого каталога возвращается размер и имя раздела. - * Функция не поддерживает виртуальные папки типа / и /rd. + * Для устройства возвращается только размер. ---------------------- Константы для регистров: ---------------------- eax - SF_FILE (70) diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index b262ea7cd7..5b2a8b248e 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -4186,8 +4186,8 @@ Information on file is returned in the BDFE format (block of data for folder entry), explained in the description of subfunction 1, but without filename, except the root folder. Remarks: - * For the root folder returns size and name of partition. - * The function does not support virtual folders such as / and /rd. + * For the root folder returns the size and the volume label. + * For the device returns only the size. ---------------------- Constants for registers: ---------------------- eax - SF_FILE (70) diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index 81f0608e18..2f88fdd624 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -148,28 +148,32 @@ file_system_lfn: .nextCD: test eax, eax ; partition number - stc - jnz @f ; no more partitions - mov al, 1 ; /cdX/1 - clc + jnz @f + inc eax ; /cdX/1 + ret + @@: + stc ret .maindir: ; list partitions mov esi, .nextCD + xor ecx, ecx .maindir_noesi: ; backjump from dyndisk_handler push ebp mov ebp, ecx call kernel_free - cmp dword[ebx], 1 - jnz .access_denied ; read folder? + mov edi, [ebx+16] ; buffer + cmp byte [ebx], 5 + jz .deviceInfo + cmp byte [ebx], 1 ; read folder? + jnz .access_denied push ebp pushd [ebx+4] ; first block mov ebp, [ebx+12] ; the number of blocks to read - mov edx, [ebx+16] ; buffer mov ebx, [ebx+8] ; flags mov ecx, 32/4 - mov edi, edx + mov edx, edi xor eax, eax rep stosd mov byte [edx], 1 ; version @@ -200,7 +204,7 @@ file_system_lfn: push edx test eax, eax jnz @b - cmp ebx, 1 + cmp ebx, 2 jz .uni @@: pop eax @@ -209,6 +213,8 @@ file_system_lfn: test eax, eax jnz @b pop edi edx eax + cmp ebx, 3 + jz @f add edi, 264 jmp .maindir_loop @@ -219,6 +225,7 @@ file_system_lfn: test eax, eax jnz .uni pop edi edx eax +@@: add edi, 520 jmp .maindir_loop @@ -238,8 +245,23 @@ file_system_lfn: mov dword[image_of_eax], ERROR_ACCESS_DENIED ret +.deviceInfo: + test ebp, ebp + jz @f + mov eax, dword[ebp+DISK.MediaInfo.Capacity] + mov edx, dword[ebp+DISK.MediaInfo.Capacity+4] + shld edx, eax, 9 + shl eax, 9 + mov [edi+36], edx + mov [edi+32], eax +@@: + and dword[image_of_eax], 0 + ret + .rootdir: ; / - virtual root folder - cmp dword[ebx], 1 ; read folder? + cmp byte [ebx], 5 + jz @b + cmp byte [ebx], 1 ; read folder? jnz .access_denied mov ebp, [ebx+12] ; number of blocks mov edx, [ebx+16] ; return area @@ -273,7 +295,7 @@ file_system_lfn: rep stosd push edi lea esi, [esp+8] - cmp ebx, 1 + cmp ebx, 2 jz .uni2 @@: lodsb @@ -281,6 +303,8 @@ file_system_lfn: test eax, eax jnz @b pop edi eax + cmp ebx, 3 + jz @f add edi, 264 jmp .rootdir_loop @@ -290,6 +314,7 @@ file_system_lfn: test eax, eax jnz .uni2 pop edi eax +@@: add edi, 520 jmp .rootdir_loop