IrpDeleteFileForce для файла символической ссылки

#c #windows #winapi #driver #kernel-mode

#c #Windows #winapi #драйвер #режим ядра

Вопрос:

Основываясь на этой ссылке, я тестирую IrpDeleteFileForce() файлы символьных ссылок, но статус всегда равен 0xC000000D (STATUS_INVALID_PARAMETER) pFileObject . Я только добавил FILE_OPEN_REPARSE_POINT параметр CreateOptions ( IoCreateFile() функции) в GetDriveObject() routine, а IrpCreateFile() routine возвращает STATUS_SUCCESS, я не понял, почему IrpDeleteFileForce() сбой:-(

Какое-то решение для этого?

 NTSTATUS GetDriveObject(PUNICODE_STRING pDriveName, PDEVICE_OBJECT* DeviceObject, PDEVICE_OBJECT* ReadDevice)
{
    NTSTATUS status;
    OBJECT_ATTRIBUTES objectAttributes;
    HANDLE DeviceHandle = NULL;
    IO_STATUS_BLOCK ioStatus;
    PFILE_OBJECT pFileObject;

    if (pDriveName == NULL || DeviceObject == NULL || ReadDevice == NULL)
        return STATUS_INVALID_PARAMETER;

    InitializeObjectAttributes(amp;objectAttributes, pDriveName, OBJ_CASE_INSENSITIVE, NULL, NULL);

    status = IoCreateFile(amp;DeviceHandle, SYNCHRONIZE | FILE_ANY_ACCESS, amp;objectAttributes, amp;ioStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE | FILE_OPEN_REPARSE_POINT, NULL, 0, CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);

    if (!NT_SUCCESS(status))
        return status;

    status = ObReferenceObjectByHandle(DeviceHandle, FILE_READ_DATA, *IoFileObjectType, KernelMode, amp;pFileObject, NULL);

    if (!NT_SUCCESS(status))
    {
        ZwClose(DeviceHandle);
        return status;
    }

    if (pFileObject->Vpb == 0 || pFileObject->Vpb->RealDevice == NULL)
    {
        ObDereferenceObject(pFileObject);
        ZwClose(DeviceHandle);
        return STATUS_UNSUCCESSFUL;
    }

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

    ObDereferenceObject(pFileObject);
    ZwClose(DeviceHandle);

    return STATUS_SUCCESS;
}
  

Ответ №1:

Решаемая!

GetDriveObject()

 status = IoCreateFile(amp;DeviceHandle, SYNCHRONIZE | FILE_ANY_ACCESS, amp;objectAttributes, amp;ioStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT, NULL, 0, CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);
  

IrpCreateFile()

 IrpSp->Parameters.Create.Options = (FILE_OPEN_IF << 24) | FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT | 0;