在进行学习wfp驱动开发,自己写了一个驱动,依赖应用层的exe将驱动拉起,上层进程exe关闭,驱动服务关闭,但是有时候上层进程exe可能会被杀掉,如果上层进程被杀掉,那么我想让驱动也执行unload。不用在进行一些驱动服务。如何在监控到上层进程exe被杀掉了,自行执行unlod函数释放资源
wfp(Windows Filtering Platform)驱动开发中卸载(unload)自己的步骤如下:
在驱动程序中实现DriverUnload例程,该例程在驱动程序被卸载时会被系统调用。
确定需要卸载的设备对象,可以通过保存设备对象的指针或者枚举设备对象来获取。
撤销符号链接,可以使用IoDeleteSymbolicLink函数来删除符号链接对象。
删除设备对象,可以使用IoDeleteDevice函数来删除设备对象。
释放资源,如果有正在使用的资源,可以先通过关闭相关句柄或释放内存等方式来释放这些资源。
最后,在驱动程序的INF文件中设置DelReg键值,以便在卸载驱动程序时自动执行。
需要注意的是,卸载前确保没有任何正在使用的资源,以免出现异常情况。同时,建议在卸载前打开调试信息,以便查看错误信息和调试代码。
可以使用Windows内核提供的进程通知机制(PsSetCreateProcessNotifyRoutineEx)来实现监控进程的创建和销毁。当进程被销毁时,系统会调用回调函数,可以在回调函数中执行驱动卸载(unload)函数。
以下是一个示例代码,可以帮助你实现这个功能:
VOID ProcessNotifyRoutineEx(
_Inout_ PEPROCESS Process,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
)
{
// 进程被销毁
if (CreateInfo == NULL) {
// 判断该进程是否是你的应用程序进程
// 如果是,执行驱动卸载函数
// ...
// 例如,你的应用程序进程名为"MyApp.exe",可以使用下面的代码进行判断:
UNICODE_STRING processName;
RtlInitUnicodeString(&processName, L"MyApp.exe");
if (RtlCompareUnicodeString(&Process->ImageFileName, &processName, TRUE) == 0) {
// 执行驱动卸载函数
MyDriverUnload(NULL);
}
}
}
NTSTATUS DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
// 注册进程通知回调函数
PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutineEx, FALSE);
// ...
}
VOID DriverUnload(
_In_ PDRIVER_OBJECT DriverObject
)
{
// 注销进程通知回调函数
PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutineEx, TRUE);
// ...
}
注意,进程通知机制是异步的,回调函数的执行不保证实时性,因此有可能存在一定的延迟。同时,应用程序进程被杀死并不一定会触发进程通知,例如进程被强制终止时,就不会触发进程通知。
来自GPT的回答:
在Windows平台上,可以使用Windows驱动开发工具包(Windows Driver Kit,简称WDK)中提供的IoCreateNotificationEvent函数创建一个事件对象,将该事件对象传递给驱动程序和用户空间应用程序。
驱动程序可以使用KeWaitForSingleObject函数或KeWaitForMultipleObjects函数等待事件发生。当用户空间应用程序被关闭时,它可以调用CloseHandle函数或TerminateProcess函数关闭进程,从而导致该事件对象被触发。此时,驱动程序可以在事件回调函数中执行unload函数,释放相关资源。