[#1] Jak odczytać listę urządzeń systemowych?
Do napisania FileRequester'a potrzebuje pobrać listę urządzeń DF0:,DF1:,DH0: itd.
Informacje takie zwraca np. polecenie: assign

Jak to odczytać z systemu?
[#2] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #1

Execbase->DeviceList, sprawdzać dl_Type.
[#3] Re: Jak odczytać listę urządzeń systemowych?

@cholok, post #2

Po disassemblacji "arp.library" widze ,że poza polem "dl_Type" struktury "DeviceList" sprawdzane jest przed samym pobraniem nazwy Device'a dodatkowo pole "dl_Task" na
wartość zerową?? Czy jest to konieczne i jakie znaczenie ma to pole? Ponadto samo wskazanie struktury "DeviceList" uzyskują tam w dziwnie pokrętny sposób poprzez
strukturę "DosLibrary" czy to ma jakieś znaczenie dla kompatybilności z innymi systemami?

Ile maksymalnie znaków może liczyć nazwa Device'a???

Ostatnia modyfikacja: 25.06.2009 08:17:24



Ostatnia modyfikacja: 25.06.2009 08:35:43
[#4] Re: Jak odczytać listę urządzeń systemowych?

@cholok, post #2

Nie za bardzo, bo Execbase->DeviceList jest prywatne. Znaczy się, nie można się odwoływać do prywatnych pól.



Ostatnia modyfikacja: 25.06.2009 11:15:21



Ostatnia modyfikacja: 25.06.2009 11:15:34
[#5] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #3

Mógłbyś dokładniej opisać jak arp.library dostaje się do DeviceList. DosLibrary a potem ???

[#6] Re: Jak odczytać listę urządzeń systemowych?

@asman, post #5

asman napisał(a):

> Mógłbyś dokładniej opisać jak arp.library dostaje się do
> DeviceList. DosLibrary a potem ???
>
>

Troszkę kodu wyprułem z arp.library aby napisać gotową działającą procedure.

Przesyłam cały działający przykład testowy.

Ta część do pobrania adresu struktury (DeviceList) jest skopiowana z filerequestera w arp.library widać wyraźnie pobieranie struktur.......

Dalej mam jednak problem z rozmiarem bufora na tekst.
Ustawiłem 255 bajtów na zapas w arp.lib. przydzielają
wielki bufor do jeszcze kilku zastosowań.
Chciałbym dokładnie wiedzieć ile maksymalnie znaków może mieć nazwa urządzenia w AmigaOS ?????

Teraz jeszcze potrzebuje dwie informacje jakoś nie ma ich w RKM...
1).Jaka może być maksymalna długość nazwy pliku w 1.3 i nowszych???
2).Jaki maksymalny rozmiar może mieć ścieżka dojscia do pliku bez jego nazwy w AmigaOS????

Niby proste pytania a czy ktoś zna odpowiedzi????

w arp.library przewidzieli na to po:
FILEMEM: DS.B 33 ;bajty
DIRMEM: DS.B 34 ;bajty
ale to nie jest chyba to co potrafi AmigaOS???



Pozdrawiam




;-----------------------------------------------------------------------
;CPU: MC68000
;Assembler: DevPac v3.02
;Platforma: Amiga 500/OS 1.3/Kickstart(v34)

OldOpenLibrary: equ -408
CloseLibrary: equ -414
Output: equ -60
Write: equ -48


Start: move.l 4.w,a6
move.l #DosName,a1
jsr OldOpenLibrary(a6)
move.l d0,DosBase
beq.s Koniec

move.l d0,a6
jsr Output(a6)
move.l d0,CliHandle
beq.s Koniec

move.l CliHandle,d1
move.l #txt_001,d2
move.l d2,a0
bsr LengthText ;rozmiar tekstu
move.l DosBase,a6
jsr Write(a6)


Loop_PP_00: bsr ReadDeviceList
move.l CliHandle,d1
move.l #RDL_Bufor,d2
move.l d2,a0
bsr LengthText ;rozmiar tekstu
move.l DosBase,a6
jsr Write(a6)
tst.l RDL_Index
bne.s Loop_PP_00



move.l 4.w,a6
move.l DosBase,a1
jsr CloseLibrary(a6)
moveq #0,d0
Koniec: rts

;WEJSCIE: A0 = Adres początku ciągu znaków ASCII zakonczonego bajtem o wartości $0.
;WYJSCIE: D0 = Zwracany jest rozmiar tekstu w bajtach znacznik końca $0 nie wliczany.

LengthText: moveq #0,d3
LT_PP: cmp.b #0,(a0)+ ;sprawdzamy znacznik końca tekstu = 0
beq.s LT_End
addq #1,d3
bra.s LT_PP
LT_End: rts

LengthLine: moveq #0,d3
LL_PP: cmp.b #$A,(a0)+ ;sprawdzamy znacznik końca lini = $A
beq.s LL_End
addq #1,d3
bra.s LL_PP
LL_End: rts

DosName: dc.b 'dos.library',0
DosBase: dc.l 0
CliHandle: dc.l 0
txt_001: dc.b 'System Device List.',$A,0




;--------------------------------------------------------------------
;Funkcja ReadDeviceList() odczytuje do bufora (RDL_Bufor) pojedyńczą
;nazwę urządzenia typu Device.Jednorazowe wywołanie tej funkcji z
;wyzerowanym polem (RDL_Index) spowoduje odczytanie do (RDL_Bufor)
;nazwy pierwszego istniejącego urządzenia Device w systemie.
;W buforze (RDL_Bufor) znajdzie się nazwa ASCII zakończona bajtem 0.
;Po jej odczytaniu pole (RDL_Index) nie jest już zerowe i zawiera
;index potrzebny do odczytu kolejnej nazwy urządzenia Device. Nazwa
;ta trafi do bufora (RDL_Bufor) podczas kolejnego wywołania funkcji.
;Po wielokrotnym wywołaniu funkcji ReadDeviceList() i odczytaniu
;przez nią kolejno wszystkich nazw po ostatniej nazwie na liście
;funkcja ReadDeviceList() automatycznie wyzeruje pole (RDL_Index).
;Zawartość pola (RDL_Index) mamy po powrocie z funkcji w rej.D0 a
;rej.A0 wskazuje początek bufora z tekstem.

;WEJSCIE: Ewentualne wyzerowanie pola wskaźnika (RDL_Index).
; oznaczające przeszukiwanie listy od początku....
;
;WYJSCIE: A0 = Adres początku bufora zakończonego bajtem 0
; z nazwą ASCII aktualnie kolejnego Device'a.
; D0 = Jeśli rej. D0 = 0 to był ostatni z listy.

dl_Root = 34 ;struktura (DosLibrary)
rn_Info = 24 ;struktura (RootNode)
di_DevInfo = 4 ;struktura (DosInfo)
dl_Task = 8 ;struktura (DeviceList)
dl_Name = 40 ;struktura (DeviceList)
dl_Type = 4 ;struktura (DeviceList)

DLT_DEVICE EQU 0
DLT_DIRECTORY EQU 1
DLT_VOLUME EQU 2


ReadDeviceList: movem.l a1/a2,-(sp)
move.l RDL_Index,a2
tst.l RDL_Index
bne.s RDL_PP_04
move.l DosBase,a2
move.l dl_Root(a2),a2
move.l rn_Info(a2),a2
add.l a2,a2
add.l a2,a2
move.l di_DevInfo(a2),a2
add.l a2,a2
add.l a2,a2 ;teraz a rej. A2 mamy adres struktury (DeviceList).
RDL_PP_04: moveq #0,d0
cmp.l #DLT_DEVICE,dl_Type(a2)
bne.s RDL_PP_03
tst.l dl_Task(a2)
beq.s RDL_PP_03
move.l dl_Name(a2),a1
add.l a1,a1
add.l a1,a1
move.b (a1)+,d0
subq.l #1,d0
move.l #RDL_Bufor,a0
RDL_PP_02: move.b (a1)+,(a0)+
dbra d0,RDL_PP_02
move.b #":",(a0)+
clr.b (a0) ;wstawiamy znacznik końca tekstu.
RDL_PP_03: move.l (a2),a2
add.l a2,a2
add.l a2,a2
tst.l d0
beq.s RDL_PP_04
move.l a2,RDL_Index ;zapisujemy kolejną strukturę (DeviceList).
move.l #RDL_Bufor,a0
move.l a2,d0 ;jeśli D0 = 0 to był ostani Device z listy.
movem.l (sp)+,a1/a2
rts

RDL_Index: DC.L 0
RDL_Bufor: DS.B 255
;--------------------------------------------------------------------



Ostatnia modyfikacja: 25.06.2009 13:32:51
[#7] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #6

Dzięki za przykład.

Chciałbym dokładnie wiedzieć ile maksymalnie znaków może mieć nazwa urządzenia w AmigaOS ?????

Nie wiem. Można zapytać na EAB.


1).Jaka może być maksymalna długość nazwy pliku w 1.3 i nowszych???
2).Jaki maksymalny rozmiar może mieć ścieżka dojscia do pliku bez jego nazwy w AmigaOS????


Jeśli chodzi o pierwsze pytanie to z tego co pamiętam długość nazwy pliku zależy od systemu plików. W OFS to chyba było 33 znaki jak dobrze pamiętam ( dla przykładu w PFS to było 107 znaków ).
A jeśli chodzi o 2 pytanie to chyba nie ma limitu.

Jak dobrze rozumiem chciałbyś ustalić maksymalny bufor na nazwy. Można w pewien sposób ominąć ten problem. Skoro chcesz pobrać nazwy urządzeń i wiesz jak to zrobić to także możesz się dowiedzieć ile taka nazwa zajmuje znaków i bufor przydzielić dynamicznie. to z pewnością rozwiąże problem ale też skomplikuje program. Można też z góry przydzielić bufor ( powiedzmy 4096 bajtów ) i sprawdzać czy się nie przepełni.

Pozdrawiam

[#8] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #6

Wersja z arp jest poprawniejsza, znaczy się zgodna z RKM.
dl_task zawiera wskaźnik do handlera, a więc pozwoli to na filtrowanie urządzeń typu CON,RAW,SER itp.
W OFS/FFS nazwy plików mają maksymalnie 30 znaków, ale w strukturach DOSu jest miejsce na 108 znaków. Nazwa urządzenia jest BSTR, a więc w teorii max 255 znaków.
Nie ma także ograniczenia zagłębiania się katalogów, więc makysmalna długość ściężki jest nieustalona.
[#9] Re: Jak odczytać listę urządzeń systemowych?

@cholok, post #8

Właśnie próbowałem napisać to samo tylko w oparciu o strukturę (DeviceList) zawartą w (ExecBase).Wygląda na to ,że obie struktury (DeviceList) ta z ExecBase i DosBase to nie to samo… właściwie obie zawierają coś innego. Znana mi z RKM struktura (DeviceList) ma rozmiar 44 bajtów a ta z ExecBase obejmuje rozmiar 14 bajtów. Wpierw pomyślałem ,że ExecBase zawiera tylko wskaźnik … ale jeśli tak to jego format nie jest do zidentfikowania ….

Tak czy inaczej mam już działający kod…. więc innym zainteresowanym pozostawiam dalsze testy.

Dzięki wszystkim za pomoc..
Pozdrawiam
[#10] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #9

Sorry za wprowadzenie w błąd, DeviceList zawiera listę "deviców", ale tych z katalogu devs.
[#11] Re: Jak odczytać listę urządzeń systemowych?

@cholok, post #10

Nic nie szkodzi przynajmniej poznałem kolejną strukturę ;)


Przetestowałem w praktyce max.rozmiar nazwy pliku faktycznie 108 bo 255 nie da rady...
ciekawe na czym polega ograniczenie. Bardziej logiczne powinno byc do 128 znaków.
[#12] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #11

108 znaków wynika z rozmiaru struktury fib_Filename.
[#13] Re: Jak odczytać listę urządzeń systemowych?

@asman, post #7

Opis Amiga DOS w systemach 1.3/2.0/3.1 zawiera komunikat zwracany przez funkcję IoErr() z numerem 217 -> ERROR_TOO_MANY_LEVELS .Napisali w RKM tak: zbyt głębokie zagnieżdżenie katalogów!!!

Czyli ograniczeniem nie jest pojemność nośnika a ustalona wartość graniczna??
[#14] Re: Jak odczytać listę urządzeń systemowych?

@68k_tester, post #13

W AmigaDOS manual pisze o limicie soft linków, a nie zgnieżdżaniu katalogoów.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem