Winpcap分析 -- NPF_CreateDevice

本文深入解析了NPF_CreateDevice函数,包括设备创建过程、符号链接生成逻辑及其涉及的关键API,详细介绍了函数内部如何进行设备名称验证、初始化与创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NPF_CreateDevice:这个函数主要是创建设备,并为设备创建符号链接,这其中涉及到的标准API请参考wdk文档

  • 首先会对传递进来的设备名字做合法性判断:()

    if (RtlCompareMemory(amacNameP->Buffer, devicePrefix.Buffer,
        devicePrefix.Length) < devicePrefix.Length)
    {
        return FALSE;
    }

    NDIS_STRING devicePrefix = NDIS_STRING_CONST(//Device// )

  • 然后会对设备名字和符号链接名字做一系列的初始化,如分配空间,组合字符串等

    deviceName.Length = 0;
    deviceName.MaximumLength = (USHORT)(amacNameP->Length + g_NPF_Prefix.Length + sizeof(UNICODE_NULL));
    deviceName.Buffer = ExAllocatePoolWithTag(PagedPool, deviceName.MaximumLength, '3PWA');

    if (deviceName.Buffer == NULL)
        return FALSE;

    deviceSymLink.Length = 0;
    deviceSymLink.MaximumLength =(USHORT)(amacNameP->Length-devicePrefix.Length
        + symbolicLinkPrefix.Length
        + g_NPF_Prefix.Length
        + sizeof(UNICODE_NULL));

    deviceSymLink.Buffer = ExAllocatePoolWithTag(NonPagedPool, deviceSymLink.MaximumLength, '3PWA');

    if (deviceSymLink.Buffer  == NULL)
    {
        ExFreePool(deviceName.Buffer);
        return FALSE;
    }

    RtlAppendUnicodeStringToString(&deviceName, &devicePrefix);
    RtlAppendUnicodeStringToString(&deviceName, &g_NPF_Prefix);
    RtlAppendUnicodeToString(&deviceName, amacNameP->Buffer +
        devicePrefix.Length / sizeof(WCHAR));

    RtlAppendUnicodeStringToString(&deviceSymLink, &symbolicLinkPrefix);
    RtlAppendUnicodeStringToString(&deviceSymLink, &g_NPF_Prefix);
    RtlAppendUnicodeToString(&deviceSymLink, amacNameP->Buffer +
        devicePrefix.Length / sizeof(WCHAR));

  • 最后就是创建设备和符号链接

    status = IoCreateDevice(adriverObjectP,
            sizeof(DEVICE_EXTENSION),
            &deviceName,
            FILE_DEVICE_TRANSPORT,
    #ifdef __NPF_NT4__
            0,
    #else //__NPF_NT4__
            FILE_DEVICE_SECURE_OPEN,   
    #endif //__NPF_NT4__
            FALSE,
            &devObjP);

    IoCreateSymbolicLink(&deviceSymLink,&deviceName)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值