PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie programmiert man einen Treiber für Windows?


Gast
2008-04-08, 22:28:37
Ich will mich demnächst an einen Treiber für ein externes Gerät heranwagen daß über die Paralellte Schnittstelle angesprochen wird.

Gibt es hierzu irgendwelche Tutorials, oder gar unterstützende APIs etc. wie man an so etwas am besten herangeht?

RattuS
2008-04-08, 22:41:43
Es gibt ein SDK für Win auf der MS Website mit entsprechender Doku. Goggle sollte alles weitere klären.

TGGC
2008-04-08, 23:00:32
[ ] Autocogito

Gast
2008-04-09, 20:07:27
Es gibt ein SDK für Win auf der MS Website mit entsprechender Doku. Goggle sollte alles weitere klären.

Und wie heißt das SDK, damit ich weiß wonach ich suchen soll?

Exxtreme
2008-04-09, 20:13:51
Driver Development Kit vielleicht?

wori
2008-04-09, 21:28:12
Das DDk kostet. Du kannst bei MS die CD bestellen. Weiterhin benötigst Du noch etwas Literatur über das Windows Driver Model (-> WDM).
z.B.: Programming the Microsoft Windows Driver Model. The official guide to the Microsoft Windows Driver Model. Walter Oney.
Ach ja und etwas Zeit.
Viel Spaß

Gast
2008-04-09, 21:52:39
ein guter anfang könnte auch
http://www.freewebs.com/four-f/
sein. Leider ist da nur der Grundlagen teil auf englisch vorhanden, der rest nur russisch und französisch, aber um einen anfang zu haben definitiv empfehlenswert.

Gast
2008-04-09, 22:17:08
Das DDk kostet. Du kannst bei MS die CD bestellen.

