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
0x3E5Was 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: 1300Dass 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 erlaubenMSDN 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?