我正在尝试将我的驱动程序重写为 OOP 架构,并且当我没有任何 std::XXXX 以及传递函数本身的参数时,我面临着调用回调等方法的问题通过模板。
所以我有以下课程:
class Log {
public:
/*static*/ VOID LogNotifyUsermodeCallback(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2);
NTSTATUS LogRegisterIrpBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS LogRegisterEventBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp);
};
我还有以下代码:
NTSTATUS Log::LogRegisterIrpBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
//Some line of code....
KeInitializeDpc(&NotifyRecord->Dpc, // Dpc
LogNotifyUsermodeCallback, // DeferredRoutine
NotifyRecord // DeferredContext
);
//Some line of code....
}
DeferredRoutine 具有以下调用参数的模式:
VOID Log::LogNotifyUsermodeCallback(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
我不能将LogNotifyUsermodeCallback方法称为静态方法,因为参数是通过模板传递到那里的,并且该方法本身也调用了Log类的其他方法,我没有其他想法。所以,主要问题是:在所有这些条件下,我如何调用 LogNotifyUsermodeCallback 作为回调方法?
C++ 注册函数的方式是
std::function
,而 C 处理注册的方式是函数指针 + userData 指针。
// From library
using callBackType = Ret (Arg1, Arg2, void* /* userData */);
void registerCallback(callBackType* f, void* userData);
// Your code
struct Obj
{
static Ret MyStaticCallBack(Arg1 arg1, Arg2 arg2, void* userData) {
Obj* self = reinterpret_cast<Obj*>(userData);
return self->MyMethod(arg1, arg2);
}
Ret MyMethod(Arg1 arg1, Arg2 arg2);
};
然后您注册回调的代码将是:
Obj my_object;
registerCallback(&Obj::MyStaticCallBack, my_object);