kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
阅读:1570回复:6

请问

楼主#
更多 发布于:2003-07-21 18:45
自己构造IRP_MJ_CREATE的请求包发给文件系统驱动设备对象而不用ZwCreateFile等的具体步骤是什么?给出有用的连接也可以,谢谢
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-22 14:25
几乎不太可能手工构造IRP_MJ_CREATE,至少我还没有遇到过,在OSR也有人提出,都没有答案。


死心吧!


不知道你是要解决什么问题?,是重入吗?



不是的,重入很好解决

以前也有人构造过的,不知道现在究竟有没人知道。

郁闷中......
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-22 14:06
几乎不太可能手工构造IRP_MJ_CREATE,至少我还没有遇到过,在OSR也有人提出,都没有答案。


死心吧!


不知道你是要解决什么问题?,是重入吗?
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-22 09:21
如下顺序:
RtlInitUnicodeString---->InitializeObjectAttributes----->ZwCreateFile--->ObReferenceObjectByHandle
可以得到fileobject,具体可参见filemon的代码。


首先谢谢你的回答,不过你可能没仔细看首贴的问题。

[编辑 -  7/22/03 by  kernel_kernel]
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-22 09:08
如下顺序:
RtlInitUnicodeString---->InitializeObjectAttributes----->ZwCreateFile--->ObReferenceObjectByHandle
可以得到fileobject,具体可参见filemon的代码。
不限容量的免费邮箱 www.k65.net
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-21 19:12
参照这个:
差别甚大,FileObject这个东西需要自己搞定而不是别人传来。实质上就是要得到FileObject。
 
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-21 18:52
参照这个:
BOOLEAN UndeleteIsDirectory(PDEVICE_OBJECT DeviceObject,
                            PFILE_OBJECT FileObject )
{
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK IoStatusBlock;
    PIO_STACK_LOCATION ioStackLocation;
    FILE_STANDARD_INFORMATION fileInfo;

    //
    // First, start by initializing the event
    //
    KeInitializeEvent(&event, SynchronizationEvent, FALSE);

    //
    // Allocate an irp for this request.  This could also come from a
    // private pool, for instance.
    //
    irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

    if (!irp) {

        //
        // Failure!
        //
        return FALSE;
    }

    irp->AssociatedIrp.SystemBuffer = &fileInfo;

    irp->UserEvent = &event;

    irp->UserIosb = &IoStatusBlock;

    irp->Tail.Overlay.Thread = PsGetCurrentThread();

    irp->Tail.Overlay.OriginalFileObject = FileObject;

    irp->RequestorMode = KernelMode;
  
    irp->Flags = 0;

    //
    // Set up the I/O stack location.
    //
    ioStackLocation = IoGetNextIrpStackLocation(irp);

    ioStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION;

    ioStackLocation->DeviceObject = DeviceObject;

    ioStackLocation->FileObject = FileObject;

    ioStackLocation->Parameters.QueryVolume.Length = sizeof(FILE_STANDARD_INFORMATION);
    
    ioStackLocation->Parameters.QueryVolume.FsInformationClass = FileStandardInformation;

    //
    // Set the completion routine.
    //
    IoSetCompletionRoutine(irp, UndeleteIoComplete, 0, TRUE, TRUE, TRUE);

    //
    // Send the request to the lower layer driver.
    //
    (void) IoCallDriver(DeviceObject, irp);

    //
    // Wait for the I/O
    //
    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);

    //
    // Return whether its a directory or not
    //
    if( !NT_SUCCESS( IoStatusBlock.Status ) || fileInfo.Directory) {

        return TRUE;

    } else {

        return FALSE;
    }
}
不限容量的免费邮箱 www.k65.net
游客

返回顶部