diff --git a/kmtests/CMakeLists.txt b/kmtests/CMakeLists.txt index 6708c966169..faa38ae6dae 100644 --- a/kmtests/CMakeLists.txt +++ b/kmtests/CMakeLists.txt @@ -21,12 +21,18 @@ list(APPEND KMTEST_DRV_SOURCE add_library(kmtest_drv SHARED ${KMTEST_DRV_SOURCE}) set_module_type(kmtest_drv kernelmodedriver) -target_link_libraries(kmtest_drv ${PSEH_LIB}) +target_link_libraries(kmtest_drv kmtest_printf ${PSEH_LIB}) add_importlibs(kmtest_drv ntoskrnl hal) set_property(TARGET kmtest_drv PROPERTY COMPILE_DEFINITIONS KMT_KERNEL_MODE) add_cd_file(TARGET kmtest_drv DESTINATION reactos/system32/drivers FOR all) +add_library(kmtest_printf + kmtest_drv/printf_stubs.c + ${REACTOS_SOURCE_DIR}/lib/sdk/crt/printf/streamout.c) +set_property(TARGET kmtest_printf PROPERTY COMPILE_DEFINITIONS _LIBCNT_ _USER32_WSPRINTF wctomb=KmtWcToMb) +set_property(TARGET kmtest_printf PROPERTY INCLUDE_DIRECTORIES ${REACTOS_SOURCE_DIR}/lib/sdk/crt/include) + # # kmtest.exe loader application # diff --git a/kmtests/include/kmt_test.h b/kmtests/include/kmt_test.h index 49460124e97..032893b20df 100644 --- a/kmtests/include/kmt_test.h +++ b/kmtests/include/kmt_test.h @@ -8,7 +8,9 @@ #ifndef _KMTEST_TEST_H_ #define _KMTEST_TEST_H_ -typedef void KMT_TESTFUNC(void); +#include + +typedef VOID KMT_TESTFUNC(VOID); typedef struct { @@ -74,6 +76,12 @@ static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Len KmtMemCpy(&Buffer->LogBuffer[OldLength], String, Length); } +#ifdef KMT_KERNEL_MODE +INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments); +#elif defined KMT_USER_MODE +#define KmtVSNPrintF vsnprintf +#endif /* defined KMT_USER_MODE */ + #endif /* defined KMT_DEFINE_TEST_FUNCTIONS */ #endif /* !defined _KMTEST_TEST_H_ */ diff --git a/kmtests/kmtest_drv/printf_stubs.c b/kmtests/kmtest_drv/printf_stubs.c new file mode 100644 index 00000000000..16564256db5 --- /dev/null +++ b/kmtests/kmtest_drv/printf_stubs.c @@ -0,0 +1,40 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Kernel-Mode Test Suite stub functions for any-IRQL vsnprintf + * PROGRAMMER: Thomas Faber + */ + +#undef wctomb +#include +#include +#include + +int __cdecl KmtWcToMb(char *mbchar, wchar_t wchar) +{ + *mbchar = wchar; + return 1; +} + +int __cdecl streamout(FILE *stream, const char *format, va_list argptr); + +int __cdecl KmtVSNPrintF(char *buffer, size_t count, const char *format, va_list argptr) +{ + int result; + FILE stream; + + stream._base = (char *)buffer; + stream._ptr = stream._base; + stream._charbuf = 0; + stream._cnt = count; + stream._bufsiz = 0; + stream._flag = _IOSTRG | _IOWRT; + stream._tmpfname = 0; + + result = streamout(&stream, format, argptr); + + /* Only zero terminate if there is enough space left */ + if (stream._cnt) *(char *)stream._ptr = '\0'; + + return result; +}