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

为何在Write的时候,任务栏系统总是弹出 延迟写入失败 的消息

楼主#
更多 发布于:2007-05-09 10:04
  如题

最新喜欢:

wingmanwingma...
在孤独和无助中缓慢前行...
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-09 10:18
PAGING IO 写的时候给拒绝了
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-05-09 10:29
那怎么解决这个问题呢?
在孤独和无助中缓慢前行...
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-09 11:18
你有没有处理PAGING IO的写操作, 如果没有也不知道你是什么情况下遇到延迟写失败的, 具体说说你怎么写的
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
地下室#
发布于: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;
}
在孤独和无助中缓慢前行...
游客

返回顶部