Hilfe... SystemErrorCode 997.. Was sagt mir das?



  • Hey all...

    Ich habe hier einen System Error Code 997, allerdings bringt mir dass von MSDN nicht viel

    MSDN schrieb:

    ERROR_IO_PENDING |Overlapped I/O operation is in progress.
    997
    0x3E5

    Was sagt mir das?

    Was ich tue: Ich habe ein funktion (das meiste von hier) und die soll dem User HardwareIO erlauben, ohne Admin zu sein.

    Ich muss ehrlich sagen im kleinsten detial habe ich noch nicht verstanden wass gemacht wird, aber ich kann schon das meiste -schätz ich mla- verstehen.

    Nur mit dieser Fehlermeldung kann ich halt echt nichts anfangen... Währ nett wenn mir wer hilft

    Mit freundlichen Grüßen

    [eidt]

    OpenProcessToken: 2
    LookupPrivilegeValue: 997
    AdjustTokenPrivileges: 1300
    

    Dass sind die GetErrorCode s direkt nach den Funktionsaufrufen.(vlt hilft euch dass)



  • lippoliv schrieb:

    Was ich tue: Ich habe ein funktion (das meiste von hier) und die soll dem User HardwareIO erlauben, ohne Admin zu sein.

    Um das benutzen zu können musst Du nicht nur Administratorrechte haben, sondern auch noch als teil des OS agieren...

    greetz, Swordfish



  • Wenn ich als Admin mein Programm starte, OHNE diesen Trick, gehts... Nur mit diesem Trick gibt es ein Problem.

    Wie bekomme ich das behoben? Wie agiere ich als System?



  • Sry wegen DP aber ich habe bischen was geändert und schauts euch an:

    #define STRICT
    #define WIN32_LEAN_AND_MEAN
    
    #include <stdio.h>
    #include <windows.h>
    #include <ddk/ntdddisk.h>
    #include <tchar.h>
    
    #define DRIVE_HEAD_REG	0xA0
    
    BOOL allowUserForHardwareIO();
    BOOL erlaubeZugriffAufHardwareIO( PTCHAR privilege );
    
    int main( void )
    {
    	int 			ret;
    	HANDLE 			storage;
    	DRIVERSTATUS 	myDriveState;
    	DWORD 			tmp;
    	BYTE			getAttributes;
    	UCHAR			buff[512];
    
    	SENDCMDINPARAMS		inCommandParam 	= { 0 };
    	SENDCMDOUTPARAMS	outCommandParam	= { 0 };
    
    	if( allowUserForHardwareIO() )
    	{
    		inCommandParam.cBufferSize = 0;//buffer size
    		inCommandParam.bDriveNumber = 1;//wird angeblich ignoriert
    		inCommandParam.irDriveRegs.bFeaturesReg = ENABLE_SMART;	//was gemacht werden soll
    		inCommandParam.irDriveRegs.bSectorCountReg = 1;//IDE SECTOR COUNT
    		inCommandParam.irDriveRegs.bSectorNumberReg = 1;//SECTOR NUMBER REGISTER
    		inCommandParam.irDriveRegs.bCylLowReg = SMART_CYL_LOW;//low order register
    		inCommandParam.irDriveRegs.bCylHighReg = SMART_CYL_HI;//high order register
    		inCommandParam.irDriveRegs.bDriveHeadReg = DRIVE_HEAD_REG;//ide drive/head register
    		inCommandParam.irDriveRegs.bCommandReg = SMART_CMD;//command register
    
    		storage = 	CreateFile(
    						"\\\\.\\PhysicalDrive0",			//the drive
    						GENERIC_READ|GENERIC_WRITE,			//no access to the drive
    						FILE_SHARE_READ | FILE_SHARE_WRITE,
    						NULL,								//default sec. attributes
    						OPEN_EXISTING,						//just try to open the file
    						FILE_ATTRIBUTE_SYSTEM,				//file attributes
    						NULL								//dont copy file attributes
    					);
    
    		if( INVALID_HANDLE_VALUE != storage )
    		{
    			ret = 	DeviceIoControl( 	//hier ist nocch was falsches in den parametern
    						storage,					//handle to device
    						SMART_SEND_DRIVE_COMMAND,	//command
    						&inCommandParam,			//incommand
    						sizeof(inCommandParam),		//sizeof(incommand)
    						&outCommandParam,			//outcommand
    						sizeof(outCommandParam),	//sizeof(outcommand)
    						&tmp,						//buffer
    						NULL						//?
    					);
    			if( ret )	//hat geklappt
    			{
    				if( 0 == outCommandParam.DriverStatus.bDriverError )
    					printf( "No error\n" );
    				else
    					printf( "Error on HDD\n" );
    
    				inCommandParam.irDriveRegs.bFeaturesReg = SMART_READ_LOG;	//was gemacht werden soll
    				outCommandParam.cBufferSize = 512;	//was gemacht werden soll
    				//outCommandParam.bBuffer = buff;	//was gemacht werden soll
    
    				ret = 	DeviceIoControl( 	//hier ist nocch was falsches in den parametern
    						storage,					//handle to device
    						SMART_RCV_DRIVE_DATA,		//command
    						&inCommandParam,			//incommand
    						sizeof(inCommandParam),		//sizeof(incommand)
    						&outCommandParam,			//outcommand
    						sizeof(outCommandParam),	//sizeof(outcommand)
    						&tmp,						//buffer
    						NULL						//?
    					);
    				if( ret )
    					printf( "out:%s", outCommandParam.bBuffer );
    				else
    					printf( "Failure SMART_RCV_DRIVE_DATA: %d\n", GetLastError() );
    			}
    			else		//hat nicht geklappt
    				printf( "Failure DeviceIoControl: %d\n", GetLastError() );
    
    			CloseHandle( storage );
    		}
    		else
    			printf( "Failure: %d\n", GetLastError() );
    	}
    	else
    		printf( "Can't get User-Rights... %d\n", GetLastError() );
    	system( "pause" );
    	return 0;
    }
    
    BOOL allowUserForHardwareIO()
    {
    	typedef ULONG (__stdcall* pfn_ZwSetInformationProcess)	(	//typen erzeugen, der später auf die adresse einer funktion gelegt wird
    										                    HANDLE,
    										                    ULONG, 
    										                    PVOID, 
    										                    ULONG
    															);
    	BOOL returnValue = FALSE;
    	HMODULE modNtDll = NULL;	//modulehandle zu der dll
    	ULONG	IOPL = 3;
    	int		usrModeIOPL = 16;	//rechte
    	pfn_ZwSetInformationProcess myProcInfo;	//ist im spätereen verlauf eine funktion
    	modNtDll = GetModuleHandle( "ntdll.dll" ); //dll library anzapfen
    
    	if( modNtDll )
    	{
    		myProcInfo = (pfn_ZwSetInformationProcess)GetProcAddress( modNtDll, "ZwSetInformationProcess" ); //addresse einer funktion in der dll auslesen
    		if( myProcInfo )//wenn erfolgreich
    		{
    			returnValue = erlaubeZugriffAufHardwareIO( SE_TCB_NAME ); //zugriff für user erlauben
    
    			if( returnValue )
    			{
    				returnValue = myProcInfo( GetCurrentProcess(), usrModeIOPL, &IOPL, sizeof(IOPL) );
    				//if 0 is returned the function is TRUE, so switch the values
    				returnValue = !returnValue;
    				if( !returnValue )
    					printf( "ZwSetInformationProcess: %d\n", GetLastError() );
    			}
    
    		}
    	}
    
    	return returnValue;
    }
    
    BOOL erlaubeZugriffAufHardwareIO( PTCHAR privilege )
    {
    	BOOL returnValue;
    	HANDLE myHandle;//unbekannt
    	LUID luid; //unbekannt
    	TOKEN_PRIVILEGES tokenPriv = { 0 };
    	returnValue = 	OpenProcessToken(
    							GetCurrentProcess(),					//prozess handle
    							TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,	//zugriffsrechte
    							&myHandle								//handle zu den neuen zugriffsrechten
    					);
    	if( !returnValue )
    		printf( "OpenProcessToken: %d\n", GetLastError() );
    
    	if( returnValue )
    	{
    		returnValue = 	LookupPrivilegeValue(
    										NULL,		//null-terminierter string der den namen des systems festlegt, bei dem die previlege ausgeschaut werden sollen
    										privilege,	//name des previleges
    										&luid		//die LUID bei der diese Previlegien bekannt sind
    						);
    		if( !returnValue )
    			printf( "LookupPrivilegeValue: %d\n", GetLastError() );
    
    		if( returnValue )
    		{
    			tokenPriv.PrivilegeCount = 1; //ein privileg enthalten
    			tokenPriv.Privileges[0].Luid = luid; //ein privileg enthalten
    			tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //ein privileg enthalten
    
    			//privilege speichern
    			returnValue = 	AdjustTokenPrivileges(
    								myHandle,			//handle mit den in openprocesstoken erhaschten rechten
    								FALSE,				//deaktivieren aller previlegien für diesen bereich
    								&tokenPriv,			//neue privilegien
    								sizeof(tokenPriv),	//bufferlänge
    								NULL,				//den alten previlegienstand speichern
    								NULL				//erhaltene bufferlänge 
    							);
    			if( !returnValue )
    				printf( "AdjustTokenPrivileges: %d\n", GetLastError() );
    		}
    	}
    
    	return returnValue;
    }
    

    Da kommt nur am ende "Can't get user rights... 1300" und davor noch "ZwSet..."
    keine andere Meldung... das Bedeutet das nur ZwSetInformationProcess einen Fehler hat, da diese Funktion ja irgendwie ein problem hat.

    Könnt ihr mir da helfen?

    Wenni ch einfach

    returnValue = !returnValue;
    

    ausskommentiere, dann bekommi ch wieder fehler 5, keine Zugriffsrechte...

    [edit]was ich nichtmache: dieser reboot, da weiß ich nicht was das ist...



  • lippoliv schrieb:

    was ich nichtmache: dieser reboot, da weiß ich nicht was das ist...

    🙄

    Warum muss ich's nochmal sagen? ➡ Act as Part of the Operating System



  • Du willst mir nicht ernsthaft sagen, das ich MANUELL einstellen muss, das der User das machen darf!?

    Eigentlich "Act" ich als Systemprozess und Zwar über:

    returnValue = erlaubeZugriffAufHardwareIO( SE_TCB_NAME ); //zugriff für user erlauben
    

    MSDN schrieb:

    SE_TCB_NAME
    This privilege identifies its holder as part of the trusted computer base. Some trusted protected subsystems are granted this privilege.

    User Right: Act as part of the operating system.

    Wenn ich das jetzt nicht falsch verstehe, bin ich somit "vertrauenswürdig"...

    Oder veraff ich da jetzt was?



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • lippoliv schrieb:

    Da kommt nur am ende "Can't get user rights... 1300" und davor noch "ZwSet..."
    keine andere Meldung... das Bedeutet das nur ZwSetInformationProcess einen Fehler hat, da diese Funktion ja irgendwie ein problem hat.

    lippoliv schrieb:

    Du willst mir nicht ernsthaft sagen, das ich MANUELL einstellen muss, das der User das machen darf!?

    Fällt dir was auf!?

    greetz, Swordfish

    PS: Nein, ich sag's nur aus Langeweile und unermesslicher freude am Tippen...



  • "Fehler 1300: Not all privileges or groups referenced are assigned to the caller."

    Das mit 997 (Overlapped I/O operation is in progress.) scheint ihn nicht zu kratzen, da die Funktion TRUE ( erfolgreich ) zurückgibt.

    Die Meldung "Can't get user rights... %d" habe ich selber geschrieben (schätze mal dass ist dir bewusst)

    Wenn ich nun manuell einstellen muss, das der Benutzer Hardware I/O betreiben darf warum schreibe ich dann diese nette Funktion, die es mir erlauben soll?

    Oder soll ich dem Benutzer erlauben dass Programme sich den Zugriff auf irgendwas erlauben dürfen!?

    Kann mir jemand die Pfadangabe "Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\" in der Deutschen version schreiben... Finde den pfad nicht 😃

    MFG und danke bis jetzt...

    [eidt]
    Habe Lokale Sicherheitsrichtlinien gefunden, und habe auf mich das Recht für "Einsetzen als Teil vom Betriebssystem" eingetragen... Immer noch 1300
    Auch mit "Ersetzen eines Tokens auf Prozessebene" geht es nicht.
    Auch beides in Kombination zeigt die 1300 an... *help*

    [doubledit]Auch als ADMIN bekommm ich diese meldung, und es geht nicht... Der müsste das doch können oder?


Anmelden zum Antworten