linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
阅读:1594回复:7

App和Driver通信中,为何得到的Handle无效,牛人们看看

楼主#
更多 发布于:2007-08-07 08:44
App和Driver通信中,在App端,代码如下:
#include "stdafx.h"
#include <windows.h>                
#include <stdlib.h>
#include <stdio.h>
#include <winioctl.h>
#include <string.h>
#include <crtdbg.h>

#define CRYPTION_DIRECTORY_SERVICE TEXT("SFilter")
#define FILESPY_W32_DEVICE_NAME  TEXT("\\\\.\\SFilter")

void StartCDService(void)
{
    SC_HANDLE cdService,scm;
    scm=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
    if(!scm)
    {
        return;
    }
    cdService = OpenService(scm,CRYPTION_DIRECTORY_SERVICE,SERVICE_ALL_ACCESS);
    if(!cdService)
    {
        CloseServiceHandle(scm);
        return;
    }
    StartService(cdService,0,NULL);
    CloseServiceHandle(cdService);
    CloseServiceHandle(scm);
}


int main(int argc, char* argv[])
{
    HANDLE                  hDevice = NULL;
    DWORD                   result;

    StartCDService();

    hDevice = CreateFile( FILESPY_W32_DEVICE_NAME,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          0,
                          NULL);

    if (hDevice == INVALID_HANDLE_VALUE) {
        result = GetLastError();
        printf("ERROR opening device...\n");
    }

    return 0;
}


以上的代码段,对于FileSpy驱动,得到的hDevice有效,但对于Sfilter驱动,得到 INVALID_HANDLE_VALUE,这是为何?

哪位知道啊???
在孤独和无助中缓慢前行...
liyunch
驱动小牛
驱动小牛
  • 注册日期2001-06-28
  • 最后登录2014-09-05
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望134点
  • 贡献值0点
  • 好评度94点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-07 09:51
对sfilter中的Control Object在Sfcreate中做一下处理
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-08-07 09:55
楼上的兄台,做什么处理,还没到那一步吧,我现在还没开始通过DeviceIoControl   API发命令呢,处理什么呢?
在孤独和无助中缓慢前行...
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-08-07 10:28
应用程序调用CreateFile的时候,驱动的MJ_CREATE function,就会得到调用,必须返回success
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-08-07 10:38
zhaock斑竹,那在SfCreate函数中如何处理呢,我就是用的ifs ddk下的那个例子测试一下。
在孤独和无助中缓慢前行...
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-08-07 10:59
已经解决,谢谢
在孤独和无助中缓慢前行...
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-08-07 16:14
感觉论坛上的风气很差,对于一些问题,有些人通过一些渠道知道了问题的解答,别人再问就沉默了。我把上面的问题总结一下,方便后来者。

其实对于App和Driver通信,参照FileSpy实例,基本上没什么问题。但对于SFilter实例,需要做相应的一些处理。详细步骤如下:

1、在DriverEntry中创建符号链接
NTSTATUS
DriverEntry (
        IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath
)
{
        UNICODE_STRING LinkName;
        。。。。。。

        RtlInitUnicodeString( &LinkName, L"\\DosDevices\\SFilter" );  
        status = IoCreateSymbolicLink( &LinkName, &nameString );  

        if (!NT_SUCCESS(status)) {
                IoDeleteSymbolicLink( &LinkName );
                status = IoCreateSymbolicLink( &LinkName, &nameString );

                if (!NT_SUCCESS(status)) {
                        KdPrint(( "SFilter!DriverEntry: IoCreateSymbolicLink failed\n"));

                        IoDeleteDevice(gSFilterControlDeviceObject);
                        return status;
                }
        }
        。。。。。。
}

2、在DriverEntry 中添加  
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SfDeviceIoControl;

3、在SfCreate中修改代码段
if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {
        Irp->IoStatus.Status = STATUS_SUCCESS;   //此处修改
        Irp->IoStatus.Information = 0;
        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return STATUS_SUCCESS;   //此处修改
}

4、在SfCleanupClose中添加代码如下:
NTSTATUS
SfCleanupClose (
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp
)
{
        PAGED_CODE();

        //此处为添加代码段,一定要在此位置添加,添加到后面机子会重启
        if (DeviceObject == gSFilterControlDeviceObject) {

                Irp->IoStatus.Status = STATUS_SUCCESS;
                Irp->IoStatus.Information = 0;

                IoCompleteRequest( Irp, IO_NO_INCREMENT );
                return STATUS_SUCCESS;
        }

        ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ));
        ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

        //
        //  Get this driver out of the driver stack and get to the next driver as
        //  quickly as possible.
        //
        IoSkipCurrentIrpStackLocation( Irp );

        //
        //  Now call the appropriate file system driver with the request.
        //

        return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION)    DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}


5、添加SfDeviceIoControl 例程
NTSTATUS
SfDeviceIoControl (
      IN PDEVICE_OBJECT DeviceObject,
      IN PIRP Irp
)
{  
        NTSTATUS status = STATUS_SUCCESS;
        PIO_STACK_LOCATION irpStack;
        unsigned long cbin;
        unsigned long cbout;
        unsigned long code;
        HANDLE    hEvent = NULL;
 
        if (DeviceObject == gSFilterControlDeviceObject) {
                Irp->IoStatus.Information = 0;
 
                irpStack = IoGetCurrentIrpStackLocation( Irp );
                cbin = irpStack->Parameters.DeviceIoControl.InputBufferLength;
                cbout = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
                code=irpStack->Parameters.DeviceIoControl.IoControlCode;
                status = STATUS_SUCCESS;
                Irp->IoStatus.Information = 0L;

                Irp->IoStatus.Status = status;
  

                IoCompleteRequest( Irp, IO_NO_INCREMENT );
                return status;

        }

        IoSkipCurrentIrpStackLocation(Irp);    
        //
        // Call the appropriate file system driver with the request.
        //
        return IoCallDriver(((PSFILTER_DEVICE_EXTENSION)   DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
}
在孤独和无助中缓慢前行...
xiabl
驱动牛犊
驱动牛犊
  • 注册日期2005-10-24
  • 最后登录2010-05-20
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望77点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-10 16:08
建议lz , 用 drivermoniter 监视一下,  
 如果sfilter这么改的话, 可能机器会变的很慢o. 好象一直在hook某个设备. 具体de提示不记得了, 不过不是所有机器都是这样的..
因为有这个问题, 所以ye就放弃这么做了.
小桥流水人家
游客

返回顶部