Wednesday, 18. October 2006Cursed GTK package
Bei meinen Recherchen zu einem GUI-Toolkit, welcher Win32 und Linux unterstützt und wenn möglichst auch noch eine rudimentäre Terminal-Darstellung zur einfacheren Wartung bietet, bin ich auf das folgende geniale Projekt gestoßen:
Cursed GTK. Lädt man diese Bibliothek beim Laden einer GTK-Anwendung auf der Shell, so bekommt man eine ncurses-Oberfläche mit den wichtigsten Widgets. Somit ist es zumindest möglich, einfache Wartungsprogramme ohne viel Aufwand mit dem GLADE Userinterface builder zu basteln, welche gleichzeitig auch von der Shell aus noch bedienbar sind, sofern man sich auf einfache Widgets beschränkt. Das Projekt hat nur leider den Nachteil, dass es seit Ende 2003 nicht mehr weitergewartet wird. Dementsprechend basiert es auch auf etwas älteren Libraries und funktioniert u.A. mit aktuellen Versionen der libpango (Teil von GTK) nicht mehr. Eine ältere libPango lässt sich wiederum nicht mehr ohne herumpatchen mit einer neueren Freetype-Version kompilieren usw. Kurzum: Das Ganze ist leider recht mühselig einzurichten. Um einem diesen Aufwand zu ersparen, habe ich mir die Mühe gemacht, di ebenötigten Bibliotheken zu kompilieren und das Installationsscript der RPM-PAkete entsprechend zu fixen, sodass man eine Lösung hat, welche nur noch mit einem Shellscript installiert werden muss und dann automatisch mit den richtigen Bibliotheken out-of-the-box läuft. Das Paket kann man sich hier herunterladen. Sofern man rpm benutzen kann, muss man nur install.sh ausführen und im Besten Fall installiert sich das Paket von selbst. Es ist allerdings darauf zu achten, dass sich das Verzeichnis des PAkets nach der Installation nicht mehr ändern darf, da man die in dne Unterverzeichnissen enthaltenen Bibliotheken zum Laden der jeweiligen Applikation benutzen muss.Starten kann man eine GTK-Applikation im Textmodus mittels des enthaltenen Shellscripts runcursed.sh .Möchte man das Ganze wieder deinstallieren, so muss man nur uninstall.sh ausführen.Hat man Debian und damit kein RPM zur Verfügung, kann man sich mit ein wenig Bastelei mit alien behelfen.Auf jeden Fall ist das Ganze nach wie vor eine interessante Bibliothek. Bleibt nur zu hoffen, dass sich irgendwann wieder um dieses verwaiste Projekt annimmt. Tuesday, 10. October 2006Hohe CPU-Auslastung durch DOS-Programme in ntvdm vermeiden
Heute bin ich zufällig beim Surfen über folgenden interessanten Forumpost gestolpert:
http://www.softgames.de/forum/frage117849.html Der Autor vermindert damit das Problem, dass DOS-Programme, die sehr oft die Tastatur pollen, die CPU den Rechners, auf welchem sie in der NTVDM rennen, auf Vollast bringen. Eine einfache und dennoch sehr praktische Lösung in Form eines TSRs hat der Autor in seinem Beitrag vorgestellt. Thursday, 28. September 2006TreeView-Items ohne bzw. fixen Checkboxen
Das TreeView-Control der Windows Common Controls bietet unter Anderem die Möglichkeit, vor jedem Eintrag Kontrollkästchen (Checkboxen) zu platzieren, die mit Tastatur und Maus beliebig ein- und ausgeschaltet werden können.
Hierzu muss einfach der Style TVS_CHECKBOXES gesetzt werden.Als Checkboxen-Bildchen werden sogenannte StateImages verwendet. Leider bietet Windows keinen Einfluss auf die Automatik, die hinter dem Toggeln der Checkbox liegt. Eine Funktion wie TVN_SELCHANGING nur für das Ändern des Kontrollkästchen-Status wurde also scheinbar vergessen. Das ist insbesondere dann ärgerlich, wenn man einen User daran hintern möchte, den Status einer Checkbox zu ändern oder wenn man einfach nur eine Notification erhalten möchte, wenn der User den Status einer Checkbox ändert.Es bleibt einem daher nichts anderes übrig, als die selben Nachrichten, die von der Window-Routine zum Ändern des Checkbox-Status herangezogen werden, in einer Subclassing-Procedure entsprechend zu filtern. Bevor wir uns nun näher ansehen, wie das Ganze funktioniert, sei noch der Geheimnis gelüftet, wie man für einen einzelnen Eintrag kein Kontrollkästchen anzeigt: Hierzu nimmt man den Index 3 mittels des Makros INDEXTOSTATEIMAGEMASK für den state -Parameter des Treeview-Items. Benutzt man diesen Parameter, hat man aber das Problem, dass Windows den Status der Checkbox beim nächsten Klick auf die Stelle, wo sich das Kontrollkästchen befinden sollte, oder beim Drücken der Leertaste, munter weiter toggelt und das Kontrollkästchen so wieder von selbst erscheint. Mit dem hier gezeigten Lösungsansatz kann dieses Problem gelöst werden:Grundsätzlich wird einfach eine Subclassing-Procedure für das TreeView installiert, welche Tastendrücke ( WM_KEYDOWN ) auf die Leertaste (VK_SPACE ) und Mausklicks mit der linken Maustaste (WM_LBUTTONDOWN ) filtert. Eben jene Nachrichten also, die zum Toggeln der Checkboxen verwendet werden. Beim Mausklick muss natürlich noch zusätzlich überprüft werden, ob die Koordinaten des Mauscursors auf ein StateItem zeigen (TVHT_ONITEMSTATEICON ) und ob das Item zum aktuell gewählten Item gehört.Sind diese Bedingungen erfüllt, so wird geprüft, ob es sich um ein leeres Item handelt (der Index in die Stateimagemask also 3 ist). Ist dies der Fall, so erfolgt keien weitere Behandlung der Nachricht durch die originale Windowprocedure und damit kein Toggeln des Status. Prinzipiell ist das Ganze also relativ einfach. Das Beispiel sollte auch leicht modifizierbar sein, sodass eine entsprechende Notification gesendet wird, wenn sich der Status einer Checkbox ändert o.ä. Für Fragen und Anregungen gilt natürlich wie immer: Einfach einen Kommentar hinterlassen. Das komplette Codefragment mit der Realisierung des Ganzen gibt es hier Tuesday, 29. August 2006ToolTips für TreeView-Einträge
Manchmal kann es praktisch sein, dem User zu den einzelnen Einträgen in einem TreeView zusätzliche Informationen anzuzeigen. Wie unter Windows üblich, kann man dies mittes eines ToolTips bewerkstelligen.
Standardmäßig zeigt das TreeView-Control nur dann Tooltips an, wenn der Text des Eintrags abgeschnitten wird, sofern das Quickinfo flag gesetzt ist. Will man jedoch Tooltips zu einzelnen Einträgen anzeigen, findet man keine entsprechende Funktion dafür. Man ist daher forciert, das Ganze selbst auszuprogrammieren. Sucht man im Internet nach entsprechenden Informationen, findet man leider nur MFC-Codebeispiele. Grundsätzlich ist die Lösung jedoch relativ einfach: Mittels des Filtern der Windowmessage WM_MOUSEMOVE des Treeview-Controls kann man die Position des Mauscursors auf dem Control herausfinden und mittels TreeView_HitText prüfen, ob dieser sich über einem Eintrag befindet. Um dies realisieren zu können, muss das Control gesubclassed werden (dies geschieht in bekannter Weise mittels SetWindowLong GWL_WNDPROC . Ist nun das entsprechende Item identifiziert, für welches der ToolTip angezeigt werden soll, so legt man einfach ein Tooltip für das TreeView-Control an, sofern noch keines existiert. Existiert bereits ein Tooltip, so ist einfach der Text des Tooltips entsprechend dem zum Eintrag zugehörigen Text geändert. Damit der Tooltip wieder verschwindet, wenn der Cursor außerhalb des Bereichs von einem Eintrag ist, wird der Tooltip in diesem Fall einfach wieder gelöscht. Um nun den anzuzeigenden Text einem Eintrag zuzuordnen, kann der LPARAM-Parameter verwendet werden. Nachdem man wahrscheinlich noch andere Paramter mitspeichern möchte, wird beim Anlegen eines Eintrags Speicher alloziert, in welchem eine Struktur mit den Parametern, u.a. auch den anzuzeigenden Text, gespeichert wird. Der allozierte Speicher ist daher bei einer TVN_DELETEITEM notification wieder freizugeben.Das komplette Codefragment mit der Realisierung des Ganzen gibt es hier Sunday, 30. July 2006Fehelrhafte Nachrichtenschleifen und ihre Folgen
In einer meiner Applikationen habe ich einen sehr merkwürdigen Bug beim Verhalten einer Combobox bemerkt:
Die Combobox ließ sich zwar ganz normal öffnen, indem man auf den dropdown-Pfeil klickt, allerdings ließen sich beispielsweise keinerlei Items mittels der Maus darin auswählen (mit der Tastatur funktionierte es allerdings). Auch zuklappen konnte man das Dropdown-Feld nicht mehr. Einzig, wenn man ESC drückte, wurden die zuvor ausgeführten Ereignisse abgearbeitet (klcikte man z.B. auf den Dropdown-Pfeil und es tat sich nichts und drückte man dann ESC, so klappe das Auswahlfeld kurz ein und dann wieder aus, weil der MAusklick von zuvoir nun verarbeitet wurde). Nach einigem Rätselraten ob des merkwürdigen Effekts bin ich schließlich auf folgenden News-Beitrag gestoßen, der die Problematik erklärt: Das Dropdown-Menü ist ein seperates Top-Level Fenster, dessen Nachrichten natürlich auch verarbeitet werden müssen. Das Problem war demnach in meiner Nachrichtenschleife, in welcher ich in meiner GetMessage -Funktion nur die Nachrichten meines Hauptfensters und dessen Unterfenster verarbeitete und nicht alle Nachrichten, was das merkwürdige Problem verursachte.Mach sollte der GetMessage -Funktion in der Haupt-Nachrichtenschleife also wenn möglich immer das NULL-Handle übergeben, damit alle Nachrichten verarbeitet werden können. Konkret also:
Wednesday, 21. June 2006Grid control für Win32
Die Standard WIN32-Forms und Common Controls sind ansich sehr praktisch, um benutzerfreundliche Forms anzulegen. Allerdings besitzen sie von Haus aus keine Funktionalität für Grids, wie diese z.B. von Excel her bekannt sind. Nun gibt es zwar zahlreiche Implementierungen von Grids im Internet (die meisten funktionieren mit Hilfe eines ListView-Controls), diese basieren jedoch leider zumeist auf der MFC, sodass hier wieder unnötiger Overhead entsteht. Was aber macht der normale Win32-API Programmierer in diesem Fall? Erst nach langem Suchen bin ich über den Artikel Win32 Grid Control with Low Overhead (BABYGRID) auf codeguru.com gestoßen, welcher eine Implementierung mittels normaler WIN32-API zeigt. Mit ein paar kleinen Fixes lässt sich der Code auf C portieren (es werden leider standardmäßig einige C++ Features verwendet, das Ganze lässt sich jedoch sehr einfach reparieren. Bei Interesse an dem korrigierten Code einfach einen Kommentar hinterlassen). Praktischerweise wird das Control zur Gänze selbst gezeichnet, sodass man auch leicht auf die Optik des Controls Einfluss nehmen kann. Ich habe beispielsweise erfolgreich ein Sudoku-Lösungsprogramm damit realisiert.
Friday, 16. June 2006Microsoft Patch KB914784 Für Win64 problematisch
Der Patch KB914784 von Microsoft fügt zusätzliche sicherheitsfunktoinen in den Kernel ein, die eine Modifikation der internen Strukturen verhindern soll. Leider basieren viele Programme auf Techniken dieser art, sodass diese nach der Installation des Updates nicht mehr funktionieren. Beispielsweise ist das populäre Programm Daemon Tools betroffen (siehe Forumbeitrag). Von der Installation dieses Patches wird daher abgeraten.
Generell verursachen neue Sicherheitsfeatures von Windows oft ziemliche Probleme, sodass diese mit vorsicht zu genießen sind (vgl. Beitrag DEP unter Windows XP SP2 und 16bit Applikationen). Auch hier habe ich heute ein weiteres Programm gefunden, welches im Zusammenhang mit der DEP nicht mehr korrekt funktioniert. Für Microsoft ist es natürlich eine schwierige Entscheidung, einerseits ihr Betriebssystem sicherer zu machen und andererseits die Kompatibilität mit bestehenden Applikationen nicht zu brechen... Thursday, 1. June 2006Tab controls verwenden
Unter Windows gibt es die Möglichkeit, sogenannte Tab controls zu verwenden. Diese sind zum Beispiel für Eigenschaftsseiten ganz praktisch, um mehrere Optionen übersichtlich darstellen zu können.
Gleich vorweg: Windows bietet hierfür eigene Funktionen für Eigenschaftsseiten an, die verwendet werden können: MSDN - PropertySheets Allerdings kann es auc hganz interessant sein, so etwas selbst nachzubauen, vor Allem, wenn man eigentlich keine richtigen Eigenschaftsseiten benötigt: Nachdem das Tab-Control selbst nur Notifications sendet, wenn ein entsprechender Tab angeklickt wird, muss man die Verwaltungs der den Tabs zugehörigen Controls selbst übernehmen. Eine Möglichkeit wäre, alle Controls der jeweiligen Tabs in den Dialog zu geben und von der Nummerierung her so zu wählen, dass immer ein gewisser Bereich an Controls aktiviert, und der Rest beim Wechsel deaktiviert wird. Dies ist jedoch sehr aufwendig zu implementieren und außerdem endet man schnell in einem Kuddelmuddel an Controls. Einfacher ist es, für jede Tab-Seite einen eigenen Child Dialog zu generieren, der dann entsprechend angezeigt wird. Ich habe hierzu etwas generischen Code geschrieben, um zu verdeutlichen, wie dies funktioniert: Zuerst muss das Hauptfenster mit dem Tab Control erstellt werden, welches die anzuzeigenden Subfenster beinhaltet. Auf diesem wird ein Tab-Control mit der ID IDC_TABS erstellt. Ihm wird die unten gezeigte Window Procedure zugeordnet.Danach müssen die entsprechenden Client-Fenster erstellt werden, welche die Styles WS_CHILD | WS_EX_CONTROLPARENT gesetzt haben, da sie ja childfenster sind. Im Ressource Editor hierfür einfach die Häkchen Stile / Untergeordnet, Rand / Keine und Erweiterte Formate / Übergeordnete steuern wählen.Hier nun der code der WndProc für das Tab-Fenster. In das Arrray uDialogs einfach alle Dialoge, die zum Tab gehören eintragen. In pszTitles die zugehörigen Tital, die auf den Tabs erscheinen sollen und in procDialogs kann man schließlich die jeweiligen zugehörigen Window procedures setzen.Alles unklar? Bei Fragen wie immer einfach comment hinterlassen. Sunday, 28. May 2006Generische Erkennung von gepackten/verschlüsselten Dateien
Im Rahmen meines Rootkit-Detector Projekts benötigte ich eine routine, die erkennen kann, ob eine Datei verschlüsselt oder gepackt ist, um eruieren zu können, ob die Datei auf der Festplatte der im Speicher gleichen kann oder nicht.
Auf alle Signaturen aller auf dem Markt befindlichen EXE-Packer/Crypter zu prüfen ist hier kein optimaler Ansatz. Stattdessen sollte die Erkennung möglich generisch sein. Was also tun? Im Prinzip ist die Lösung trivial: Durch was zeichnen sich gepackte Dateien aus? - Durch die Eigenschaft, dass sie sich schwer weiter komprimieren lassen, sprich: ihre Entropie ist möglichst klein. Dies kann man leicht auch mit einem Hexeditor feststellen: Sieht man sich eine gepackte, oder auch eine verschlüsselte Datei damit an, so wird man feststellen, dass es sehr viele unterschiedliche Zeichen gibt, die Zeichenauftrittswahrscheinlichkeit ist also ziemlich gleichmäßig verteilt, während bei unkomprimierten Dateien oftmals viele aufeinanderfolgende gleiche Zeichen vorzufinden sind (z.B. lauter 00 - Bytes). Man kann schon beim Betrachten der Struktur einer Datei mittels eines Viewers mit bloßem Auge sehen, ob eine Datei komprimiert ist oder nicht. Hier ein Beispiel (nicht gepackt vs. gepackt): Ich habe daher ein paar kleine Funktionen zum Prüfen der Entropie einer Datei geschrieben, um abschätzen zu können, ob eine Datei wahrscheinlich gepackt ist oder nicht. Ich habe das Ganze für WIN32 geschrieben, es lässt sich aber sehr einfach auf ANSI-C portieren: Noch etwas zu den Konfigurationsparametern: ENT_FREQ_MAX gibt an, wieviele Bytes der Datei maximal analysiert werden sollen. Diese Begrenzung ist durchaus sinnvoll, da eine Prüfung großer Dateien sonts ineffizient wäre.ENT_EXE_OFFSET gibt an, wieviele Bytes an Anfang der Datei bei der Prüfung übersprungen werden sollen. dies ist sinnvoll, da der header einer Executable normalerweise nicht komprimiert sein kann und die Prüfung daher erst ab dem Codesegment sinnvoll ist (man köntne natürlich den EXE-header analysieren und erst bei merste ncode-segment zu prüfen beginnen, aber der Einfachheit halber habe ich hier darauf verzichtet).ENT_BARRIER gibt den Schwellenwert an, bei dessen Überschreitung eine Datei als nicht gepackt/verschlüsselt gilt. 10 ist hier ein guter Wert.Der Rest dürfte selbsterklärend sein. Bei Fragen --> Comment hinterlassen. Friday, 19. May 200680Bit IEEE float in 64Bit double in MS VC++ umwandeln
Verwendete man beispielsweise unter Borland Turbo C 3 in DOS einen
float oder double Wert, so wurde der als IEEE 80Bit float dargestellt, was logisch erscheint, da die FPU der Intel x86 CPU ebenfalls intern mit dieser Auflösung arbeitet. Ein long double wird beim gcc C-Compiler ebenfalls in diesr Form repräsentiert. Es ist daher auch üblich, in binären Dateiformaten solche Werte vorzufinden.Möchte man nun solche Werte im MS VC++ auslesen, steht man vor einem Problem: Wie der MSDN-Dokumentation zu entnehmen ist, wird dieser Datentyp nicht unterstützt:
Jetzt stellt sich daher die Frage, wie solche Werte ausgelesen und dann auf einen 64Bit breiten double (real*8) konvertiert werden können. Wie ja bereits in der MSDN steht, gibt es auf Assemblerebene Unterstützung für 80Bit breite float Zahlen.Es reichen daher auf der x86 CPU 2 kleine FPU-Assemblerkommandos zur Konvertierung. Man kann sich daher folgende kleine Funktion erstellen, welche eine Konvertierung vornimmt:
Monday, 15. May 2006Dynamische arrays in C
Von C++ her kennt man ja die praktischen Klassen zur dynamischen Datenverwaltung wie
set , map , vector , etc.In C sind vor Allem mehrdimensionale Arrays mit variabler Größe aber durchaus eine Herausforderung. Standardmäßig kann man mehrdimensionale arrays nur fix definieren, z.B.:
Dies ist für den C-Compiler einfach, da er hier nur entsprechend Speicher im DAtensegment reservieren muss, den man dann nach und nach füllen kann. Die dynamische Verwaltung einer solchen Strutkur am Heap ist der Runtime jedoch nicht zumutbar. Grund genug, ein paar kleine eigene Funktionn zu schreiben, um dynamische Arraybäume zu erstellen und verwalten. Die Dokumentation der kleinen Funktionen befindet sich in der Header-Datei, die hier gezeigt wird: Herunterzuladen gibt es die kleine Funktionssammlung hier Monday, 24. April 2006e-Mail und Internet Explorer Seiten - Passwörter auslesen
Bei der Systemmigration hat man oft das Problem, alte e-mails und Bookmarks auf den neuen Windows-Rechner zu transferieren.
Hierfür gibt es einige nützliche Utilities und seit Windows XP gibt es hierfür auch einen eignen Migrationsassistenten. Zur Not reicht es auch, die entsprechenden Dateien zu kopieren, auch wenn die e-mail Accounteinstellungen bei dieser Methode dann verloren gehen, da diese in der Registry abgelegt sind. Für welche Methode man sich auch immer entscheidet, jede hat den Nachteil, dass man die Passwörter der entsprechenden Accounts nicht mitübernehmen kann. Oft stellt dies ein Problem dar, wenn die Passwortinformationen nicht mehr verfügbar sind, z.B. weil die entsprechenden Unterlagen verschmissen wurden. Glücklicherweise gibt es eine Möglichkeit, gespeicherte Passwörter auszulesen: Ich bin heute zufällig beim Suchen nach informationen zum "Protected Storage System Provider" über das nützliche Tool Protected Storage PassView gestolpert. Achtung: Das Tool wird von einigen Antivirusprogrammen fälschlicherweise als Virus erkannt. Thursday, 13. April 2006DEP unter Windows XP SP2 und 16bit Applikationen
Die Data Execution Prevention (DEP) - Funktion wird von aktuellen 64Bit CPUs unterstützt und
soll einen effektiven Schutz gegen die Ausführung von Schädlichem Code bieten. Leider bringt diese Funktion oft mehr PRobleme mit sich, als dass sie nützt. Dummerweise aktiviert Windows XP die Funktion allerdings standardmäßig, so diese von der CPU unterstützt wird, und sie lässt sich auch über die GUI nicht komplett deaktivieren. So hatte ich heute den Fall, dass die 16Bit Microsoft Access 2.0 -Runtime MSARN200.EXE , die von einigen Programmenverwendet wird, um Reports über die Microsoft Access Engine zu generieren, beim Versuch zu Drucken immer mit einer Zugriffsverletzung abstürzte. Es kam keinerlei Meldung von der DEP, dass etwas blockiert worden wäre. Nach Abschaltung der Funktion funktionierte das Drucken allerdings wieder Problemlos. Scheinbar könnte also auch die DEP daran schuld sein, dass manche 16Bit-PRogramme plötzlich nicht mehr so funktionieren, wie sie sollen und einfach abstürzen. Um die DEP abzuschalten, ist den Windows Startoptionen in der Datei hinzuzufügen: /NoExecute=AlwaysOff Dies deaktiviert die DEP permanent. Update 16.06.2006: Nicht nur das Rechtsanwaltsprogramm Advokat hat Probleme mit der DEP, auch das Programm Win1A-Lohn Profi der Firma Schweighofer stürzt mit der Fehlermeldung "Die Methode '~' für das Objekt '~' ist fehlgeschlagen." vor der Eingabe der Lizenznummer ab. Daher mein Rat: DEP abdrehen, es verursacht mehr merkwürdige Probleme, als dass es bringt. Wednesday, 12. April 2006Windows XP auf neues Motherboard transferieren
Gerade im IRC aufgeschnappt:
Eine Anleitung, um Windows XP nach einem Hardwaretausch wieder zum Laufen zu bekommen, was normalerweise ja nicht so einfach ist: http://65.24.134.81/KipSolutions/MovingXPNewMotherboard/MovingXP.htm Tuesday, 14. March 2006Visual Studio 6.0 auf Windows mit Sun Java VM installieren
Die Installation vom imho letzten brauchbaren Visual Studio, nämlich VS 6.0, gestaltet sich unter neueren Windows-Versionen eventuell problematisch.
Der Setup-Assistent besteht nämlich, sofern nicht noch eine alte Microsoft Java VM vorhanden ist, auf die Installation der Microsoft VM. Die der CD beigelegte VM ist natürlich total veraltet und eine Installation dieser bringt teilweise Probleme mit sich, u.A. zerstört sie eventuell die Funktionalität der Sun Java VM. Ohne Installation der MS Java VM lässt sich die VS6 installation jedoch nicht fortsetzen. Nach einiger Suche habe ich schließlich in folgendem Blog eine Lösung für das Problem gefunden: http://msmvps.com/blogs/bill/archive/2004/07/14/10069.aspx Im Prinzip reicht es, vor der Installation unter Start/Ausführen folgende Zeile auszuführen:
Danach kommt die Aufforderung zur Installation der Java VM nicht mehr.
« vorige Seite
(Seite 3 von 8, insgesamt 107 Einträge)
» nächste Seite
|
SucheBlog abonnierenTop ReferrerVerwaltung des Blog |