lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:1463回复:5

自己发IRP包更名文件出错,帮我看看代码

楼主#
更多 发布于:2008-04-10 10:46
根据网上的代码改变的,但是总是返回0xc000000d,无效参数错误,请高手指点一下吧

KeRenameFile(
    PDEVICE_OBJECT DeviceObject,
    PFILE_OBJECT   FileObject,
    OUT PIO_STATUS_BLOCK  IoStatusBlock,
    IN PVOID  FileInformation,
    IN ULONG  Length
    )
{
       PIRP               Irp;
       PIO_STACK_LOCATION IrpSp;
       KEVENT             Event;
       NTSTATUS           Status;
      
      
       Irp = IoAllocateIrp( DeviceObject->StackSize, FALSE );
       if ( ! Irp ) return STATUS_INSUFFICIENT_RESOURCES;

          KeInitializeEvent( &Event, SynchronizationEvent, FALSE );
      
       IoStatusBlock->Status = STATUS_SUCCESS;
       IoStatusBlock->Information = 0;
      
       Irp->Flags |= IRP_BUFFERED_IO;
       Irp->RequestorMode = KernelMode;
       Irp->UserIosb = &IoStatusBlock;
       Irp->UserEvent = NULL;
       Irp->Tail.Overlay.OriginalFileObject = FileObject;
       Irp->Tail.Overlay.Thread = PsGetCurrentThread();
       Irp->AssociatedIrp.SystemBuffer = (PVOID)FileInformation;
      
       IrpSp = IoGetNextIrpStackLocation( Irp );
       IrpSp->MajorFunction = IRP_MJ_SET_INFORMATION;
       IrpSp->FileObject = FileObject;
       IrpSp->DeviceObject = DeviceObject;
       IrpSp->Parameters.SetFile.Length = Length; // length of Rename
       IrpSp->Parameters.SetFile.FileInformationClass = FileRenameInformation;
       IrpSp->Parameters.SetFile.FileObject = FileObject;
       IrpSp->Parameters.SetFile.ReplaceIfExists = ((PFILE_RENAME_INFORMATION)FileInformation)->ReplaceIfExists;
      
       IoSetCompletionRoutine( Irp,
           KeFileCompletion,
           &Event,
           TRUE,
           TRUE,
           TRUE );
      
       Status = IoCallDriver( DeviceObject, Irp );
      
       if (STATUS_PENDING == Status)
       {
          
           (VOID) KeWaitForSingleObject( &Event,
               Executive,
               KernelMode,
               FALSE,
               NULL );
       }
       if(Irp)
       {
           IoFreeIrp(Irp);
           Irp = NULL;
       }
       KeClearEvent(&Event);      
       if (!NT_SUCCESS(Status)) IoStatusBlock->Status = Status;
       return IoStatusBlock->Status;
}

             len = sizeof(FILE_RENAME_INFORMATION)+wcslen(fullUniName.Buffer)*2+1;
            ReFileInfo = ExAllocatePool(NonPagedPool,len);
           if(ReFileInfo)
            {
              RtlZeroMemory(ReFileInfo,len);
            }
                    
                    ReFileInfo->ReplaceIfExists = FALSE;
                    ReFileInfo->RootDirectory = 0;
                    ReFileInfo->FileNameLength = wcslen(fullUniName.Buffer)*2 ;
                      RtlCopyMemory(ReFileInfo->FileName,fullUniName.Buffer,wcslen(fullUniName.Buffer)*2);
                    KdPrint(("\nrename file:%ws\n",ReFileInfo->FileName));

        Status = KeRenameFile(device_extension->NLExtHeader.AttachedToDeviceObject,IrpStack->FileObject,
                        &MyIoStatusBlock,ReFileInfo,sizeof(FILE_RENAME_INFORMATION));
lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-10 15:01
大家都不用这种方式吗
robar
驱动牛犊
驱动牛犊
  • 注册日期2007-06-27
  • 最后登录2013-06-24
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望41点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-16 22:00
这个错误码我也遇到过,帮你顶~
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-17 09:47
发个可以编译的code
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-17 16:35
KeRenameFile(device_extension->NLExtHeader.AttachedToDeviceObject,IrpStack->FileObject,
                        &MyIoStatusBlock,ReFileInfo,sizeof(FILE_RENAME_INFORMATION));

这里的sizeof(FILE_RENAME_INFORMATION)应该改为len (-1?, -3?)
zjjmj2002
驱动小牛
驱动小牛
  • 注册日期2007-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望321点
  • 贡献值0点
  • 好评度224点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2008-04-22 15:40
看了一下。
IrpSp->Parameters.SetFile.FileObject = FileObject;  画蛇添足,应删掉。

 ReFileInfo->ReplaceIfExists = FALSE;与
IrpSp->Parameters.SetFile.ReplaceIfExists = ((PFILE_RENAME_INFORMATION)FileInformation)->ReplaceIfExists;
自相矛盾,改为 ReFileInfo->ReplaceIfExists = TRUE;吧。
游客

返回顶部