tablica portów.

0

Właściwie równie dobrze mozna to umieścić w większości działów...

Kilkakrotnie na forum pojawiały sie pytania odnośnie portów com i lpt..
O co mi chodzi... [???]

W trybie rzeczywistym procka pod adresem 0040:0000 (bios) znajdują się następujące struktury:

0040:0000 com_base DW 4 dup (?)   ; zapis hex
0040:0008 lpt_base DW 4 dup (?)

Są to numery portów szeregowych (np. 2f8h/378h/3f8h/...) i równoległych (odpowiednio). Rzeczywistych sprzętowych. Dla nie znających assemblera: dwie tablice po 4 wordy/unsignedy z rzędu.

Pytanie moje jest takie. Jak uzyskać odpowiednik tego adresu pod łinzgrozą, jak dobrać sie do tych struktur? Lub też czy istnieje funkcja, która zwraca adres portu com i lpt w zalezności od numerka portu? Lub też czy istnieje jakis mechanizm deskryptorów czy innych podpórek pozwalajacych na dostęp do pamięci wg. adresowania trybu rzeczywistego?

Jeżeli to komus coś podpowie i pomoze w znalezieniu odpowiedzi, to w trybie rzeczywistym szyna adresowa ma 20 bitów, a więc adres 0040:0000 jest odpowiedikiem 0000:0400 (będzie równiez działać). A adres liniowy to 000400 (16*segment+offset - 20 bitów)

TIA !

// zapomniałem dopisać API, only API,
// a język jest bez znaczenia.

// Nikt sie nie połapał w moim byku: 24 bity
// 16*segment+offset to przecież tylko 20 bitów.
// stąd dos to tylko 1 MB (2^20). hehe.

0

Pobieżnie przejrzałem SDK i nic :( Pewnie takich informacji należałoby szukać w DDK (niestety za cienki jestem na to, by się w tym rozeznać).
A tak w ogóle, to po co Ci jest nr tych portów, skoro pod Windowsem i tak w najlepszym wypadku informacje, które na port wyślesz zostaną przekierowane (np. denerwujace przekierowanie z lpt najpierw do bufora drukarki :( )

0

Potrzebuję właśnie te dane zawarte w tabliicach. Czyli numery portów. Przeglądałem rejestr, ale tam opis comów i lptków nie zawiera tych informacji.

Do czego tego potrzebuję? Ano do automatyki. Do sterowania. Do detekcji urządzeń. Do komunikacji w obie strony. Przyzwyczajenie z dos'a, gdzie do wszystkiego był dostęp niemal bezpośredni. Jeżeli jest inny sposób, to trudno, najważniejsze aby spod api, bo nie chcę instalować komponentów. Bo program ma być mały, a nie wielkości majkrosowtowego ofisa (tm).

Chodzi mi o dostęp do portów poprzez asmowe in/out. poza tym in niżej tym szybciej i mniej szans na łinzgrozowe bugi

0

Chodzi mi o dostęp do portów poprzez asmowe in/out. poza tym in niżej tym szybciej i mniej szans na łinzgrozowe bugi

Święta racja, ale pod NT to raczej jest niemożliwe. Nawet dosowe programy w rzeczywistości nie odwołują się do portów, a są jedynie przekierowywane.
A dostęp jest, przez funkcje API. W DDK było tam kilka opisanych (do tworzenia portów i tego typu). Niestety DDK na kompie nie mam, jedynie on-line, więc szukać nie bardzo mi się chce. Możnaby przejrzeć źródła tych komponentów, które obsługują dostęp do portów. Nie trzeba ich instalować, ale na pewno WinAPI wykorzystują.

0

Dzięki. A dlaczego w ogóle zacząłeś ze mną dyskutować? Nie mogłeś mnie opieprzyć i od razu desłać do dałnlołda? Przez ta dyskusję wpadłem na pomysł skanowania całej pamięci i byłem juz na etapie omijania 'access violation'. :-8

W sumie przydałaby się w dałnlołdzie jakaś wyszukwarka.

0

Nie mogłeś mnie opieprzyć ...

Bo nie pytałeś o głupoty ani podstawy zawarte w każdym kursie.

W sumie przydałaby się w dałnlołdzie jakaś wyszukwarka.

Trzeba zgłosić do TODO w coyote (o ile już nie ma).

0

Ciekawa "spława" z tablicą adresów. Gdy bawiłem się debuggerem, podczas podświetlania linijki z poleceniem przepisującym wartość komórki pamięci (zawierającej adres potu LPT1), debugger wyświetlał co w niej siedzi - prawidłowy adres portu. Gdy polecenie zostało wykonane, natychmiast wyskoczył komunikat "Acces Violation" (win98).

Podsumowując - adresy z pamięci można czytać pod windą, ale nie z trzeciopoziomowej aplikacji. Pobaw się jakimś dodatkiem typu "WinIO". Nie powinien mieć z tym problemów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1