+-------------------------+ | Služby IPX-SPX rozhraní | +-------------------------+ Zjištění přítomnosti ovladače IPX se vždycky nalepí na Multiplexní přerušení dosu int 2Fh Toho využijeme pro zjištění přítomnosti a vstupního bodu ovladače. Vstup: AX = 7A00h int 2Fh Výstup: AL = 0 - Není instalován AL = 0FFh - Je instalováno ES:DI - Segmen:offset na ovladač Když se vrátí v AL hodnota 0FFh, musíme si schovat obsahy registrů ES a DI, ve kterých je adresa na ovladač. Další služby se nevolají pomocí přerušení, ale právě jako far procedura na této adrese. Další funkce se volají pomocí této far procedury. POZOR ! Všechny volání ruší obsahy registrů ! (Podíval sem se do příkladů a zjistil, že ten ovladač se může volat i přerušením 7Ah. Nevím, jestli to bude fungovat všude, ale já to používám všude a jede to dobře) Tuto kapitolu jsem rozdělil na dvě části. V první najdete nejdůležitější funkce, v té druhé ty pokročilé a nebo jejihž použití mi uniká. Třeba někdo příjde na to, k čemu vlastně jsou. Seznam služeb: 0. Otevření soketu 1. Uzavření soketu 2. Zjištění nejvýhodnějšího prostředníka 3. Vyslání IPX paketu 4. Příjem IPX paketu 5. Naplánování události IPX 6. Zrušení události 7. Naplánování speciální události 8. Přečtení hodnoty čítače časových událostí 9. Získání celé mezisíťové adresy 10. Ukončení práce driveru 12. Inicializace síťové adresy 13. Zjištění délky IPX paketu 14. Zrušení soketů 15. Vnitřní vyslání IPX paketu I. Životně (programátorsky) důležité ---------------------------------------------------- Funkce 0 - Otevření soketu ---------------------------------------------------- Vstup: BX = 0000h AL = Způsob otevření 00h - soket bude otevřen do uzavření a nebo do ukončení programu 0FFh - bude otevřen až do uzavření. Konec programu nemá na soket vliv. (používá se pro rezidenty) DX = číslo soketu (v obráceném pořadí, vyšší byte je v DL) DX = 0000h - dynamické přidělení (nejspíš ten, který je volný, po návratu je číslo soketu v DX) Výstup: AL = 00h - v pořádku 0FEh - tabulka soketů je plná 0FFh - soket je už otevřen Po nastavení registrů zavoláte call far na adresu vrácenou v ES:DI po inicializaci int 2Fh. Soket, který je už otevřený a používá jej jiná aplikace můžete také používat, ale potom příjemnou zábavu při třídění paketů :-). Kromě far call můžete použít ještě int 7ah ------------------------------------------------ Funkce 1 - Zavření soketu ------------------------------------------------ Vstup: BX = 0001h DX = číslo soketu (v obráceném pořadí, vyšší byte je v DL) Výstup: nic Po skončení by jste měli všechny sokety uzavřít, aby je mohly používat další programy. ------------------------------------------------ Funkce 3 - Vyslání IPX paketu ------------------------------------------------ Vstup: BX = 0003h ES:DI = Ukazuje na strukturu ECB. Bude popsaná dále. Je to pole parametrů s informacemi o cíli, soketu ... Výstup: nic Zařadí toto ECB do seznamu odesílaných paketů a co nejřív tento paket pošle. V době čekání na poslání je nastaven příznak který znamená, že tento blok je používán driverem. ------------------------------------------------ Funkce 4 - Příjem IPX paketu ------------------------------------------------ Vstup: BX = 0004h ES:DI = Ukazuje na strukturu ECB. Výstup: nic Zařadí tento ECB do seznamu čekající na příjem paketu. Když dorazí paket, vynuluje se příznak a zavolá procedura ESR.(takové přerušení, které si můžete sami nastavit a obsluhovat) ------------------------------------------------ Funkce 6 - Zrušení události ------------------------------------------------ Vstup: BX = 0006h ES:DI = Ukazuje na strukturu ECB. Výstup: AL = 00h - zrušeno v pořádku 0F9h - událost je právě zpracovávána 0FFh - chyba, na tomto se nepracuje Touto funkcí se dá zrušit vyslání\příjem IPX\SPX paketu nebo časovač. ------------------------------------------------ Funkce 9 - Získání celé mezisíťové adresy ------------------------------------------------ Vstup: BX = 0009h ES:SI -> adresa bufferu o délce 10 byte Výstup: ES:SI -> mezisíťová adresa Tato funkce vrátí celou mezisíťovou adresu pracovní stanice. Tuto adresu můžete použít pro nastavení konkrétních adres cílovývch stanic. II. Pokročilé a podivné ------------------------------------------------ Funkce 2 - zjištění nejvýhodnějšího prostředníka ------------------------------------------------ Vstup: BX = 0002h ES:DI -> cílová mezisíťová adresa stanice ES:DI -> 6 - byte buffer pro umístění adresy prostředníka Výstup: AL = 00h úspěšné provedení funkce 0FAh nebyla zjištěna adresa prostředníka CX - očekávaná doba pro poslání jednoho paketu (576 byte) do cílového uzlu (v hodinových intervalech) ES:DI -> lokální adresa prostředníka (nebo přímo uzlu) Tato funkce mi není uplně jasná, můžete si přečíst její doslovný přepis: Tato funkce zjistí cílovou adresu paketu v lokální síti podle celé mezisíťové adresy. Je-li příjemce paketu fyzicky připojen na stejné lokální síti, je adresa lokálního cíle paketu stejná s adresou tohoto uzlu. Jinak adresa lokálního cíle paketu je uzlová adresa mostu, který paket přenese do cílové adresy. ------------------------------------------------ Funkce 5 - Naplánování událostí IPX ------------------------------------------------ Vstup: BX = 0005h AX = doba čekání ES:DI = Ukazuje na strukturu ECB. Výstup: nic Touto funkcí si můžete plánovat jakýsi časovač. Po uplynutí nastaveného času se zavolá procedura ESR definovaná v ECB. ------------------------------------------------ Funkce 7 - Naplánování speciální události IPX ------------------------------------------------ Vstup: BX = 0007h AX = doba čekání ES:DI = Ukazuje na strukturu ECB. Výstup: nic Podobné jako předchozí služba 05, ale tato je asi něčím speciální. Zatím ale nevím čím :-). ------------------------------------------------ Funkce 10 - Ukončení práce driveru ------------------------------------------------ Vstup: BX = 000Ah Výstup: nic Tato funkce zakáže síťovému driveru vykonávat nějakou činost. Nikdy jsem to nepoužil, třeba to k něčemu bude. ------------------------------------------------ Funkce 12 - inicializace síťové adresy ------------------------------------------------ Vstup: BX = 000Ch CX:DX - Globální adresa sítě - ?????? ES:DI - Flag "OSINCRITICALSECTION" DS:SI - režim otevření soketu Výstup: nic Doslovný přepis funkce: Adresa nemůže být změněna, dokud nebyla provedena její inicializace. (Ano, opravdu v literatuře o tom víc není ani zmínka. Nemám vůbec představu o práci této funkce.) ------------------------------------------------ Funkce 13 - Zjištění délky IPX paketu ------------------------------------------------ Vstup: BX = 000Dh Výstup: AX = maximální délka paketu CX = časový interval potvrzování - ??? Vrátí maximální délku paketu. Většinou to je 576 byte včetně hlavičky. ------------------------------------------------ Funkce 14 - Zrušení soketů ------------------------------------------------ Vstup: BX = 000Eh Výstup: nic Zruší všechny dočasné sokety otvřené jako dočasné. (Ty, které se samy uzavírají po skončení programu.) V některých verzích mohou být uzavřeny všechny sokety. ------------------------------------------------ Funkce 15 - Vnitřní služba vyslání IPX paketu ------------------------------------------------ Vstup: BX = 000Fh ES:SI - ukazatel na ECB Výstup: nic Podobné jako funkce 3, ale neumožňuje posílání víc fragmentů v jednom paketu. výheň