#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;