27 PFILE_OBJECT ParentFileObject, TargetFileObject, SystemRootFileObject;
40 TargetFileObject =
NULL;
62 (
PVOID *)&TargetFileObject,
67 ok(TargetFileObject !=
NULL,
"Not target to continue!\n");
68 if (TargetFileObject ==
NULL)
108 (
PVOID *)&ParentFileObject,
119 ok(ParentFileObject != TargetFileObject,
"Diverted file object must be different\n");
121 ok_eq_pointer(ParentFileObject->FsContext, TargetFileObject->FsContext);
122 ok(ParentFileObject->FsContext2 != 0x0,
"Parent must be open!\n");
123 ok(ParentFileObject->FsContext2 != TargetFileObject->FsContext2,
"Parent open must have its own context!\n");
178 (
PVOID *)&ParentFileObject,
183 ok(ParentFileObject != TargetFileObject,
"Diverted file object must be different\n");
184 ok_eq_pointer(ParentFileObject->FsContext, TargetFileObject->FsContext);
185 ok(ParentFileObject->FsContext2 != 0x0,
"Parent must be open!\n");
186 ok(ParentFileObject->FsContext2 != TargetFileObject->FsContext2,
"Parent open must have its own context!\n");
192 (
PVOID *)&SystemRootFileObject,
197 ok_eq_pointer(ParentFileObject->RelatedFileObject, SystemRootFileObject);
198 ok(ParentFileObject->RelatedFileObject != TargetFileObject,
"File objects must be different\n");
199 ok(SystemRootFileObject != TargetFileObject,
"File objects must be different\n");
245 (
PVOID *)&ParentFileObject,
250 ok(ParentFileObject != TargetFileObject,
"Diverted file object must be different\n");
252 ok_eq_pointer(ParentFileObject->FsContext, TargetFileObject->FsContext);
253 ok(ParentFileObject->FsContext2 != 0x0,
"Parent must be open!\n");
254 ok(ParentFileObject->FsContext2 != TargetFileObject->FsContext2,
"Parent open must have its own context!\n");
307 (
PVOID *)&ParentFileObject,
312 ok(ParentFileObject != TargetFileObject,
"Diverted file object must be different\n");
313 ok_eq_pointer(ParentFileObject->FsContext, TargetFileObject->FsContext);
314 ok(ParentFileObject->FsContext2 != 0x0,
"Parent must be open!\n");
315 ok(ParentFileObject->FsContext2 != TargetFileObject->FsContext2,
"Parent open must have its own context!\n");
321 (
PVOID *)&SystemRootFileObject,
326 ok_eq_pointer(ParentFileObject->RelatedFileObject, SystemRootFileObject);
327 ok(ParentFileObject->RelatedFileObject != TargetFileObject,
"File objects must be different\n");
328 ok(SystemRootFileObject != TargetFileObject,
"File objects must be different\n");
519 Status = ZwCreateFile(&ReparseHandle,
550 L"\\regedit.exe",
sizeof(
L"\\regedit.exe") -
sizeof(
UNICODE_NULL));
554 L"\\regedit.exe",
sizeof(
L"\\regedit.exe") -
sizeof(
UNICODE_NULL));
571 Status = ZwCreateFile(&ReparseHandle,
613 ZwSetInformationFile(ReparseHandle,
628 Status = ZwCreateFile(&ReparseHandle,
641 "ZwCreateFile returned unexpected status: %lx\n",
Status);
679 "ZwCreateFile returned unexpected status: %lx\n",
Status);
685 Status = ZwCreateFile(&ReparseHandle,
776 ZwSetInformationFile(ReparseHandle,
792 HANDLE ParentHandle, SystemRootHandle;
static UNICODE_STRING Regedit
static UNICODE_STRING Foobar
static UNICODE_STRING SystemRootRegedit
static UNICODE_STRING SystemRootFoobar
static UNICODE_STRING SystemRoot
static VOID NTAPI TestSymlinks(VOID)
static UNICODE_STRING SystemRootFoobarFoobar
static VOID NTAPI KernelModeTest(IN PVOID Context)
VOID NTAPI UserModeTest(VOID)
static UNICODE_STRING FoobarFoobar
#define ok_eq_pointer(value, expected)
#define ok_eq_hex(value, expected)
#define ok_eq_long(value, expected)
#define FILE_DIRECTORY_FILE
#define FILE_NON_DIRECTORY_FILE
#define FILE_DELETE_ON_CLOSE
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
#define INVALID_HANDLE_VALUE
#define FILE_ATTRIBUTE_NORMAL
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
#define ExGetPreviousMode
#define ExAllocatePool(type, size)
@ FileDispositionInformation
#define FILE_OPEN_REPARSE_POINT
#define FILE_SYNCHRONOUS_IO_NONALERT
#define FILE_OPEN_FOR_BACKUP_INTENT
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
POBJECT_TYPE IoFileObjectType
PKTHREAD KmtStartThread(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext OPTIONAL)
VOID KmtFinishThread(IN PKTHREAD Thread OPTIONAL, IN PKEVENT Event OPTIONAL)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ HANDLE _In_opt_ HANDLE _Out_opt_ PHANDLE TargetHandle
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define FILE_DOES_NOT_EXIST
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define FILE_SHARE_DELETE
#define FILE_WRITE_ATTRIBUTES
#define UNREFERENCED_PARAMETER(P)
NTSYSAPI NTSTATUS NTAPI ZwFsControlFile(IN HANDLE DeviceHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG IoControlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, OUT PVOID OutputBuffer, IN ULONG OutputBufferSize)
NTSTATUS NTAPI IoCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options)
#define STATUS_IO_REPARSE_TAG_NOT_HANDLED
#define STATUS_ACCESS_VIOLATION
#define STATUS_STOPPED_ON_SYMLINK
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define FSCTL_GET_REPARSE_POINT
#define FSCTL_SET_REPARSE_POINT
struct _REPARSE_DATA_BUFFER::@314::@316 SymbolicLinkReparseBuffer
#define RTL_CONSTANT_STRING(s)
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_OBJECT_PATH_NOT_FOUND
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
#define IO_OPEN_TARGET_DIRECTORY
#define IO_NO_PARAMETER_CHECKING
#define IO_STOP_ON_SYMLINK
#define IO_REPARSE_TAG_SYMLINK
#define ObDereferenceObject