Embedded Visual C++ 4 Crash bei “Loading Class Information”
HEute habe ich den Pocket PC 2003 SDK installiert, daraufhin hat sich mein Embedded Visual C++ 4 beim LAden jedes Porjketes mit einem Crash verabschiedet, während unten in der Statusbar “Loading Class Information” stand. Dies war auch beim Erstellen neuer Projekte der Fall.
Im Internet fand ich ein paar Leute, die ähnliche Probleme hatten, aber deren Lösung war allesamt eine komplette Neuinstallation aller Windows CE Tools nach vorherigem Registry Cleanup usw., also viel zu aufwändig.
Natürlich musste ich das Ganze wieder zum Laufen bringen, also habe ich mir das Problem mit OllyDbg angesehen und habe so festgestellt, dass er scheinbar beim Parsen der verfügbaren Plattformen einen NULL-Zeiger referenziert.
Folglich habe ich mir in der Registry den Pfad HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Tools\Platform Manager angesehen und bin drauf gekommen, dass es dort den Schlüssel {6D5C6210-E14B-11D2-B72A-0000F8026CEE} gab, dessen Standard-Wert und Unterschlüssel alle leer waren.
Ich habe diesen Schlüssel daher entfernt, weil als Standardwert normalerweise der Name der Plattform stehen sollte (wenn nichts drinsteht ist es logischerweise NULL, was von eVC aber nicht geprüft wird). Und siehe da: eVC 4 funktioniert wieder!
Visual Studio Hänger beim Debuggen lässt GUI “einfrieren”
Ich habe ab und zu das merkwürdige Problem, dass beim Debuggen mit Visual Studio bei einem Breakpoint oder Crash in manchen Threads das ganze GUI-System quasi einfriert.
Alle Aktionen funktionieren nur noch sehr, sehr langsam und man kann Minuten lang warten, bis sich etwas tut.
Jemand dürfte dasselbe Problem gehabt haben und hat sich die Mühe gemacht, es zu debuggen:
virtualdub.org Blog
Schuld am einfrieren scheinen die erweiterten Textdienste mit einer globalen Mutex zu sein. Es wird daher emfpohlen, diese zu deaktivieren, da sie ja ohnehin keinen sonderlichen Nutzen bringen und eben auch zu diesem Hänger führen können:
Systemsteuerung/Regions- und Sprachoptionen/Sprachen/Details…./Erweitert/[x] Alle erweiterten Textdienste deaktivieren
Dann sollte endlich Ruhe sein.
Installation eines HighDefinition Audiotreibers unter windows XP SP3
Bekanntlich gibt es ja mit bestimmten High-Definition Audio Treibern Probleme unter Windows XP, wenn SP3 bereits in der InstallationsCD integriert ist. Grund dafür ist ein fehlender Patch, welcher bei SP2 dabei war, aber scheinbar in SP3 fehlt.
Nun kann man diesen aber bei schon ebstehenden SP3 nicht mehr so einfach nachinstallieren.
Hierfür gibt es eine einfache Lösung, die folgender Forumthread zeigt:
http://forums.majorgeeks.com/showpost.php?p=1231476&postcount=2
Prinzipiell ändert man einfach
HKLM\SYSTEM\CurrentControlSet\Control\Windows\CSDVersion value auf 200, installiert dann kb888111xpsp2.exe, und ändert den Wert anschließend wieder auf 300 zurück.
Symbian S60 Zertifikat erstellen
Die meiner Meinung nach einfachste Seite, auf welcher man ein Symbian S60 Zertifikat für sein Mobiltelefon erstellen kann, findet sich hier:
http://www.nokiaport.de/s60devcertgen.htm
Möchte man ein Zertifikat für den Emulator erstellen, als IMEI einfach 000000000000000 eingeben.
HiPath 3800 mit HG1500 Baugruppe via SIP an Asterisk und Skype anbinden
Mir hat sich vor Kurzem die Aufgabe gestellt, Skype an unsere interne Telefonanlage anzubinden. Denn ich hasse es, wenn ich mittels Headset bzw. Mikrofon und Lautsprecher am PC telefonieren muss, statt bequem das Telefon nutzen zu können. Generell halte ich ja nicht sehr viel von Skype, und versuche daher, wenn möglich, SIP bzw. offene Standards zu verwenden anstatt diesem proprietären, undurchschaubaren Ressourcenfresser. Aber wie dem auch sei, diese Aufgabe galt es zu bewältigen.
Zum Thema Anbindung der HG1500 an Asterisk habe ich diese bebilderte Anleitung gefunden. Sie ist allerdings etwas lückenhaft dokumentiert und beinhaltet für mich unnötige Schritte wie das Anlegen von virtuellen Klappen. Ich habe daher beschlossen, hier eine komplette Schritt-für-Schritt Anleitung zu zeigen, wie ich es bewerkstelligt habe.
Voraussetzungen:
- HiPath Manager E für die Telefonanlage mit entsprechenden Benutzerprivilegien
- HG1500 Baugruppe
- Asterisk Server
1) Als erstes muss man der HiPath mindestens eine IP-Leitung zur HG1500 zur Verfügung stellen (Typ: IP Trunking)
2) Das Hinzufügen des IP-Trunnks fügt auch eine neue Richtung hinzu, nämlich “Rtg. 16”. Zwecks Übersichtlichkeit kann man diese auf TCP/IP umbenennen:
3) Nun wechselt man in die Wahlplan-Maske (Einstellungen / Automatische Wegsuche… / Wahlplan) und klickt dort auf den Button “Wahlregeltabelle”, um eine neue Wahlregel zu erstellen:
4) Nun kann man einen Wahlplan erstellen. Ich hab einen bei mir noch nicht belegten freien Nummernkreis (400-499) hergenommen und eine Wahlregel damit erstellt. Die gewählten Ziffern sind folglich bei mir: -4XX
Für die Routung habe ich eine neue Wegetabelle hinzugefügt, welche Richtung TCP/IP geht und unsere soeben erstelle Wahlregel (HG1500 SIP) verwendet.
Diese Wegetabelle wird dann der Ziffernfolge zugeordnet:
Die Einrichtung der HiPath3800 ist damit abgeschlossen (Neue Konfiguration in Anlage laden) und man kann sich der Konfiguration der HG1500 widmen.
Bei der HG1500 ist noch anzumerken, dass man die Werte ändern kann, indem man links in der Baumstruktur jeweils rechts klickt und aus dem Kontextmenü die entsprechende Aufgabe wählt. Das ist etwas gewöhnungsbedürftig und nicht gerade sehr benutzerfreundlich, aber egal.
5) Unter Explorer/Sprachgateway/PBX/Knoten wird ein neuer Knoten angelegt.
Das LAN-Trunking Protokoll ist “Native SIP”, die Knotenüberwachung sollte deaktiviert werden. Es ist die IP des Asterisk-Servers einzutragen:
6) Nun ist noch eine Routen-Rufnummer unter “Routing” hinzuzufügen. Als Rufnummer nimmt man einfach den Präfix des verwendeten Nummernkreises, in meinem Fall also 4:
Per Klick auf die Floppy speichert man die Einstellungen ab.
Die Einrichtung der Telefonanlage ist nun abgeschlossen, nun muss noch Asterisk konfiguriert werden, um mit der HG1500 zu reden. Dies ist relativ einfach:
sip.conf
[hg1500sip]
type=peer
host=192.168.210.26 ; IP Adresse der HG1500 eintragen
canrenvite=no
insecure=very
qualify=no
nat=no
disallow=all
allow=ulaw
allow=alaw
context=home
In der extensions.conf sind dann die entsprechenden Klappen einzutragen.
Eingehen wird man den 4XX Zuweisen, also z.B., wenn man so wie ich in meinem Beispiel Skype mit anbindet:
exten => 499,1,Dial(SIP/skype/echo123)
Ausgehend in die HiPath habe ich andere Klappen genommen als jene, die man auf der HiPath hat, weil das bei mir mit anderen Telefonen am Asterisk kollidieren würde. Daher habe ich ein stuipides Mapping im 500er Nummernkreis ohne Makro gemacht (oh Graus! Aber zum Testen ausreichend):
exten => 500,1,Dial(SIP/100@hg1500sip,30,tTr)
Nun asterisk mit der neuen Konfiguration neu laden:
asterisk -r
reload
So, nun muss noch Skype angebunden werden.
In der sip.conf trägt man auf der Asterisk für den jeweiligen PC, auf welchem die Skype-instanz zur Vermittlung läuft, einen Abschnitt ein:
[skype]
username=skype ; use same as in brackets above
type=friend
context=home ; Most people will use "default" here, but I have "home"
secret=skypepwd ; password for authentication
host=dynamic ; if not dynamic, you will need to set port also
nat=no
dtmfmode=auto
canreinvite=no ; possibly set to yes if you know what you are doing
qualify=yes ; optional
defaultip=192.168.210.35 ; optional - ip of the client where instance is running
incominglimit=1
outgoinglimit=1
call-limit=1
busylevel=1
Dies kann man mit dem kleinen Programm siptosis bewerkstelligen.
Auf dem Rechner, welcher das Routing übernimmt, muss der fette Skype-Client installiert sein. Das Programm kommuniziert über die Skype-API mit dem Programm.
Als Version empfiehlt sich Version 3.8.0.188, da diese vom Ressourcenverbrauch her noch halbwegs im erträglichen Rahmen ist (SkypeExtras bitte nicht mitinstallieren) und außerdem keine Probleme mit siptosis macht. Bei den neusten Verisonen von Skype hatte ich diesbezüglich Probleme beim Stummschalten des Audioequipments am PC und ich hatte mit Abbrüchen des Audiostreams zu kämpfen.
Man kann sich theoretisch auch einen Telefonieserver einrichten, wo man mehrere Skype-Instanzen unter verschiedenen Usern laufen lässt.
Für nähere Fragen hierzu einfach einen Kommentar hinterlassen.
In SkypeToSipAuth.props trägt man die Weiterleitung von eingehenden Skype-Telefonaten auf die entsprechende Klasse an der ASterisk ein, welche wiederum aufgrund der Regel in der extensions.conf in die HiPath weiterroutet:
*,sip:500@192.168.210.13:5060
Die siptosis.cfg muss entsprechend auf den Rechner angepasst werden.
Lässt man mehrere Instanzen auf demselben Rehcner laufen, muss man ggf. den Port immer entsprechend anpassen, damit die Instanzen koexistieren können. Auch iher im Beispiel wird nicht der Standardport 5060, sondern 5070 genommen, um mit eventuellen SIP Softphones am PC friedlich koexistieren zu können.
#via_addr generally should be your PC's IP address.
via_addr=192.168.210.135
#Sample Asterisk registration example - comment out NO registration info above first and uncomment the following.
host_port=5070
realm=asterisk
expires=3600
do_register=yes
minregrenewtime=120
regfailretrytime=15
contact_url=sip:skype@192.168.210.135:5070
from_url="skype"
username=skype
passwd=skypepwd
Das sollte es mehr oder weniger gewesen sein. Man kann nun versuchen, echo123 von der Telefonanlage aus anzurufen.
Bei Fragen, einfach Kommentar hinterlassen.
Rfc2898DeriveBytes in plain C with Win32 Crypto API
Ich habe unlängst Fremdherstellercode gesehen, welcher leidergottes in .NET programmiert war und auch Cryptographiefunktionen verwendet hat.
Nun stellt sich für den Win32 Native-Programmierer natürlich die Frage, wie er mit den so erstellten Daten umgehen kann, um den Datenstrom ver/entschlüsseln zu können.
Zum Einsatz kam im .NET Code die Funktion Rfc2898DeriveBytes:
Rfc2898DeriveBytes bytes2 = new Rfc2898DeriveBytes(Password, keySalt);
Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(Password, IVSalt);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
stream = new CryptoStream(stream2, provider.CreateDecryptor(bytes2.GetBytes(8), bytes.GetBytes(0x10)), CryptoStreamMode.Read);
Nach einiger Recherche stellte sich heraus, dass diese PBKDF2 implementiert, welche in der Win32 CryptoAPI wincrypt.h wohl noch nicht implementiert ist.
Was also tun?
Glücklicherweise fand ich die Funktion “SpcPBKDF2” im Secure programming cookbook for C and C++ in C implementiert.
Diese lässt sich dann leicht in eine kompatible Version Wrappen:
BOOL Rfc2898DeriveBytes (char *pszPassword, BYTE *pbSalt, DWORD cbSalt, BYTE *pbOut, DWORD cbOut)
{
return SpcPBKDF2 (pszPassword, lstrlen(pszPassword), pbSalt, cbSalt, 1000, pbOut, cbOut);
}
Der dort angegebene Democode hat allerdings einen kleinen Fehler:
In PKCS5FinalPRF steht
while (dwIteration < dwIterations)
wobei dwIteration nie inkrementiert wird, richtig ist also
while (dwIteration++ < dwIterations)
Sonst funktioniert der Code allerdings ausgezeichnet.
Ich habe das Ganze in ein C-Modul zum download online gestellt:
pbkdf2.c
Nun gilt es noch, den DESCryptoServiceProvider zu implementieren.
Dies geht im Prinzip recht einfach mit der Win32 Cryptoapi mit CryptImportKey und CryptDecrypt. Ich habe eine einfache Implementierung ohne Errorchecking hier ebenfalls mal Online gestellt:
des.c
Damit lässt sich das Ganze dann auch in einer vernünftigen Programmiersprache abbilden :)
Windows Mobile POOM API, Fehler in pimstore.h
In der Datei pimstore.h wird im Windows Mobile SDK (Version 5 – 6.5) die COM-API definiert, welche zum Ansprechen des Pocket Outlook Objektmodells (POOM) verwendet wird.
Seit Windows Mobile Version 5 gibt es endlich auch eine IItem Klasse, mit welcher man auf die generischen Properties eines PIM-Items zugreifen kann.
Leider fehlt die Deklaration des Objekts für das C-only Interface, sodass man als C-Programmierer gezwungen ist, sich selber seine Interface-Definition zu schreiben.
Ich hab mir mal die Mühe gemacht, das Interface händisch zu deklarieren. Ich hoffe, es kann wer brauchen:
#if !defined(__cplusplus)
DEFINE_GUID(IID_IItem, 0xfb8998d0, 0x38f0, 0x4d12, 0xac, 0x56, 0x4e, 0xc8, 0xfc, 0xe9, 0xf3, 0xd5);
typedef struct IItemVtbl
{
BEGIN_INTERFACE
// IUnknown
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
IItem __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
IItem __RPC_FAR * This);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
IItem __RPC_FAR * This);
// No IDispatch, inherits directly from IUnknown
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetProps )(
IItem __RPC_FAR * This,
const CEPROPID* rgPropID,
ULONG ulFlags,
WORD cProps,
CEPROPVAL** prgVals,
ULONG *pcbBuffer,
HANDLE hHeap);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetProps )(
IItem __RPC_FAR * This,
ULONG ulFlags,
WORD cProps,
CEPROPVAL* rgVals
);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Save )(
IItem __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Delete )(
IItem __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Display )(
IItem __RPC_FAR * This,
HWND hwndParent);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Edit )(
IItem __RPC_FAR * This,
HWND hwndParent);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Copy )(
IItem __RPC_FAR * This,
/* [retval][out] */ IItem __RPC_FAR *__RPC_FAR *ppolCopy);
/* [propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Oid )(
IItem __RPC_FAR * This,
/* [retval][out] */ long __RPC_FAR *poid);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OpenProperty )(
IItem __RPC_FAR * This,
CEPROPID propID,
DWORD dwMode,
IStream **ppStream);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_DefaultItemType )(
IItem __RPC_FAR * This,
int *polItem);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Application )(
IItem __RPC_FAR * This,
IPOutlookApp **ppolApp);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Parent )(
IItem __RPC_FAR * This,
IFolder **ppIFolder);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddCategory )(
IItem __RPC_FAR * This,
LPCWSTR pszwCategory);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveCategory )(
IItem __RPC_FAR * This,
LPCWSTR pszwCategory);
END_INTERFACE
} IItemVtbl;
interface IItem
{
CONST_VTBL struct IItemVtbl __RPC_FAR *lpVtbl;
};
#endif
Toad for Oracle 10 bringt Oracle 9.2.0.2 Server zum Absturz
Der heutige Tag begann alles Andere als gut.
Um 8 Uhr bekam ich den Anruf, dass sich niemand mehr auf der Datenbank einloggen kann, alles steht, nichts geht mehr. Sowas hört man doch gerne in alle Früh, zumal mir schon am Vortag ein Internetverbindungsproblem mit dem Kabelmodem unseres Providers die gute Laune verdorben hat.
Eine kurze Überprüfung ergab, dass die Datenbank wirklich nicht mehr lief. Datenbank neu gestartet und alles funktionierte wieder. Aber nur für ca. 3 Stunden, dann war sie plötzlich wieder down.
Grund genug, sich einmal das Logfile /oracle9/admin/dba/bdump/alert_dba.log anzusehen.
Thu Dec 16 14:10:17 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_20397.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:10:17 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_20397.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:17:10 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21514.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:17:10 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21514.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:18:12 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21687.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:18:12 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21687.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 19:43:12 2010
Thread 1 advanced to log sequence 2304
Current log# 2 seq# 2304 mem# 0: /udsk_d01/dba/redo02.log
Thu Dec 16 21:30:05 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_16097.trc:
ORA-00600: internal error code, arguments: [kqrfrpo], [0x5AECABA4], [11], [], [], [], [], []
Thu Dec 16 21:30:05 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_16097.trc:
ORA-00600: internal error code, arguments: [kqrfrpo], [0x5AECABA4], [11], [], [], [], [], []
Also gegen 14 Uhr kam ein Internal Error 12333. Danach lief die DB noch ein paar STunden, bis sie dann schließlich mit internal Error kqrfrpo crashte.
Netterweise bietet Oracle in /oracle9/admin/dba/udump/ die entsprechenden Dumpfiles an. Hierbei entdeckte ich beim jeweils ersten Crash, welchem dann die anderen Crashes oft erst nach Stunden folgten, dass dort
(CID=(PROGRAM=]
A97FE80 505C3A43 72676F72 656D6D61 6575515C [C:\Programme\Que]
A97FE90 53207473 7774666F 5C657261 64616F54 [st Software\Toad]
A97FEA0 726F6620 61724F20 20656C63 545C3031 [ for Oracle 10\T]
A97FEB0 2E64616F 29657865 534F4828 43503D54 [oad.exe)(HOST=PC]
im Memory Dump drinnnen stand.
Dies machte mich dann doch etwas stutzig. Error 12333 tritt ja u.A. auf, wenn ungültige Daten von einem Client übermittelt wurden.
Schließlich fand ich im Internet dann auch noch folgenden Thread:
http://tech.dir.groups.yahoo.com/group/toad/message/51012
welcher ebenso sehr große Parallelen zu meinem Fall aufwies.
Ich habe dann den betreffenden User informiert, und der bestätigte mir, dass er TOAD 10 seit dem Vortag einsetzt und dieser aber auch schon so manchen komischen Fehler geliefert hat.
Auch der Verwendungszeitpunkt passte genau zusammen, sodass hier durchaus ein kausaler Zusammenhang vermutet werden kann.
Ich habe den betreffenden Benutzer dann gebeten, das Programm nicht mehr zu benutzen. Bis jetzt läuft die Datenbank wieder stabil ( so wie sie 2 Jahre lang auch schon gelaufen ist).
Falls jemand ein ähnliches Problem haben sollte, hier ist die Konstellation, die das verursachte:
Client: Oracle 8i client und Toad for Oracle 10
Server: Oracle 9.2.0.2
Eventuell irgendein Speicherüberschreiber, der damit zur nachhaltigen Destabilisierung des DB-Servers führt?
TOAD 7.5.2.0 läuft übrigens ohne Probleme.
kvm (KernelVirtualMachine) mit WinXP Gast
Nachdem XEN als virtuelle Maschine doch relativ kompliziert aufzusetzen ist, gibt es seit einiger Zeit eine sehr nützliche Alternative, nämlich die KVM, die im Kernel bereits integriert ist und sehr einfach zu installieren ist.
Noch dazu haben einige führende Linux-Distributoren bereits angekündigt, in Zukunft eher auf KVM zu setzen als auf XEN.
Grund genug, KVM einmal auszuprobieren. In meinem Fall wollte ich eine virtuelle Windows XP VM aufsetzen.
Das Aufsetzen ging relativ einfach über PXE (dazu brauche ich dann nicht extra die XP CD rüberzukopieren), Anleitungen hierfür findet man genug im Internet, z.B. hier. Mit dd erstellt man einfach ein leeres Image und verwendet dieses dann als virutelle HDD. Angeblich kann man sogar VMware-Images mit KVM booten, habe ich aber nicht ausprobiert. Über die Installation einer Netzwerkbridge für kvm werde ich mich jetzt hier nicht detailliert auslassen, Anleitungen hierzu gibt es ansich genügend im Internet.
Interessant sind vielmehr die Problemchen, auf die man so stößt:
So hatte ich beispielsweise, das Problem, dass der Mauscursor im VNC nicht exakt mit meinem client-Mauscursor mitfuhr, also ich hatte einen offset, welcher sich immer mehr vergrößerte. Das ist in der Praxis dann eher mühsam.
Abhilfe schafft hier folgender zusätzlicher Startparameter für kvm:
-usbdevice tablet
Nun stellt sich dann noch das Problem des Herunterfahrens der virtuellen Maschine.
Grundsätzlich kann man dies mit dem ACPI Poweroff-Signal erledigen. Hierzu bindet man den Monitor des qemu, welcher die Emulation der virtuellen CPU vornimmt auf einen Socket, z.B. mit:
-monitor "unix:/var/run/kvm/monitors/winxp,server,nowait"
Beim Herunterfahren sendet man dann ein ACPI Poweroff mit:
echo 'system_powerdown' |socat - unix-connect:/var/run/kvm/monitors/winxp >/dev/null
Das Problem bei Windows XP mit dieser Lösung ist jedoch, dass auf dem Hauptschirm hier eine Dialogbox erscheint, die fragt, ob man wirklcih herunterfahren möchte, da noch Benutzer angemeldet sind (zumindest soweit dies der Fall ist). Nachdem man eine virtualisierte Windows XP Maschine höchstwahrschienlich mittels RemoteDesktop verwenden möchte, hat man also mit großer Wahrscheinlichkeit diese Dialogbox stehen und der Gast fährt nicht herunter.
Bei Windows Server 2003 gäbe es hierfür eine Lösung, indem man folgenden Timeout-Wert in die Registry einträgt:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"ShutdownWarningDialogTimeout"=dword:00000001
Bei Windows XP ist dies jedoch wirkungslos. Nun gäbe es noch einen anderen Trick, und zwar, indem man Windows mitteilt, dass es auf alle Fehlermeldungen automatisch mit der Standardantwort antwortet:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Error Message Instrument]
"EnableDefaultReply"=dword:00000001
Doch auch dies stellt keine zufriedenstellende Lösung dar, da hier z.B. dann auch der Dialog “Neue USB-Hardware gefunden, wollen Sie neustarten?” standardmäßig mit Ja beantwortet wird, was einen ungewollten Neustart der Maschine zur Folge hat.
Die für mich am praktikabel erscheinendste Lösung ist daher, dem Rechner über RPC mitzuteilen, dass er bitte ohne Wenn und Aber herunterfahren möge.
Hierzu muss in Windows die einfache Dateifreigabe ggf. deaktiviert werden (WIN+E/Extras/Ordneroptionen/Ansicht/[ ] Einfache Dateifreigabe verwenden).
Weiters muss die Windows Firewall abgeschaltet werden (Systemsteuerung/Windows Firewall).
Danach kann man vom Linux-Hostsystem aus mit Kenntnis der IP-Adresse des Systems, und vorausgesetzt, man hat SAMBA installiert, den Rechner mit folgendem Kommando herunterfahren:
net rpc SHUTDOWN -C "The system is going down for SHUTDOWN now" -f -I [IP der VM] -U [Benutzer]%[Passwort]
Der Benutzer muss natürlich ein authorisierter Benutzer sein, welcher Rechte zum Herunterfahren hat, z.B. der Administrator.
Ich hoffe, das hilft dem Einen oder Anderen weiter, der vor dem selben Problem steht und aggregierte Informationen hierzu haben möchte.
Visual C 7 oder höher Projekte auf VC6 konvertieren
Sehr nützlich: Codeproject