2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test driver for FindFirstFile's wildcard substitution
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
15 static KMT_MESSAGE_HANDLER TestMessageHandler
;
16 static KMT_IRP_HANDLER TestIrpHandler
;
18 static UNICODE_STRING ExpectedExpression
= RTL_CONSTANT_STRING(L
"<not set>");
19 static WCHAR ExpressionBuffer
[MAX_PATH
];
23 IN PDRIVER_OBJECT DriverObject
,
24 IN PCUNICODE_STRING RegistryPath
,
25 OUT PCWSTR
*DeviceName
,
28 NTSTATUS Status
= STATUS_SUCCESS
;
32 UNREFERENCED_PARAMETER(RegistryPath
);
34 *DeviceName
= L
"FindFile";
35 *Flags
= TESTENTRY_NO_EXCLUSIVE_DEVICE
;
37 KmtRegisterIrpHandler(IRP_MJ_DIRECTORY_CONTROL
, NULL
, TestIrpHandler
);
38 KmtRegisterMessageHandler(0, NULL
, TestMessageHandler
);
45 IN PDRIVER_OBJECT DriverObject
)
53 IN PDEVICE_OBJECT DeviceObject
,
55 IN PVOID Buffer OPTIONAL
,
57 IN OUT PSIZE_T OutLength
)
59 NTSTATUS Status
= STATUS_SUCCESS
;
67 C_ASSERT(sizeof(ExpressionBuffer
) <= UNICODE_STRING_MAX_BYTES
);
68 DPRINT("IOCTL_EXPECT, InLength = %lu\n", InLength
);
69 if (InLength
> sizeof(ExpressionBuffer
))
70 return STATUS_BUFFER_OVERFLOW
;
72 if (InLength
% sizeof(WCHAR
) != 0)
73 return STATUS_INVALID_PARAMETER
;
75 RtlInitEmptyUnicodeString(&ExpectedExpression
, ExpressionBuffer
, sizeof(ExpressionBuffer
));
76 RtlCopyMemory(ExpressionBuffer
, Buffer
, InLength
);
77 ExpectedExpression
.Length
= (USHORT
)InLength
;
78 DPRINT("IOCTL_EXPECT: %wZ\n", &ExpectedExpression
);
83 return STATUS_NOT_SUPPORTED
;
92 IN PDEVICE_OBJECT DeviceObject
,
94 IN PIO_STACK_LOCATION IoStackLocation
)
96 NTSTATUS Status
= STATUS_NOT_SUPPORTED
;
100 DPRINT("IRP %x/%x\n", IoStackLocation
->MajorFunction
, IoStackLocation
->MinorFunction
);
101 ASSERT(IoStackLocation
->MajorFunction
== IRP_MJ_DIRECTORY_CONTROL
);
103 ok(IoStackLocation
->MinorFunction
== IRP_MN_QUERY_DIRECTORY
, "Minor function: %u\n", IoStackLocation
->MinorFunction
);
104 if (IoStackLocation
->MinorFunction
== IRP_MN_QUERY_DIRECTORY
)
106 ok(IoStackLocation
->Parameters
.QueryDirectory
.FileInformationClass
== FileBothDirectoryInformation
,
107 "FileInformationClass: %d\n", IoStackLocation
->Parameters
.QueryDirectory
.FileInformationClass
);
108 if (IoStackLocation
->Parameters
.QueryDirectory
.FileInformationClass
== FileBothDirectoryInformation
)
110 ok(RtlEqualUnicodeString(IoStackLocation
->Parameters
.QueryDirectory
.FileName
, &ExpectedExpression
, FALSE
),
111 "Expression is '%wZ', expected '%wZ'\n", IoStackLocation
->Parameters
.QueryDirectory
.FileName
, &ExpectedExpression
);
112 RtlZeroMemory(Irp
->UserBuffer
, IoStackLocation
->Parameters
.QueryDirectory
.Length
);
113 Status
= STATUS_SUCCESS
;
117 Irp
->IoStatus
.Status
= Status
;
118 Irp
->IoStatus
.Information
= 0;
120 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);