reactos/modules/rostests/apitests/kernel32/GetModuleFileName.c
2017-12-13 13:48:26 +01:00

128 lines
3.4 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPLv2+ - See COPYING in the top level directory
* PURPOSE: Test for GetModuleFileName
* PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
*/
#include "precomp.h"
#include <shlwapi.h>
static
VOID
StartChild(char **argv)
{
BOOL Success;
WCHAR Path[MAX_PATH];
PWSTR FileName;
PWSTR Slash;
WCHAR CommandLine[MAX_PATH];
STARTUPINFOW StartupInfo;
PROCESS_INFORMATION ProcessInfo;
DWORD Ret;
int Length;
Length = MultiByteToWideChar(CP_ACP,
0,
argv[0],
-1,
Path,
sizeof(Path) / sizeof(WCHAR));
ok(Length > 0, "Length = %d\n", Length);
FileName = wcsrchr(Path, '\\');
Slash = wcsrchr(Path, L'/');
if (Slash && (!FileName || Slash > FileName))
FileName = Slash;
if (FileName)
{
/* It's an absolute path. Set it as current dir and get the file name */
FileName++;
FileName[-1] = L'\0';
Success = SetCurrentDirectoryW(Path);
ok(Success == TRUE, "SetCurrentDirectory failed for path '%ls'\n", Path);
trace("Starting '%ls' in path '%ls'\n", FileName, Path);
}
else
{
FileName = Path;
trace("Starting '%ls', which is already relative\n", FileName);
}
swprintf(CommandLine, L"\"%ls\" GetModuleFileName relative", FileName);
RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
Success = CreateProcessW(FileName,
CommandLine,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&StartupInfo,
&ProcessInfo);
if (!Success)
{
skip("CreateProcess failed with %lu\n", GetLastError());
return;
}
CloseHandle(ProcessInfo.hThread);
Ret = WaitForSingleObject(ProcessInfo.hProcess, 30 * 1000);
ok(Ret == WAIT_OBJECT_0, "WaitForSingleObject returns %lu\n", Ret);
CloseHandle(ProcessInfo.hProcess);
}
static
VOID
TestGetModuleFileNameA(VOID)
{
CHAR Buffer[MAX_PATH];
DWORD Length;
BOOL Relative;
Length = GetModuleFileNameA(NULL, Buffer, sizeof(Buffer));
ok(Length != 0, "Length = %lu\n", Length);
ok(Length < sizeof(Buffer), "Length = %lu\n", Length);
ok(Buffer[Length] == 0, "Buffer not null terminated\n");
Relative = PathIsRelativeA(Buffer);
ok(Relative == FALSE, "GetModuleFileNameA returned relative path: %s\n", Buffer);
}
static
VOID
TestGetModuleFileNameW(VOID)
{
WCHAR Buffer[MAX_PATH];
DWORD Length;
BOOL Relative;
Length = GetModuleFileNameW(NULL, Buffer, sizeof(Buffer) / sizeof(WCHAR));
ok(Length != 0, "Length = %lu\n", Length);
ok(Length < sizeof(Buffer) / sizeof(WCHAR), "Length = %lu\n", Length);
ok(Buffer[Length] == 0, "Buffer not null terminated\n");
Relative = PathIsRelativeW(Buffer);
ok(Relative == FALSE, "GetModuleFileNameW returned relative path: %ls\n", Buffer);
}
START_TEST(GetModuleFileName)
{
int argc;
char **argv;
argc = winetest_get_mainargs(&argv);
if (argc < 3)
StartChild(argv);
else
{
TestGetModuleFileNameA();
TestGetModuleFileNameW();
}
}