Subclassing des Konsolenfensters
-
Hallo,
ich versuche gerade das Konsolenfenster zu subclassen damit ich in der neuen WndProc bestimmte Nachrichten abfangen kann.Bisher habe ich es mit dem folgenden Code versucht:
#include<iostream> #include<Windows.h> #include<conio.h> using namespace std; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(message) { case WM_CHAR: cout<<"WM_CHAR\n"; MessageBox(0, TEXT("WM_CHAR"), TEXT("Message:"), MB_OK); break; case WM_PAINT: cout<<"WM_PAINT\n"; MessageBox(0, TEXT("WM_PAINT"), TEXT("Message:"), MB_OK); break; } WNDPROC pWndProc = (WNDPROC)GetWindowLongPtrW(hwnd,GWL_USERDATA); return CallWindowProc(pWndProc,hwnd,message,wparam,lparam); } void EnableSeDebugPrivileg() { HANDLE htoken; LUID luid; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &htoken); LookupPrivilegeValue(0, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Luid=luid; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(htoken, false, &tkp, sizeof(tkp), 0, 0); CloseHandle(htoken); } int main() { EnableSeDebugPrivileg(); HWND hwnd=GetConsoleWindow(); DWORD pid; GetWindowThreadProcessId(hwnd, &pid); HANDLE handle=OpenProcess(PROCESS_ALL_ACCESS, false, pid); int error=GetLastError(); cout<<"errorcode: "<<error<<endl; LONG_PTR OldWndProc= SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WndProc); error=GetLastError(); cout<<"errorcode: "<<error<<endl; SetWindowLongPtrW(hwnd,GWL_USERDATA,OldWndProc); error=GetLastError(); cout<<"errorcode: "<<error<<endl; getch(); }Das Problem is dass das subclassen offenbar fehlschlägt: Wenn ich das Programm (unter Win7) mit Adminrechten ausführe funktionieren EnableSeDebugPrivilege() und OpenProcess() mit Process_all_access fehlerfrei (errorcode 0);
allerdings gibt GetLastError() nach dem Aufruf von SetWindowLongPtr() code 5, also access denied, aus.
Allerdings arbeite ich doch schon mit den für mich höchsten verfügbaren rechten (admin)

Gibt es irgend eine möglichkeit das recht zum subclassen der Konsole zu erhalten? wenn ja wie?
[das mit dem SeDebugPrivileg habe ich einfach mal versucht weil ich dachte es könnte was nützen, denn soweit ich weiß gibt es kein spezielles privileg zum subclassen (liste: http://msdn.microsoft.com/en-us/library/bb530716(v=VS.85).aspx ); da habe ich zumindest keins gefunden
][edit: ich hoffe mal ich gehe recht in der annahme in den prozess cmd.exe keine dll injezieren zu müssen da es sich ja um keinen fremden prozess handelt]
danke schonmal,
andi01.
-
Konsole selber bauen?
-
da muss es doch einen einfacheren weg geben, oder? es scheitert doch schließlich nur an den rechten meines prozesses...
edit: ich habe es sogar schon als "echter" admin versucht, also am konto "Administrator" eingeloggt und mit "als Admin ausführen" getestet;
unverändertes ergebnis
: ERROR_ACCESS_DENIED(übrigens wird mir auch als "echter" admin das SeTcbPrivileg verweigert, obwohl es mir wahrcheinlich helfen würde weil es mir systemrechte verschafft und das system nunmal uneingeschränkten zugriff auf alle prozesse hat da systemrechte nochmal ein ganzes stück über adminrechten liegen!
msdn schrieb:
SE_TCB_NAME,TEXT("SeTcbPrivilege")
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.
sollte also jemand ein gutes beispiel haben wie man zu diesem privileg auf einem anderen weg kommt (denn wenn ich es wie mit demSe DebugPrivileg mache bekomme ich auch als "echter" admin error 1300 (mein account hat keine ausreichenden rechte (systemrechte) wäre ein funktionierendes codebeispiel äußerst hilfreich!)
danke schonmal,
andi01.
-
edit:
ja, endlich habe ich eine Lösung für das Problem mit dem SeTcbPrivileg gefunden:unter win7 professional 32 bit mit Adminrechten:
-'lokale Sicherheitsrichtlinien' aufrufen
->Lokale Richtlinien
->Zuweisen von Benutzerrechten
->Doppelklick auf 'Einsetzen als Teil des Betriebssystems'
->Klick auf 'Benutzer oder Gruppe hinzufügen'
->Klick auf Objekttyoen
->Haken bei 'Gruppen' setzen
->OK
->Erweitert
->Jetzt suchen
->'Administratoren' markieren
->OK
->OK
->Übernehmen
->OK
NEUSTART->rechtsklick auf gekompilerte exe
->Als Administrator ausführendamit hat's bei mir geklappt das SeTcbPrivileg als Mitglied der Admin-Gruppe zu erhalten.
aber leider kriege ich immernoch ERROR_ACCESS_DEIED beim subclassen der Konsole

Weiß jemand wie ich das REcht zum Subclassen der Konsole bekomme?
danke schonmal,
andi01.