Also new muss keine exception werfen können, der Standard sieht auch ein new vor, welches keine exception wirft. Bei Treibern kann es schon wieder anders sein, wenn wir kompatibel, dynamisch usw. sein wollen, dann müssen wir sowieso C++-Treiber mit Exception-Handling zulassen.
Die new/delete-Methoden des Treibers könnten z.B. auf eine malloc/free-Version des Kernel zugreifen, aber Back to Topic.
static_cast wirft niemals eine exception, reinterpret_cast wirft niemals eine, const_cast ist Blödsinn -> verboten im Kernel
und dynamic_cast, welches eine exception werfen kann verwendet RTTI, würde ich auch weglassen im Kernel, außerdem vorallem bei Mehrfachvererbung in Verbindung mit virtuellen Funktionenen verwendet.
reinterpret_cast und static_cast funktionieren eh wie C-Cast, also mir wäre es egal ob C-Casts oder C++-Casts
Mal nen beispiel:
//ckernel.h
struct PROCESS
{
DWORD dwID;
//[...]
};
#ifdef __cplusplus
extern "C" {
#endif
void MacheEtwasMitPROCESS(const PROCESS* pProcess);
//[...]
#ifdef __cplusplus
};
#endif
//cppkernel.h
#include "kernel.h"
class CProcess : protected PROCESS
{
public:
DWORD GetId();
//[...]
public:
void MacheEtwas() const;
//[...]
};
//kernel.cpp
#include "ckernel.h"
#include "cppkernel.h"
void MacheEtwasMitPROCESS(const PROCESS* pProcess)
{
static_cast<const CProcess*>(pProcess)->MacheEtwas();
}
void CProcess::MacheEtwas() const
{
//[...]
}
So ungefähr halt.
Wo ist da Arbeitsaufwand?
oder man nimm reinterpret_cast und leitet die Klasse nicht ab, gefällt mir fast noch besser, denn:
// x86.h
class CTSSegment
{
public:
//[...]
protected:
DWORD m_wBackLink; // only low 16-bit are used
DWORD m_dwESP0;
};
// cppkernel.h
#include "x86.h"
class CThread : public CTSSegment
{
public:
void MacheEtwas();
//[...]
protected:
CProcess* m_pProcess;
//[...]
};
// ckernel.h
struct THREAD
{
DWORD dwBackLink; // only low 16-bit are used
DWORD dwESP0;
//[...]
PROCESS* pProcess;
};
// ich spar mir den #ifdef __cplusplus quatsch
extern "C" void MacheEtwasMitTHREAD(THREAD* pThread);
// kernel.cpp
void MacheEtwasMitTHREAD(THREAD* pThread)
{
reinterpret_cast<CThread*>(pThread)->MacheEtwas();
}
void CThread::MacheEtwas()
{
}
Zu dem Problem mit dem Name-mangling oder wie das heißt,
es muss doch möglich sein für jeden Compiler ne .LIB-Datei zu bauen, damit die die C++-Klassen verwenden können. Kann mir mal bitte wer verraten, wie das funktioniert, sonst krieg ich nen Fön
Für Windows gibts doch auch nen DDK, keine Ahnung wie das funktioniert, weiß wer was darüber?
Das umständliche packen in eine c-struct sieht man oben in meinen 2-Code Beispielen
Also, klärt mich mal bitte auf, wie die Treiber unabhängig kompiliert werden. Dazu müssen sie ja wissen, wo die Prozeduren des Kernels liegen.
MfG
DDR-RAM