Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Security Descriptor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.06.2004, 09:53 Uhr
~BokonTaylay
Gast


Hallo!

Bräuchte Hilfe von 'nem C++ Guru, der sich mit der Windowsprogrammierung auskennt. Meine Kenntnisse sind, was dieses ganze Security und Access Rights betrifft, recht beschränkt.

Es geht um Folgendes:

Ich öffne einen seriellen Port so:


C++:
m_hCom = CreateFile(m_sComPort,    
        GENERIC_READ | GENERIC_WRITE,
        0, // Exclusive access
        0, // security
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED, // Non-Overlapped I/O
        NULL); // Null template




später versuche ich darauf zu schreiben:


C++:
bWriteRC = WriteFile(m_hCom, sSend,iFrameLength,&iBytesWritten,&ola);



die overlapped Struktur ola sieht folgendermaßen aus:


C++:
SECURITY_DESCRIPTOR * pSd;
    SECURITY_DESCRIPTOR  sd;
    pSd = &sd;
    
InitializeSecurityDescriptor( pSd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl( pSd, TRUE, NULL, FALSE);
    
PSID sid = NULL;
SID_IDENTIFIER_AUTHORITY sid_auth = {SECURITY_WORLD_SID_AUTHORITY };
    
AllocateAndInitializeSid( &sid_auth, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid);
SetSecurityDescriptorOwner(pSd, &sid, FALSE);

SECURITY_ATTRIBUTES * pSa;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = 1;
sa.lpSecurityDescriptor = pSd;
pSa = &sa;

ola.hEvent = CreateEvent(
    pSa,   // security attributes ALL ACCESS
    TRUE,  // manual reset event
    FALSE,  // not signaled
    NULL    // no name
    );



Jetzt bekomme ich aber beim WriteFile einen Error 1337 - Invalid SID
und weiß nicht warum. Wenn ich die Initialisierung des SID weglasse, bekomme ich später bei einem WaitCommEvent()

C++:
bReadRC = WaitCommEvent (m_hCom, &dwCommModemStatus, &ola);



einen Error 5 - Access Denied

Hat irgendjemand eine Ahnung, was ich da falsch mache? Wie gesagt, C++ unter Windows ist neu für mich. Danke

Markus

P.S.: WaitCommEvent ohne Overlapped geht, aber das brauch ich für die Applikation leider nicht (kein Rücksprung vor Eventvorkommen)


Bearbeitung von typecast:
Tags-korrigiert

Dieser Post wurde am 21.06.2004 um 10:04 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2004, 09:56 Uhr
~BokonTaylay
Gast


Oh je, jetzt hab ich aus lauter Gewohnheit den Backslash verwendet! Sorry!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.06.2004, 10:21 Uhr
ao

(Operator)


Normalerweise kann man das ganze Security-Blabla weglassen und in CreateEvent anstelle von pSa einfach NULL übergeben. Man kriegt dann Default-Security-Einstellungen, und das ist meistens OK.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.06.2004, 10:52 Uhr
~Bokon Taylay
Gast



Zitat:
ao postete
Normalerweise kann man das ganze Security-Blabla weglassen und in CreateEvent anstelle von pSa einfach NULL übergeben. Man kriegt dann Default-Security-Einstellungen, und das ist meistens OK.


Das war auch mein erster Versuch. Leider hab ich da immer diesen Access denied Fehler bekommen, sonst wär ich auf diesen ganzen Security Kram niemals gekommen. Es ist zum Haareausreißen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.06.2004, 11:30 Uhr
ao

(Operator)


Das WaitCommEvent wird doch auf einem anderen Thread gemacht als das WriteFile, richtig? Sonst wär die ganze Overlapped-Geschichte unsinnig.

Wie hängen diese beiden Threads zusammen? Ist vielleicht der eine aus dem anderen erzeugt worden? Wenn du CreateThread verwendet hast: wie bist du da mit den Security-Attributes umgegangen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.06.2004, 12:59 Uhr
~BokonTaylay
Gast


Mit Threads habe ich das eigentlich nicht realisiert.

Ich bin mir nicht ganz sicher, ob ich diese Overlapped Geschichte ganz richtig verstanden habe. Bei diversen Beispielen zur Seriellen Schnittstelle habe ich meist eine Non-overlapped Methode gesehen.

Leider kehrt da das WaitCommEvent erst bei Fehler oder Eintreten eines Events wieder zurück und man kann dann - soviel ich weiß - keinen Abbruch des Funktion machen (z.B. nach dem x. Versuch).

Bei Overlapped kehrt es schon zurück und man kann dann mit WaitForSingleObject() und GetOverlappedResult() recht gut auf die Vorkommnisse reagieren (wenn ich an die COM schreibe, haut das auch super hin).

Ich hab' auch mal gelesen, dass man ReadFile() in einer Endlosschleife laufen lässt und dann z.B. die CommTimeOuts nutzt. Bei WaitCommEvent muss man aber eben nicht ständig pollen und macht dann ReadFile erst, sobald Daten angekommen sind.

Zurück zum Problem:

Meine Klasse sieht grob so aus:



C++:
class CComPort  
{
public:
    CComPort(CString& sComPort);
    virtual ~CComPort();
    BOOL Initialize();
    int SendToCom(BYTE *sSend, DWORD iFrameLength);
    int ReadFromCom(BYTE *sReceive);    
    void Terminate();

protected:
    CString    m_sComPort;
    BOOL    m_bPortReady;
    HANDLE    m_hCom;
    DCB        m_dcb;
    COMMTIMEOUTS m_CommTimeouts;

};



Innerhalb von SendToCom() rufe ich WriteFile auf (overlapped), das funktioniert solange ich den oben angeführten SID weglasse bzw. einfach, wie oben angesprochen, NULL statt pSa übergebe. Sonst kommt eben der Invalid SID structure Fehler.

Innerhalb von ReadFromCom() rufe ich WaitCommEvent() und dann (wenn eben Zeichen empfangen wurden) ReadFile() auf (beide overlapped). Dann bekomme ich eben einen Error 5 (Access denied) bei WaitCommEvent() und ich check nicht, wer da wem den Zugriff verweigert bzw. was ich dagegen machen kann.

Vielleicht ist das jetzt klarer geworden. Aber wie gesagt, für mich ist das alles ziemlich neu.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.06.2004, 13:19 Uhr
ao

(Operator)


Es gibt einen Technical Article in der MSDN-Hilfe, der beschreibt, wie es im Prinzip geht. Such mal in der MSDN nach

"Serial Communications in Win32"

da landest du an der richtigen Stelle. Ist etwas länglich, aber beantwortet hoffentlich viele grundsätzliche Fragen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.06.2004, 15:10 Uhr
~BokonTaylay
Gast


Jetzt bin ich auf eine andere Idee gekommen: ich hab' nämlich ein anderes COM Programm laufen lassen, das ebenfalls bei (overlapped) WaitCommEvent() gefallen ist. Vielleicht ist daran die Rechtvergabe am Rechner schuld. Bin nur ein "normaler User" und kein Admin. Das müsste man vielleicht durch diese Security Dinger ändern, aber ich weiß nicht wie.

Danke jedenfalls mal für deine Antworten ao!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: