阅读:1594回复:7
App和Driver通信中,为何得到的Handle无效,牛人们看看
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,这是为何? 哪位知道啊??? |
|
|
沙发#
发布于:2007-08-07 09:51
对sfilter中的Control Object在Sfcreate中做一下处理
|
|
板凳#
发布于:2007-08-07 09:55
楼上的兄台,做什么处理,还没到那一步吧,我现在还没开始通过DeviceIoControl API发命令呢,处理什么呢?
|
|
|
地板#
发布于:2007-08-07 10:28
应用程序调用CreateFile的时候,驱动的MJ_CREATE function,就会得到调用,必须返回success
|
|
地下室#
发布于:2007-08-07 10:38
zhaock斑竹,那在SfCreate函数中如何处理呢,我就是用的ifs ddk下的那个例子测试一下。
|
|
|
5楼#
发布于:2007-08-07 10:59
已经解决,谢谢
|
|
|
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); } |
|
|
7楼#
发布于:2007-08-10 16:08
建议lz , 用 drivermoniter 监视一下,
如果sfilter这么改的话, 可能机器会变的很慢o. 好象一直在hook某个设备. 具体de提示不记得了, 不过不是所有机器都是这样的.. 因为有这个问题, 所以ye就放弃这么做了. |
|
|