DACL - Was bedeutet der Fehler? (997)



  • Ich wollte die ACCESS_MASK für die Rechte des aktuellen Benutzers auf eine Datei erhalten und habe folgenden Code erstellt. Der Aufruf der GetEffectiveRightsFromAcl schlug jedoch fehl mit dem Fehlercode 997 - Überlappender E/A-Vorgang wird verarbeitet. Woher stammt dieser Fehler? Arbeitet eine der aufgerufenen Funktionen asynchron und hat ihre Arbeit noch nicht beendet oder habe ich einfach etwas falsch gemacht?

    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    #include <Accctrl.h>
    #include <Aclapi.h>
    
    int main() {
    	DWORD dwRet = 0;
    	DWORD dwbufsize = 0;
    	PCHAR secdesc = NULL;
    	TRUSTEE tr;
    	BOOL bRet = FALSE;
    	ACCESS_MASK mask;
    	PACL acl = NULL;
    	HANDLE hAccessToken;
    	BOOL isdefaultedacl = FALSE;
    	BOOL isdaclpresent = FALSE;
    	PTOKEN_USER pTu = NULL;
    
    	ZeroMemory(&tr,sizeof(TRUSTEE));
    	ZeroMemory(&mask,sizeof(ACCESS_MASK));
    
    	dwRet = GetLastError();
    
    	//Security Descriptor abfragen
    	if (!GetFileSecurity("c:\\1.txt",DACL_SECURITY_INFORMATION,secdesc,0,&dwbufsize)) {
    		if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER) {
    			return -1;
    		}
    
            secdesc = new CHAR[dwbufsize];
    
    		if (!GetFileSecurity("c:\\1.txt",DACL_SECURITY_INFORMATION,secdesc,dwbufsize,&dwbufsize)) {
    			return -1;
    		}
    	} else {
    		return -1;
    	}
    
    	//DACL aus dem Security Descriptor erhalten
    	if (!GetSecurityDescriptorDacl(secdesc,&isdaclpresent,&acl,&isdefaultedacl)) {
    		return -1;	
    	}
    
    	if (!isdaclpresent) {
    		//Wo ist sie hin? :-)
    		return -1;
    	}
    
    	//Prozesstoken öffnen
    	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY,&hAccessToken)) {
    		return -1;
    	}
    
    	//TokenUser abfragen
        if (!GetTokenInformation(hAccessToken, TokenUser, pTu, 0, &dwbufsize)) {
    		if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
     			return -1;
    		}
    
    		pTu = (PTOKEN_USER) new CHAR[dwbufsize];
    
    		if (!GetTokenInformation(hAccessToken, TokenUser, pTu,dwbufsize, &dwbufsize)) {
    			return -1;
    		}
     	}
    
    	//Trustee initialisieren
    	tr.TrusteeForm = TRUSTEE_IS_SID;
    	tr.TrusteeType = TRUSTEE_IS_USER;
    	tr.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
     	tr.pMultipleTrustee = NULL;
        tr.ptstrName = (LPWSTR)(pTu->User.Sid);
    
    	//Effektive Rechte des Trustees gemäß ACL erhalten
    	if (!GetEffectiveRightsFromAcl(acl ,&tr, &mask)) {
     	    std::cout << GetLastError(); //997 ERROR_IO_PENDING - Überlappender E/A-Vorgang wird verarbeitet.  
    		return -1;
    	}
    
    	getch();
        return 0; 
    }
    


  • Ich fürchte, das ist zu speziell 🙄

    MfG RoaN;



  • roan312 schrieb:

    Ich fürchte, das ist zu speziell 🙄

    MfG RoaN;

    Fürchte ich auch, wo geht man denn hin für solche speziellen WinAPI-Sachen?



  • frag doch mal in einer newsgroup z.B.

    microsoft.public.platformsdk.security
    oder
    comp.os.ms-windows.programmer.win32

    Mit Visual C++ 7.1 lässt sich das übrigens nicht kompilieren.
    Der Compiler meckert in Zeile 75: error C2440: '=': 'LPWSTR' kann nicht in 'LPSTR' konvertiert werden



  • Ändere mal die Abfrage auf:

    if (GetEffectiveRightsFromAcl(acl ,&tr, &mask) != ERROR_SUCCESS)

    Dann merkst du das die Funktion gar nicht fehl schlägt. 😉



  • Grober schrieb:

    Dann merkst du das die Funktion gar nicht fehl schlägt. 😉

    Hoppla, hab den Rückgabewert gar nicht beachtet 😉
    Naja, dankeschön, jetzt funktioniert es wie gewünscht.

    In meinem aktuellen Quelltext steht (LPSTR). Ich war mir zuerst unsicher, ob die entsprechende Struktur auch für ANSI implementiert wurde, denn das ist ja vor allem bei der NTSECAPI an vielen Stellen nicht der Fall.


Anmelden zum Antworten