Port LPT

SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Jako że w devie normalnie nie ma libmsvcrt.a (przynajmniej u mnie ) to najpierw go sobie robimy (poprawka: mam takie coś, ale to to ma troszkę ponad 1KB)

  1. Dumpujemy listę exportowanych funkcji dowolnym programem który to potrafi (link, exescope), do pliku.
  2. Otwieramy dump w notatniku i usuwamy informacje dodane przez program dumpujący, tak by zostały tylko nazwy funkcji
  3. Na samej górze dopisujemy dwie linie:
Kopiuj
LIBRARY msvcrt.dll
EXPORTS
  1. Całość wygląda tak:
Kopiuj
LIBRARY msvcrt.dll
EXPORTS
$I10_OUTPUT
??0__non_rtti_object@@QAE@ABV0@@Z
// jeszcze sporo takich dziwadeł
inp
inpd
inpw
outp
outpd
outpw

Resztę funkcji pomijam bo szkoda zaśmiecać Forum. W sumie Tobie wystarczy 6 ostatnich funkcji, więc nie potrzebujesz dumpera.

  1. Tak powstały plik zapisz w katalogu dev-cpp/bin jako msvcrt.def i otwórz w tym katalogu linię poleceń. Uruchom poniższe polecenie by zbudować libmsvcrt.adlltool -k -d msvcrt.def -l libmsvcrt.a
  2. Nowo powstały plik libmsvcrt.a przenosisz do dev-cpp/lib. Jeżeli masz tam juz libmsvcrt.a to zapisz nowy plik pod inną nazwą, np libmsvcrt2.a.

No i teraz standardowo tworzysz projekt, dodajesz w opcjach libmsvcrt.a (ten nowy), a w kodzie piszesz

Kopiuj
__declspec(dllimport) unsigned char __cdecl inp(unsigned short port);
__declspec(dllimport) unsigned char __cdecl outp(unsigned short port, unsigned char value);
...
while (1) {outp(888, inp(888)^255); Sleep(250);}
QP
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0

zrobiłem wszystko jak w opisie i wyskakuje mi błąd:

[Linker error] undefined reference to `_imp___Z4outpth'

SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

No to skompiluj to jako C, albo obejmij importy w extern C:

Kopiuj
extern "C"
{
__declspec(dllimport) unsigned char __cdecl inp(unsigned short port);
__declspec(dllimport) unsigned char __cdecl outp(unsigned short port, unsigned char value);
};
QP
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0
Kopiuj
#include <iostream>
#include <math.h>
using namespace std;

int liczba;
char gwiazdki[8];
void outport(int,int);
void LPT_show();
void set_port();
void menu();
void LPT_wysterowany();

int main()
{

    
      menu();
      getchar();
      return 0;
};

void menu()
{
     system("cls");
     cout << "*** Program do sterowania portem LPT. Autor: Wojtek Stepien ***" << endl << endl;
     cout << "Menu: " << endl << endl;
     cout << "0-zeruj port" << endl;
     cout << "1-ustaw port" << endl;
     cout << "2-wyjscie z programu" << endl << endl;
     int w;
     cout << "Wybieram : " ; cin >> w;
     
     switch(w)
     {
              case 0 :
                   outport(0x378,0x00);
                   cout << "Port zostal wyzerowany - wartosc logiczna 0; [Wcisnij enter]" << endl;
                   getchar();
                   getchar();
                   menu();
                   break;
              case 1 :
                   LPT_show();
                   set_port();
                   liczba = 0;
                   LPT_wysterowany();
                   cout << endl << "Nacisnij enter by powrocic do menu";
                   getchar();
                   menu();
                   break;
              case 2 :
                   break;
              
              default :
                   menu();
                   break;
     };
                   
};

void outport(int,int)
{
      asm(".intel_syntax noprefix");                       //asembler - INTEL
      asm("mov dx, [ebp + 8]");                           //do rej DX podajemy adres portu 
      asm("mov al, [ebp + 12]");                         // do rej AL podajemy bajt danych
      asm("out dx, al");                                // wysylanie
      asm(".att_syntax prefix");

};

void LPT_show()
{
          system("cls");
          cout << "Widok portu LPT od zewnatrz komputera.\nMozliwe jest sterowanie danymi za pomoca 8 bitow\n:piny, ktore reprezentuja dane przedstawione sa ponizej " << endl << endl;
          cout << "           D7 D6 D5 D4 D3 D2 D1 D0" << endl; 
          cout << "*  *  *  *  *  *  *  *  *  *  *  *  *" << endl;
          cout << "  *  *  *  *  *  *  *  *  *  *  *  *"<< endl << endl<< endl;
};

void set_port()
{
     int wybor[8];
     for (int i=0;i<=7;i++)
     {
         cout <<"Jak wysterowac Pin D"<<i<<" ? [0 lub 1]: ";
         cin >> wybor[i];     // zapis tablicy wartosci wysylanej na port 
         if ((wybor[i]==1)) gwiazdki[i]='1'; else gwiazdki[i]='0';                                       
         if ((wybor[i]!=0) && (wybor[i]!=1))
         {
              wybor[i]=0;          //nadanie zle wysterowanym portom wartosci 0
              gwiazdki[i]='0';
         };            
     };   

    cout << "Blednie wysterowane piny automatycznie przyjma wartosc 0 " << endl << "Port wysterowany zostal liczba [hex] : ";
    int w=8;  //deklaracja wykladnika
    for (int i=7;i>=0;i--)
    {
        w--;
        liczba+=wybor[i]*pow(2,w);  
    };
    cout << hex << liczba << endl << endl;                               //wypisanie liczby w postaci hexadecymalnej
    getchar();
    outport(0x378,liczba);  
};


void LPT_wysterowany()   // obrazuje wysterowanie portu
{
     
    cout << "           D7 D6 D5 D4 D3 D2 D1 D0" <<endl; 
    cout << "*  *  *  *";
    for (int j=7;j>=0;j--)
    {
         cout <<"  ";
         cout << gwiazdki[j];
    };
    cout << "  *" << endl;
    cout << "  *  *  *  *  *  *  *  *  *  *  *  *"<< endl << endl<< endl;
};

Jest to kompletyny działający program. działa po wrzuceniu plkiu "userport" znajduje sie w pierwszym poscie.

Inną drogą mam pytanie jaki adres mają pozostałe porty w LPT takie jak scrobe i itd??

SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Na elektrodzie jesteś od 2005 i jeszcze tego nie znalazłeś?

0
sapero napisał(a)

Zamiast portid napisz [ebp+8], a zamiast value - [ebp+12].
Jeżeli zlinkujesz sobie msvcrt.a to tam masz gotowe funkcje _inp(port) i _outp(port,data). Sześć prototypów jest w conio.h z visuala.

A co do dostępu do portów - w XP jest to możliwe bez extra sterowników, sam ntdll to oferuje.

Możesz napisać coś więcej o tym dostępie z poziomu ntdll?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.