• 如何自己写xuetr(一) 每次改变的驱动名和服务名


    首先要获取驱动模块的文件名字,根据每次文件名字的不同进行生成,名字可以从链表获得:

    typedef struct _LDR_DATA_TABLE_ENTRY {

    LIST_ENTRY InLoadOrderLinks;

    LIST_ENTRY InMemoryOrderLinks;

    LIST_ENTRY InInitializationOrderLinks;

    PVOID DllBase;

    PVOID EntryPoint;

    ULONG SizeOfImage;

    UNICODE_STRING FullDllName;

    UNICODE_STRING BaseDllName;

    }LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;

    //上面这个结构体需要自己定义

    static PLDR_DATA_TABLE_ENTRY GetSysList(PDRIVER_OBJECT DriverObject)

    {

    PLDR_DATA_TABLE_ENTRY ldr = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection;

    return ldr;

    }

    PLDR_DATA_TABLE_ENTRY pSysList = NULL;

    pSysList = GetSysList(DriverObject);//从DriverEntry获取驱动链表的节点信息。

    // 拼字符串创建服务名字

    static NTSTATUS XCreateDriverName(IN PDRIVER_OBJECT DriverObject,UNICODE_STRING BaseDllName)

    {

    UNICODE_STRING DeviceName,Win32Device;

    PDEVICE_OBJECT DeviceObject = NULL;

    NTSTATUS status;

    P_USTR(&BaseDllName);

    WCHAR strDevice[256];

    RtlInitEmptyUnicodeString(&DeviceName,strDevice,sizeof(strDevice));

    RtlAppendUnicodeToString(&DeviceName,L"\Device\");

    RtlAppendUnicodeStringToString(&DeviceName,&BaseDllName);

    P_USTR(&DeviceName);

    WCHAR strDosDevices[256];

    RtlInitEmptyUnicodeString(&Win32Device,strDosDevices,sizeof(strDosDevices));

    RtlAppendUnicodeToString(&Win32Device,L"\DosDevices\");

    RtlAppendUnicodeStringToString(&Win32Device,&BaseDllName);

    P_USTR(&Win32Device);

    status = IoCreateDevice(DriverObject,

    0,

    &DeviceName,

    FILE_DEVICE_UNKNOWN,

    0,

    FALSE,

    &DeviceObject);

    if (!NT_SUCCESS(status))

    return status;

    if (!DeviceObject)

    return STATUS_UNEXPECTED_IO_ERROR;

    DeviceObject->Flags |= DO_DIRECT_IO;

    DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;

    status = IoCreateSymbolicLink(&Win32Device, &DeviceName);

    DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

    return STATUS_SUCCESS;

    }

    更多请关注微信公众号:driverdevelop

  • 相关阅读:
    数据库常用面试题
    Base64、Md5、Des加密
    C#反射类型的使用
    C# 反射工厂模式的实现
    生成验证码的例子
    轻松实现页面提交时,显示“提交中..” (转)
    编写高性能 Web 应用程序的 10 个技巧 (转)
    由Duwamish学习web.config的配置(转)
    .Net配置文件常用配置说明 (转)
    用asp.net还原与恢复sqlserver数据库(转)
  • 原文地址:https://www.cnblogs.com/xujinping/p/4822803.html
Copyright © 2020-2023  润新知