redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1441回复:10

书上源码防火墙程序出问题高手帮看看怎么回事

楼主#
更多 发布于:2008-01-19 10:22
下面是设置过滤函数的程序,是书上的源程序,不知道为什么执行不成功,在客户程序中使用GetLastError()得到2,找不到指定文件,初次接触驱动程序,希望老虾们给看看
NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFun)
{    
    NTSTATUS status = STATUS_SUCCESS;

        // 取得IP过滤驱动设备对象。下面代码执行后,pDeviceObj变量将指向IP过滤驱动设备对象
    PDEVICE_OBJECT pDeviceObj;
    PFILE_OBJECT pFileObj;
    // 初始化IP过滤驱动的名称
    UNICODE_STRING ustrFilterDriver;
    RtlInitUnicodeString(&ustrFilterDriver, L"\\Device\\IpFilterDriver");
    // 取得设备对象指针    
    status = IoGetDeviceObjectPointer(&ustrFilterDriver, FILE_ALL_ACCESS, &pFileObj, &pDeviceObj);
    if(!NT_SUCCESS(status))
    {
        return status;
    }

        // 使用到IP过滤驱动中设备对象的指针创建一个IRP    
    // 填充PF_SET_EXTENSION_HOOK_INFO结构
    PF_SET_EXTENSION_HOOK_INFO filterData;
    filterData.ExtensionPointer = filterFun;

    // 我们需要初始化一个事件对象。
    // 构建IRP时需要使用这个事件内核对象,当IP过滤取得接受到此IRP,完成工作以后会将它置位
    KEVENT event;
    KeInitializeEvent(&event, NotificationEvent, FALSE);

    // 为设备控制请求申请和构建一个IRP
    PIRP pIrp;
    IO_STATUS_BLOCK ioStatus;
    pIrp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,  // io control code
        pDeviceObj, 
        (PVOID) &filterData,
        sizeof(PF_SET_EXTENSION_HOOK_INFO),
        NULL,
        0,
        FALSE,
        &event,
        &ioStatus);
    if(pIrp == NULL)
    {
        // 如果不能申请空间,返回对应的错误代码
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    
        // 请求安装钩子回调函数
    // 发送此IRP到IP过滤驱动
    status = IoCallDriver(pDeviceObj, pIrp);
    // 等待IP过滤驱动的通知
    if(status == STATUS_PENDING) 
    {
        KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
    }
    status = ioStatus.Status;

    // 清除资源
    if(pFileObj != NULL)
        ObDereferenceObject(pFileObj);
    return status;
}
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)//处理IRP
{
    NTSTATUS status = STATUS_SUCCESS;

    // 取得此IRP(pIrp)的I/O堆栈指针
    PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

    // 取得I/O控制代码
    ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
    // 取得I/O缓冲区指针和它的长度
    PVOID pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
    ULONG uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
    
    // 响应用户的命令
    switch(uIoControlCode)
    {
    case START_IP_HOOK:    // 开始过滤
        status = SetFilterFunction(FilterPackets);
        break;
       
........
        return status;
}

客户程序:
if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1)//m_pFilterDrv为IP过滤钩子驱动指针 
    {
        str.Format("%d",GetLastError());
        MessageBox(str,"error");
        return;
    }


跪求大家了
redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-19 10:23
if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1)//m_pFilterDrv为IP过滤钩子驱动指针 
    {
        str.Format("%d",GetLastError());
        MessageBox(str,"error");
        return;
    }

这个if语句的判断总是真,安装过滤函数失败
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2008-01-20 14:34
这个是过时的东西了~
没有战争就没有进步 X3工作组 为您提供最好的军火
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-21 15:16
找到你的 DeviceIoControl 的代码,
如果你的 DeviceIoControl 的倒数第二个参数传入 NULL, 那么修改这个为一个有效 dword pointer。
redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-22 12:08
引用第2楼killvxk于2008-01-20 14:34发表的  :
这个是过时的东西了~

我也是刚刚接触这个,能不能介绍一下别的方法?
redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-01-22 12:09
引用第3楼codez于2008-01-21 15:16发表的  :
找到你的 DeviceIoControl 的代码,
如果你的 DeviceIoControl 的倒数第二个参数传入 NULL, 那么修改这个为一个有效 dword pointer。

    DWORD nBytesReturn;
    BOOL bRet = ::DeviceIoControl(m_hDriver, nCode,
        pInBuffer, nInCount, pOutBuffer, nOutCount, &nBytesReturn, NULL);
已经是有效 dword pointer了,还不行
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-01-22 13:08
要先加载ipfltdrv.sys
redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-01-22 13:21
    UNICODE_STRING ustrFilterDriver;
    RtlInitUnicodeString(&ustrFilterDriver, L"\\Device\\IpFilterDriver");
    // 取得设备对象指针    
    status = IoGetDeviceObjectPointer(&ustrFilterDriver, SYNCHRONIZE  |  GENERIC_READ  |  GENERIC_WRITE, &pFileObj, &pDeviceObj);
    if(!NT_SUCCESS(status))
    {
        return status;
    }

有啊。可是还出错
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2008-01-23 01:59
ndis 6.0 的filter啊
window Filter Platform啊

NetXXX hook啊~
NmrXXX hook啊~
没有战争就没有进步 X3工作组 为您提供最好的军火
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2008-01-23 09:12
引用第7楼redberries于2008-01-22 13:21发表的  :
    UNICODE_STRING ustrFilterDriver;
    RtlInitUnicodeString(&ustrFilterDriver, L"\Device\IpFilterDriver");
    // 取得设备对象指针    
    status = IoGetDeviceObjectPointer(&ustrFilterDriver, SYNCHRONIZE  |  GENERIC_READ  |  GENERIC_WRITE, &pFileObj, &pDeviceObj);
    if(!NT_SUCCESS(status))
.......


不懂什么叫加载驱动吗?
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2008-01-23 09:13
net start IpFilterDriver
游客

返回顶部