PsSetLoadImageNotifyRoutine loadImageNotifyRoutine 中拿全路径

本文档展示了如何使用内核模式API `PsSetLoadImageNotifyRoutine` 来获取加载模块的完整路径。代码示例中包含了内存分配、对象管理、句柄操作的相关函数,以及获取符号链接对象和设备卷名的方法。
摘要由CSDN通过智能技术生成
PsSetLoadImageNotifyRoutine

#include <ntifs.h>
#include <ntddk.h>
#include <Ntstrsafe.h>
#include <fltKernel.h>


//删除指针
#define SafeFreeDelete(pData) { if(pData){ExFreePool(pData);pData=NULL;} }

//减少对象引用计数
#define SafeDereferenceObject(Object) { if(Object){ObDereferenceObject(Object);Object=NULL;} }

//关闭句柄
#define SafeCloseHandle(Handle) { if(Handle){ZwClose(Handle);Handle=NULL;} }



//分配内存
PUNICODE_STRING ExAllocateUnicodeStingPool(PUNICODE_STRING strBuff)
{
        PUNICODE_STRING AllocateString = NULL;
        if (MmIsAddressValid(strBuff) == FALSE || strBuff == NULL || strBuff->Buffer == NULL || strBuff->Length < sizeof(wchar_t))
        {
                ASSERT(FALSE);
                return NULL;
        }


        AllocateString = ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING) + strBuff->Length + sizeof(wchar_t));
        if (AllocateString == NULL)
        {
                ASSERT(FALSE);
                return NULL;
        }

        RtlZeroMemory(AllocateString, sizeof(UNICODE_STRING) + strBuff->Length + sizeof(wchar_t));
        AllocateString->Length = strBuff->Length;
        AllocateString->MaximumLength = AllocateString->Length + sizeof(wchar_t);
        AllocateString->Buffer = (PWSTR)(((PUCHAR)AllocateString) + sizeof(UNICODE_STRING));
        RtlCopyMemory(AllocateString->Buffer, strBuff->Buffer, strBuff->Length);

        return AllocateString;
}

//获取符号链接对象
NTSTATUS GetSymbolicLinkObject(PUNICODE_STRING pDeviceLinkName, PDEVICE_OBJECT* pDeviceObject, PFILE_OBJECT* pFileObject,PUNICODE_STRING* pDeviceVolumeName)
{
        NTSTATUS status = STATUS_UNSUCCESSFUL;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要监控Windows驱动的退出并停止服务,可以使用Windows内核模式编程技术。以下是实现此目标的一般步骤: 1.编写内核模式驱动程序,并为其创建一个服务。在服务中,可以使用CreateService函数来创建一个Windows服务。 2.在驱动程序中,使用PsSetLoadImageNotifyRoutine函数来设置驱动加载通知例程。这个例程会在每次加载新驱动程序时被调用。 3.在驱动加载通知例程中,检查新驱动程序是否是你要监控的驱动。如果是,就为其创建一个设备对象,并使用IoRegisterShutdownNotification函数来注册一个关机通知例程。 4.在关机通知例程中,停止驱动服务并释放相应资源。 以下是一个示例代码,用于演示如何监视驱动程序退出并停止服务: ``` #include <ntddk.h> UNICODE_STRING g_DriverName = RTL_CONSTANT_STRING(L"YourDriverName"); VOID ShutdownNotifyRoutine(PDEVICE_OBJECT DeviceObject) { // Stop driver service and release resources // ... } VOID LoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ProcessId, PIMAGE_INFO ImageInfo) { if (RtlEqualUnicodeString(FullImageName, &g_DriverName, TRUE)) { PDEVICE_OBJECT DeviceObject; NTSTATUS status = IoCreateDevice(DriverObject, 0, NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject); if (NT_SUCCESS(status)) { IoRegisterShutdownNotification(DeviceObject); } } } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { // Create driver service // ... // Set driver load image notify routine PsSetLoadImageNotifyRoutine(LoadImageNotifyRoutine); return STATUS_SUCCESS; } ``` 注意,在实际实现中,需要根据具体情况对代码进行修改和扩展。此外,内核模式编程需要特殊的技能和经验,需要谨慎操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值