首页
社区
课程
招聘
[原创]IRP操作文件填坑日记
发表于: 2017-1-16 21:14 9468

[原创]IRP操作文件填坑日记

2017-1-16 21:14
9468
Status = IrpCreateFile(
    FilePath,
    FILE_READ_ATTRIBUTES,
    FILE_ATTRIBUTE_NORMAL,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    FILE_OPEN,
    FILE_NO_INTERMEDIATE_BUFFERING|FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,
    &FileObject
    );
Status = FsRtlGetFileSize(FileObject,XXX);
Status = IrpReadFile(FileObject,X,X......);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 0
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发,多谢楼主分享。确实填了好多坑
2017-1-17 08:56
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
好帖必须顶
2017-1-17 09:03
0
雪    币: 221
活跃值: (2326)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
好贴。学习一下!!!
2017-1-17 09:10
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
有點印象  記得0幾年那會網上流傳的那個IRP操作文件   的確很多坑      
當時也是補了幾個洞才能湊合用
2017-1-20 09:15
0
雪    币: 441
活跃值: (1055)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
66666  点赞!
2018-1-17 17:04
0
雪    币: 284
活跃值: (3604)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
7
thx  to  share~
2018-1-22 12:59
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢指点
2018-1-23 11:27
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2018-2-3 03:44
0
雪    币: 12
活跃值: (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我用irp 在win10上打开文件总是出错返回0xC000000D.请各位大牛帮忙看看:
BOOLEAN GetDriveObject(
       IN ULONG DriveNumber,
       OUT PDEVICE_OBJECT *DeviceObject,
       OUT PDEVICE_OBJECT *ReadDevice
) {
       WCHAR driveName[] = L"\\DosDevices\\A:\\";
       UNICODE_STRING deviceName;
       HANDLE deviceHandle;
       OBJECT_ATTRIBUTES objectAttributes;
       IO_STATUS_BLOCK ioStatus;
       PFILE_OBJECT fileObject;
       NTSTATUS status;

       if (DriveNumber >= 'A' && DriveNumber <= 'Z')
       {
               driveName[12] = (CHAR)DriveNumber;
       }
       else if (DriveNumber >= 'a' && DriveNumber <= 'z')
       {
               driveName[12] = (CHAR)DriveNumber - 'a' + 'A';
       }
       else
       {
               return FALSE;
       }

       RtlInitUnicodeString(&deviceName, driveName);

       InitializeObjectAttributes(&objectAttributes,
               &deviceName,
               OBJ_CASE_INSENSITIVE,
               NULL,
               NULL);

       status = IoCreateFile(&deviceHandle,
               SYNCHRONIZE | FILE_ANY_ACCESS,
               &objectAttributes,
               &ioStatus,
               NULL,
               0,
               FILE_SHARE_READ | FILE_SHARE_WRITE,
               FILE_OPEN,
               FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,
               NULL,
               0,
               CreateFileTypeNone,
               NULL,
               0x100);
       if (!NT_SUCCESS(status))
       {
               DbgPrint("Could not open drive %c: %x/n", DriveNumber, status);
               return FALSE;
       }

       status = ObReferenceObjectByHandle(deviceHandle,
               FILE_READ_DATA,
               *IoFileObjectType,
               KernelMode,
               &fileObject,
               NULL);

       if (!NT_SUCCESS(status))
       {
               DbgPrint("Could not get fileobject from handle: %c/n", DriveNumber);
               ZwClose(deviceHandle);
               return FALSE;
       }

       if (fileObject->Vpb == 0 || fileObject->Vpb->RealDevice == NULL)
       {
               ObDereferenceObject(fileObject);
               ZwClose(deviceHandle);
               return FALSE;
       }

       *DeviceObject = fileObject->Vpb->DeviceObject;
       *ReadDevice = fileObject->Vpb->RealDevice;

       ObDereferenceObject(fileObject);
       ZwClose(deviceHandle);

       return TRUE;
}

NTSTATUS IoCompletionRoutine(
    IN PDEVICE_OBJECT device_object,
    IN PIRP irp,
    IN PVOID context
){
       UNREFERENCED_PARAMETER(device_object);
       UNREFERENCED_PARAMETER(context);
    *irp->UserIosb = irp->IoStatus;
    if(irp->UserEvent)
        KeSetEvent(irp->UserEvent, IO_NO_INCREMENT, 0);
    if(irp->MdlAddress){
        IoFreeMdl(irp->MdlAddress);
        irp->MdlAddress = NULL;
    }
    IoFreeIrp(irp);
    return STATUS_MORE_PROCESSING_REQUIRED;
}


NTSTATUS IrpCreateFile(
    IN PUNICODE_STRING FileName,
    IN ACCESS_MASK DesiredAccess,
    OUT PIO_STATUS_BLOCK io_status,
    IN ULONG FileAttributes,
    IN ULONG ShareAccess,
    IN ULONG CreateDisposition,
    IN ULONG CreateOptions,
    IN PDEVICE_OBJECT DeviceObject,
    IN PDEVICE_OBJECT RealDevice,
    OUT PVOID *Object
){
    NTSTATUS status;
    KEVENT event;
    PIRP irp;
    PIO_STACK_LOCATION irp_sp;
    IO_SECURITY_CONTEXT security_context;
    ACCESS_STATE access_state;
    OBJECT_ATTRIBUTES object_attributes;
    PFILE_OBJECT file_object;
    AUX_ACCESS_DATA aux_data;

       if(FileName->Buffer[1] != L':')
               return STATUS_INTERNAL_ERROR;
       if (GetDriveObject(FileName->Buffer[0], &DeviceObject, &RealDevice) == FALSE)
               return STATUS_INTERNAL_ERROR;

    RtlZeroMemory(&aux_data, sizeof(AUX_ACCESS_DATA));
    KeInitializeEvent(&event, SynchronizationEvent, FALSE);
    irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

    if(irp == NULL)
        return STATUS_INSUFFICIENT_RESOURCES;

    InitializeObjectAttributes(&object_attributes, NULL, OBJ_CASE_INSENSITIVE, 0, NULL);
    status = ObCreateObject(KernelMode,
                            *IoFileObjectType,
                            &object_attributes,
                            KernelMode,
                            NULL,
                            sizeof(FILE_OBJECT),
                            0,
                            0,
                            (PVOID *)&file_object);
    if(!NT_SUCCESS(status)){
        IoFreeIrp(irp);
        return status;
    }
    RtlZeroMemory(file_object, sizeof(FILE_OBJECT));
    file_object->Size = sizeof(FILE_OBJECT);
    file_object->Type = IO_TYPE_FILE;
    file_object->DeviceObject = RealDevice;

    if(CreateOptions & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)){
        file_object->Flags = FO_SYNCHRONOUS_IO;
        if(CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
            file_object->Flags |= FO_ALERTABLE_IO;
    }
    if(CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING)
        file_object->Flags |= FO_NO_INTERMEDIATE_BUFFERING;

    file_object->FileName.MaximumLength = FileName->MaximumLength;
    file_object->FileName.Buffer = ExAllocatePool(NonPagedPool, FileName->MaximumLength);
    if (file_object->FileName.Buffer == NULL){
        IoFreeIrp(irp);
        ObDereferenceObject(file_object);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlCopyUnicodeString(&file_object->FileName, FileName);
    KeInitializeEvent(&file_object->Lock, SynchronizationEvent, FALSE);
    KeInitializeEvent(&file_object->Event, NotificationEvent, FALSE);
    irp->MdlAddress = NULL;
    irp->Flags |= IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API;
    irp->RequestorMode = KernelMode;
    irp->UserIosb = io_status;
    irp->UserEvent = &event;
    irp->PendingReturned = FALSE;
    irp->Cancel = FALSE;
    irp->CancelRoutine = NULL;
    irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
    irp->Tail.Overlay.AuxiliaryBuffer = NULL;
    irp->Tail.Overlay.OriginalFileObject = file_object;
    status = SeCreateAccessState(&access_state,
                                 &aux_data,   
                                 DesiredAccess,   
                                 IoGetFileObjectGenericMapping());
    if(!NT_SUCCESS(status)){
        IoFreeIrp(irp);
        ExFreePool(file_object->FileName.Buffer);
        ObDereferenceObject(file_object);
        return status;
    }

    security_context.SecurityQos = NULL;
    security_context.AccessState = &access_state;
    security_context.DesiredAccess = DesiredAccess;
    security_context.FullCreateOptions = 0;

    irp_sp= IoGetNextIrpStackLocation(irp);
    irp_sp->MajorFunction = IRP_MJ_CREATE;
    irp_sp->DeviceObject = DeviceObject;
    irp_sp->FileObject =file_object;
    irp_sp->Parameters.Create.SecurityContext = &security_context;
    irp_sp->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions;
    irp_sp->Parameters.Create.FileAttributes = (USHORT)FileAttributes;
    irp_sp->Parameters.Create.ShareAccess = (USHORT)ShareAccess;
    irp_sp->Parameters.Create.EaLength = 0;

    IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);
    status = IoCallDriver(DeviceObject, irp);

    if (status == STATUS_PENDING)
        KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);

    status = io_status->Status;
    if (!NT_SUCCESS(status)){
        ExFreePool(file_object->FileName.Buffer);
        file_object->FileName.Length = 0;
        file_object->DeviceObject = NULL;
        ObDereferenceObject(file_object);
    }else{
         InterlockedIncrement(&file_object->DeviceObject->ReferenceCount);
         if (file_object->Vpb)
              InterlockedIncrement((PLONG)&file_object->Vpb->ReferenceCount);
         *Object = file_object;
    }
    return status;
}
2019-6-17 13:12
0
游客
登录 | 注册 方可回帖
返回
//