reactos/rostests/apitests/ntdll/RtlDosSearchPath_Ustr.c
Thomas Faber ae1974497f [NTDLL_APITEST]
- Add initial tests for RtlDosSearchPath_U & RtlDosSearchPath_Ustr
- Work around Wine ok() silliness
- Fix 64 bit warnings

svn path=/trunk/; revision=56468
2012-05-01 16:19:17 +00:00

226 lines
9 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPLv2+ - See COPYING in the top level directory
* PURPOSE: Test for RtlDosSearchPath_Ustr
* PROGRAMMER: Thomas Faber <thfabba@gmx.de>
*/
#define WIN32_NO_STATUS
#include <wine/test.h>
#include <pseh/pseh2.h>
#include <ndk/rtlfuncs.h>
/*
NTSTATUS
NTAPI
RtlDosSearchPath_Ustr(
IN ULONG Flags,
IN PUNICODE_STRING PathString,
IN PUNICODE_STRING FileNameString,
IN PUNICODE_STRING ExtensionString,
IN PUNICODE_STRING CallerBuffer,
IN OUT PUNICODE_STRING DynamicString OPTIONAL,
OUT PUNICODE_STRING *FullNameOut OPTIONAL,
OUT PSIZE_T FilePartSize OPTIONAL,
OUT PSIZE_T LengthNeeded OPTIONAL
);
*/
#define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
#define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok(ExceptionStatus == ExpectedStatus, "Exception %lx, expected %lx\n", ExceptionStatus, ExpectedStatus)
#define ok_eq_ulong(value, expected) ok((value) == (expected), #value " = %lu, expected %lu\n", value, expected)
#define ok_eq_hex(value, expected) ok((value) == (expected), #value " = 0x%lx, expected 0x%lx\n", value, expected)
#define ok_eq_pointer(value, expected) ok((value) == (expected), #value " = %p, expected %p\n", value, expected)
#define ok_eq_ustr(str1, str2) do { \
ok((str1)->Buffer == (str2)->Buffer, "Buffer modified\n"); \
ok((str1)->Length == (str2)->Length, "Length modified\n"); \
ok((str1)->MaximumLength == (str2)->MaximumLength, "MaximumLength modified\n"); \
} while (0)
#define InvalidPointer ((PVOID)0x0123456789ABCDEFULL)
START_TEST(RtlDosSearchPath_Ustr)
{
NTSTATUS ExceptionStatus;
NTSTATUS Status;
UNICODE_STRING PathString;
UNICODE_STRING FileNameString;
UNICODE_STRING ExtensionString;
UNICODE_STRING CallerBuffer;
UNICODE_STRING DynamicString;
PUNICODE_STRING FullNameOut;
UNICODE_STRING EmptyString;
SIZE_T FilePartSize;
SIZE_T LengthNeeded;
INT i;
RtlInitUnicodeString(&EmptyString, NULL);
/* NULLs */
StartSeh()
Status = RtlDosSearchPath_Ustr(0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
RtlInitUnicodeString(&FileNameString, NULL);
StartSeh()
Status = RtlDosSearchPath_Ustr(0, NULL, &FileNameString, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
RtlInitUnicodeString(&PathString, NULL);
StartSeh()
Status = RtlDosSearchPath_Ustr(0, &PathString, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
/* Minimal valid set of parameters */
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&FileNameString, NULL);
StartSeh()
Status = RtlDosSearchPath_Ustr(0, &PathString, &FileNameString, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, STATUS_NO_SUCH_FILE);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&FileNameString, &EmptyString);
/* Check valid flags */
for (i = 0; i < 32; i++)
{
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&FileNameString, NULL);
StartSeh()
Status = RtlDosSearchPath_Ustr(1 << i, &PathString, &FileNameString, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, i > 2 ? STATUS_INVALID_PARAMETER : STATUS_NO_SUCH_FILE);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&FileNameString, &EmptyString);
}
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&FileNameString, NULL);
StartSeh()
Status = RtlDosSearchPath_Ustr(7, &PathString, &FileNameString, NULL, NULL, NULL, NULL, NULL, NULL);
ok_eq_hex(Status, STATUS_NO_SUCH_FILE);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&FileNameString, &EmptyString);
/* Everything except PathString */
RtlInitUnicodeString(&FileNameString, NULL);
RtlInitUnicodeString(&ExtensionString, NULL);
RtlInitUnicodeString(&CallerBuffer, NULL);
RtlInitUnicodeString(&DynamicString, NULL);
FullNameOut = InvalidPointer;
FilePartSize = (SIZE_T)-1;
LengthNeeded = (SIZE_T)-1;
StartSeh()
Status = RtlDosSearchPath_Ustr(0,
NULL,
&FileNameString,
&ExtensionString,
&CallerBuffer,
&DynamicString,
&FullNameOut,
&FilePartSize,
&LengthNeeded);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&FileNameString, &EmptyString);
ok_eq_ustr(&ExtensionString, &EmptyString);
ok_eq_ustr(&CallerBuffer, &EmptyString);
ok_eq_ustr(&DynamicString, &EmptyString);
ok_eq_pointer(FullNameOut, NULL);
ok_eq_ulong(FilePartSize, 0);
ok_eq_ulong(LengthNeeded, 0);
/* Everything except FileNameString */
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&ExtensionString, NULL);
RtlInitUnicodeString(&CallerBuffer, NULL);
RtlInitUnicodeString(&DynamicString, NULL);
FullNameOut = InvalidPointer;
FilePartSize = (SIZE_T)-1;
LengthNeeded = (SIZE_T)-1;
StartSeh()
Status = RtlDosSearchPath_Ustr(0,
&PathString,
NULL,
&ExtensionString,
&CallerBuffer,
&DynamicString,
&FullNameOut,
&FilePartSize,
&LengthNeeded);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&ExtensionString, &EmptyString);
ok_eq_ustr(&CallerBuffer, &EmptyString);
ok_eq_ustr(&DynamicString, &EmptyString);
ok_eq_pointer(FullNameOut, NULL);
ok_eq_ulong(FilePartSize, 0);
ok_eq_ulong(LengthNeeded, 0);
/* Passing CallerBuffer and DynamicString, but not FullNameOut is invalid */
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&FileNameString, NULL);
RtlInitUnicodeString(&ExtensionString, NULL);
RtlInitUnicodeString(&CallerBuffer, NULL);
RtlInitUnicodeString(&DynamicString, NULL);
FullNameOut = InvalidPointer;
FilePartSize = (SIZE_T)-1;
LengthNeeded = (SIZE_T)-1;
StartSeh()
Status = RtlDosSearchPath_Ustr(0,
&PathString,
&FileNameString,
&ExtensionString,
&CallerBuffer,
&DynamicString,
NULL,
&FilePartSize,
&LengthNeeded);
ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&FileNameString, &EmptyString);
ok_eq_ustr(&ExtensionString, &EmptyString);
ok_eq_ustr(&CallerBuffer, &EmptyString);
ok_eq_ustr(&DynamicString, &EmptyString);
ok_eq_ulong(FilePartSize, 0);
ok_eq_ulong(LengthNeeded, 0);
/* All parameters given */
RtlInitUnicodeString(&PathString, NULL);
RtlInitUnicodeString(&FileNameString, NULL);
RtlInitUnicodeString(&ExtensionString, NULL);
RtlInitUnicodeString(&CallerBuffer, NULL);
RtlInitUnicodeString(&DynamicString, NULL);
FullNameOut = InvalidPointer;
FilePartSize = (SIZE_T)-1;
LengthNeeded = (SIZE_T)-1;
StartSeh()
Status = RtlDosSearchPath_Ustr(0,
&PathString,
&FileNameString,
&ExtensionString,
&CallerBuffer,
&DynamicString,
&FullNameOut,
&FilePartSize,
&LengthNeeded);
ok_eq_hex(Status, STATUS_NO_SUCH_FILE);
EndSeh(STATUS_SUCCESS);
ok_eq_ustr(&PathString, &EmptyString);
ok_eq_ustr(&FileNameString, &EmptyString);
ok_eq_ustr(&ExtensionString, &EmptyString);
ok_eq_ustr(&CallerBuffer, &EmptyString);
ok_eq_ustr(&DynamicString, &EmptyString);
ok_eq_pointer(FullNameOut, NULL);
ok_eq_ulong(FilePartSize, 0);
ok_eq_ulong(LengthNeeded, 0);
}