Na toll. :(

Braucht man das DDK für die Paralelle Schnittstelle unbedingt?
D.h. kann man auf die Schnittstelle auch direkt von der Anwendungssoftware aus zugreifen?
Wenn ja, dann würde mir das schon genügen.

Gast
2008-04-09, 22:17:33
ein guter anfang könnte auch
http://www.freewebs.com/four-f/
sein. Leider ist da nur der Grundlagen teil auf englisch vorhanden, der rest nur russisch und französisch, aber um einen anfang zu haben definitiv empfehlenswert.

THX, ich werde es mir mal durchlesen.

Gast
2008-04-09, 23:45:34
Es heisst nicht mehr DDK sondern WDK (Windows Driver Kit)

Ectoplasma
2008-04-10, 00:23:36
Das DDk kostet.

Ist das neu? Das hat mal nichts gekostet, inklusive des Kernel-Debuggers.

GamlerHart
2008-04-10, 00:31:15
Den Kernel-Debugger gibts immer noch gratis. WDK mit MSDN-Subscription =(

Sephiroth
2008-04-10, 00:53:43
Ist das neu? Das hat mal nichts gekostet, inklusive des Kernel-Debuggers.
Jo, früher musste man iirc nur den Versand bezahlen.

Das Windows Server 2003 DDK (http://www.microsoft.com/whdc/devtools/ddk/default.mspx) gibt es aber ohne sich irgendwo anmelden zu müssen. Für das WDK braucht man nur ein hotmail/live login, damit man auf die Microsoft Connect Web site (http://connect.microsoft.com/) kommt - dort gibt es das nämlich auch. (How to Get the WDK and the WLK (http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx))

ScottManDeath
2008-04-10, 08:16:31
Du kannst mit CreateFile das Device "LPT" öffnen und dann mit ReadFile und WriteFile Daten als Stream lesen und schreiben



http://msdn2.microsoft.com/en-us/library/aa363201(VS.85).aspx

Hab noch ein paar Leichen im Keller gefunden :tongue:


#include <windows.h>
namespace ports
{
class LPT
{
public:
LPT();
~LPT();
bool Init(BYTE port);
bool Close();
bool Write(const BYTE* buffer, DWORD size);
bool Read(BYTE* buffer, DWORD size);

private:
HANDLE m_handle;
};
}

#include "lpt.h"
namespace ports
{
LPT::LPT()
{
m_handle=INVALID_HANDLE_VALUE;
}
LPT::~LPT()
{
}

bool LPT::Init(BYTE port)
{
char buff[5]="LPTX";
if(m_handle!=INVALID_HANDLE_VALUE)
Close();

buff[3]='0'+port;
m_handle=CreateFile(buff,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
return m_handle!=INVALID_HANDLE_VALUE;
}
bool LPT::Close()
{
return CloseHandle(m_handle)!=0;
}

bool LPT::Write(const BYTE* buffer, DWORD size)
{
DWORD written=0;
BOOL ret;
ret=WriteFile(m_handle,buffer,size,&written,0);
if(ret==FALSE)
return false;
if(written != size)
return false;
return true;
}
bool LPT::Read(BYTE* buffer, DWORD size)
{
DWORD read=0;
BOOL ret;
ret=ReadFile(m_handle,buffer,size,&read,0);
if(ret==FALSE)
return false;
if(read != size)
return false;
return true;
return true;
}

};


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "lpt.h"



int main(int,char**)
{
const DWORD l=256;
BYTE buff[l];

DWORD i=0;
for(i=0; i<l;i++)
buff[i]=i&0x7F;

ports::LPT lpt;
printf("Init\n");

printf("LPT::Init=%u\n",lpt.Init(1));




DWORD o=0;
while(true)
{

if(!lpt.Write(buff,l))
printf("error\n");
// else
//printf(".");


for(i=0; i<l;i++)
buff[i]=(o+i)&0x7F;
o++;

if(kbhit())
break;
}

printf("LPT::Close=%u\n",lpt.Close());
printf("Done\n");
printf("<key>\n");
getch();
return 0;
}

Shink
2008-04-10, 08:51:30
D.h. kann man auf die Schnittstelle auch direkt von der Anwendungssoftware aus zugreifen?
Wenn ja, dann würde mir das schon genügen.
Klar, geht eigentlich mit jedem Betriebssystem (zumindest unter DOS, Linux, Windows, MacOS).

Gast
2008-04-12, 15:49:01
Du kannst mit CreateFile das Device "LPT" öffnen und dann mit ReadFile und WriteFile Daten als Stream lesen und schreiben



http://msdn2.microsoft.com/en-us/library/aa363201(VS.85).aspx

Hab noch ein paar Leichen im Keller gefunden :tongue:


#include <windows.h>
namespace ports
{
class LPT
{
public:
LPT();
~LPT();
bool Init(BYTE port);
bool Close();
bool Write(const BYTE* buffer, DWORD size);
bool Read(BYTE* buffer, DWORD size);

private:
HANDLE m_handle;
};
}

#include "lpt.h"
namespace ports
{
LPT::LPT()
{
m_handle=INVALID_HANDLE_VALUE;
}
LPT::~LPT()
{
}

bool LPT::Init(BYTE port)
{
char buff[5]="LPTX";
if(m_handle!=INVALID_HANDLE_VALUE)
Close();

buff[3]='0'+port;
m_handle=CreateFile(buff,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
return m_handle!=INVALID_HANDLE_VALUE;
}
bool LPT::Close()
{
return CloseHandle(m_handle)!=0;
}

bool LPT::Write(const BYTE* buffer, DWORD size)
{
DWORD written=0;
BOOL ret;
ret=WriteFile(m_handle,buffer,size,&written,0);
if(ret==FALSE)
return false;
if(written != size)
return false;
return true;
}
bool LPT::Read(BYTE* buffer, DWORD size)
{
DWORD read=0;
BOOL ret;
ret=ReadFile(m_handle,buffer,size,&read,0);
if(ret==FALSE)
return false;
if(read != size)
return false;
return true;
return true;
}

};


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "lpt.h"



int main(int,char**)
{
const DWORD l=256;
BYTE buff[l];

DWORD i=0;
for(i=0; i<l;i++)
buff[i]=i&0x7F;

ports::LPT lpt;
printf("Init\n");

printf("LPT::Init=%u\n",lpt.Init(1));




DWORD o=0;
while(true)
{

if(!lpt.Write(buff,l))
printf("error\n");
// else
//printf(".");


for(i=0; i<l;i++)
buff[i]=(o+i)&0x7F;
o++;

if(kbhit())
break;
}

printf("LPT::Close=%u\n",lpt.Close());
printf("Done\n");
printf("<key>\n");
getch();
return 0;
}






Danke, genau das was ich brauche.

Gast
2008-04-13, 23:27:15
Wie programmiert man die serielle Schnittstelle?

ScottManDeath
2008-04-14, 03:52:57
Steht bei dem MSDN link. Der Device Name ist dann "COM1" usw. Dann gibts noch API (SetCommState usw.) um Baudrate usw. einzustellen.