阅读:993回复:4
为何在Write的时候,任务栏系统总是弹出 延迟写入失败 的消息
如题
|
|
最新喜欢:wingma...
|
沙发#
发布于:2007-05-09 10:18
PAGING IO 写的时候给拒绝了
|
|
板凳#
发布于:2007-05-09 10:29
那怎么解决这个问题呢?
|
|
|
地板#
发布于:2007-05-09 11:18
你有没有处理PAGING IO的写操作, 如果没有也不知道你是什么情况下遇到延迟写失败的, 具体说说你怎么写的
|
|
地下室#
发布于:2007-05-09 14:51
我的写方法如下代码段所示,请coolw帮我看看
NTSTATUS EdWrite ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status = STATUS_SUCCESS; int i; HANDLE link_handle=NULL; OBJECT_ATTRIBUTES attributes; UNICODE_STRING target; UNICODE_STRING filename,filename1,filename2; WCHAR USName[256]; HANDLE DirectoryHandle; KEVENT WaitEvent; char *pBuffer; char *MyBuffer; char key[256]; int Len; //PFILE_CONTEXT FileContext; PIO_STACK_LOCATION CurrentIrpStack = IoGetCurrentIrpStackLocation(Irp); PSFILTER_DEVICE_EXTENSION DevExt = DeviceObject->DeviceExtension; PFILE_OBJECT FileObject = CurrentIrpStack->FileObject; FileObject->FsContext if (IS_MY_DEVICE_OBJECT(DeviceObject)) { //Only care about volume filter device object, pass through other create request if(NULL == DevExt->StorageStackDeviceObject) { goto _ReturnAddress2; } // only IRP_NOCACHE, IRP_PAGING_IO, IRP_SYNCHRONOUS_PAGING_IO will be processed if (0 == (Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { goto _ReturnAddress2; } for(i=0;i<256;i++) USName=0; RtlInitUnicodeString(&filename,USName); filename.MaximumLength=512; RtlInitUnicodeString(&filename1,USName); filename1.MaximumLength=512; RtlInitUnicodeString(&filename2,USName); filename2.MaximumLength=512; if (0==FileObject->FileName.Length) { // 我不知道为什么会有这样的情况 KdPrint(("0")); return STATUS_UNSUCCESSFUL; } //filename=FileObject->FileName; RtlVolumeDeviceToDosName(FileObject->DeviceObject,&filename); RtlCopyUnicodeString(&filename1,&filename); RtlInitUnicodeString(&filename2,FileObject->FileName.Buffer); RtlAppendUnicodeStringToString(&filename1,&filename2); if(NULL != wcsstr(filename1.Buffer, L"D:\\test\\")) { KdPrint(("WRITE-->%ws\n",filename1.Buffer)); if (DeviceObject->Flags & DO_BUFFERED_IO) { pBuffer=(char *)Irp->AssociatedIrp.SystemBuffer; } else { if (Irp->MdlAddress) { pBuffer = (char *)MmGetSystemAddressForMdl (Irp->MdlAddress); } else { if (Irp->UserBuffer != NULL) pBuffer=(char*)Irp->UserBuffer; } } if (pBuffer != NULL && strstr(pBuffer, "ENCRYPTEDBYHNS") == NULL) { KdPrint(("first WRITE-->%s\n", pBuffer)); strcpy(key, "abcdefg"); crypt(pBuffer, key); /*MyBuffer = ExAllocatePool(NonPagedPool, strlen(pBuffer)); strcpy(MyBuffer, pBuffer); strcpy(pBuffer, "ENCRYPTEDBYHNS"); strcat(pBuffer, MyBuffer);*/ KdPrint(("Two WRITE-->%s\n", pBuffer)); KdPrint(("data length is :%d\n", strlen(pBuffer))); Len = CurrentIrpStack->Parameters.Write.Length; DbgPrint("data length is:%d\n", Len); } } KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); // Copy the stack and set our Completion routine IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, SfWriteCompletion, &WaitEvent, TRUE, TRUE, TRUE); // Call the next driver in the stack. Status = IoCallDriver(DevExt->AttachedToDeviceObject, Irp); // Wait for the completion routine to be called if (STATUS_PENDING == Status) { ASSERT(STATUS_SUCCESS == KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL)); } // We don't care about failed requests if (!NT_SUCCESS(Irp->IoStatus.Status) || Irp->IoStatus.Status == STATUS_REPARSE) { goto _ReturnAddress1; } /*IoCopyCurrentIrpStackLocationToNext(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject,Irp);*/ _ReturnAddress1: Status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; _ReturnAddress2: //Save the Status and continue processing the IRP IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } //Control device object if(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { //Reset the Status and information of Irp Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } //Wrong device object Irp->IoStatus.Status = STATUS_INVALID_HANDLE; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_HANDLE; } NTSTATUS SfWriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context) { PKEVENT Event = Context; UNREFERENCED_PARAMETER(DeviceObject); UNREFERENCED_PARAMETER(Irp); ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject)); KeSetEvent(Event, IO_NO_INCREMENT, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } |
|
|