阅读:1127回复:3
无法获得driver的Handle,请大家指教
我用的是tooflat的sfilter,我现在需要控制它,用的是IRP_MJ_DIRECTORY_CONTROL。
只是现在我用的这个调用驱动的程序,无法获得driver的句柄,请问我有没有什么写错的方法呀? TCHAR completeDeviceName[]=_T("\\\\.\\Sfilter"); hDevice = CreateFile( completeDeviceName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); 每次hDevice 的值都是-1请问为什么呀,特别着急 |
|
|
沙发#
发布于:2007-01-15 09:38
我在driver程序中,是象下面这样创建控制设配的,IoCreateSymbolicLink 也创建成功了,为什么我在调用时,用CreateFile像上一贴那样一获取控制设备的句柄,hDevice值是-1
RtlInitUnicodeString(&NameString, L"\\FileSystem\\Filters\\SFilter"); Status = IoCreateDevice( DriverObject, 0, &NameString, FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_SECURE_OPEN, FALSE, &gSFilterControlDeviceObject ); if (Status == STATUS_OBJECT_PATH_NOT_FOUND) { RtlInitUnicodeString(&NameString, L"\\FileSystem\\SFilterCDO"); Status = IoCreateDevice( DriverObject, 0, &NameString, FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_SECURE_OPEN, FALSE, &gSFilterControlDeviceObject ); if (!NT_SUCCESS(Status)) { KdPrint(("SFilter!DriverEntry: Error creating control device object \"%wZ\", Status=%08x\n", &NameString, Status)); ZwClose(&gRuleFileHandle); ExDeleteResourceLite(&gRulesResource); return Status; } } else if (!NT_SUCCESS(Status)) { KdPrint(("SFilter!DriverEntry: Error creating control device object \"%wZ\", Status=%08x\n", &NameString, Status)); ZwClose(&gRuleFileHandle); ExDeleteResourceLite(&gRulesResource); return Status; } RtlInitUnicodeString(&DosNameString, L"\\DosDevices\\Sfilter"); Status = IoCreateSymbolicLink (&DosNameString, &NameString ); if(!NT_SUCCESS(Status)) { KdPrint(("SFilter!DriverEntry: Error creating control dosdevice object \"%wZ\", Status=%08x\n", &DosNameString, Status)); ZwClose(&gRuleFileHandle); ExDeleteResourceLite(&gRulesResource); return Status; } KdPrint(("SFilter!DriverEntry: Createing SymbolicLink Success \"%wZ\", Status=%08x\n", &DosNameString, Status)); |
|
|
板凳#
发布于:2007-01-15 11:35
各位大侠救命呀
|
|
|
地板#
发布于:2007-01-15 23:56
解决了,呵呵,问题不在上面粘的代码,而是将SfCreate的中的代码加以修改。原因是在CreateFile来取得句柄时,进入了SfCreate事件,它符合IS_MY_CONTROL_DEVICE_OBJECT条件,但是tooflat没打算自己控制什么,所以就让Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;了,所以每次返回的都是-1了,改成下面这样就成了。
if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { // // Sfilter doesn't allow for any communication through its control // device object, therefore it fails all requests to open a handle // to its control device object. // // See the FileSpy sample for an example of how to allow creates to // the filter's control device object and manage communication via // that handle. //不允许操作控制设备对象,有这样的请求就返回失败 // Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; // Irp->IoStatus.Information = 0; // //完成了io的所有请求,并返回irp给io // IoCompleteRequest(Irp, IO_NO_INCREMENT); // // return STATUS_INVALID_DEVICE_REQUEST; Status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } |
|
|